{"version":3,"file":"index.es.min.js","sources":["../../../packages/helpers/src/props.helpers.js","../../../packages/components/src/card-labels/cardLabels.js","../../../packages/components/src/constants.mjs","../../../packages/components/src/nespressoElement/nespressoElement.js","../../../packages/helpers/src/viewport.helpers.ts","../../../packages/helpers/src/utils.ts","../../../packages/components/src/sku/constants.mjs","../../../packages/components/src/sku/fragments/heading.js","../../../packages/components/src/sku/fragments/headline.js","../../../packages/components/src/sku/fragments/labelTechnology.js","../../../packages/components/src/sku/fragments/labelRange.js","../../../packages/helpers/src/catalog.js","../../../packages/helpers/src/getCurrency.js","../../../packages/components/src/sku/fragments/strikethroughPrice.js","../../../packages/components/src/sku/fragments/price.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","../../../services/plp/services.js","../../../packages/components/src/sku-coffee/services/index.js","../../../packages/components/src/sku/services/index.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.coffee.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.machine.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.accessory.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.giftCard.dto.js","../../../packages/components/src/sku-quick-view/shared-quick-view-types.ts","../../../packages/components/src/sku-quick-view/shared-quick-view.ts","../../../packages/helpers/src/assets/js/eventDispatch.js","../../../packages/helpers/src/events.helpers.ts","../../../packages/helpers/src/gtmEvents.js","../../../packages/components/src/sku/sku.js","../../../packages/components/src/sku/fragments/setCardTheme.js","../../../packages/components/src/sku/fragments/labels.js","../../../packages/helpers/src/logos.helpers.js","../../../packages/components/src/sku/fragments/image.js","../../../packages/components/src/sku/fragments/quickView.js","../../../packages/components/src/sku-coffee/fragments/bundle.js","../../../node_modules/classnames/index.js","../../../node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","../../../packages/components/src/compatibility/CompatibilityButton/CompatibilityButton.tsx","../../../packages/components/src/compatibility/CompatibilityModal/modalUtils.ts","../../../packages/apps/src/components/ModalDrawer/ModalDrawer.tsx","../../../packages/apps/src/utils/isOldSafari.ts","../../../packages/components/src/compatibility/CompatibilityModal/CompatibilityModal.tsx","../../../node_modules/preact-custom-element/dist/preact-custom-element.esm.js","../../../packages/helpers/src/asWebComponent.ts","../../../packages/components/src/compatibility/compatibility-section/compatibility-section.tsx","../../../packages/components/src/sku-coffee/fragments/heading.js","../../../packages/components/src/sku-coffee/fragments/sleeve.js","../../../packages/components/src/sku-coffee/sku-coffee.js","../../../packages/components/src/sku-coffee/fragments/skuQuickViewLink.js","../../../packages/components/src/sku-coffee/fragments/intensity.js","../../../packages/components/src/sku-coffee/fragments/boxTube.js","../../../packages/helpers/src/productCompatibility.ts","../../../packages/components/src/sku-coffee/fragments/packFormat.js","../../../packages/components/src/sku-coffee/fragments/priceCapsule.js","../../../packages/components/src/intensity/intensity.js","../../../packages/helpers/src/assets/js/eventBus.js","../../../packages/components/src/cta/cta.js","../../../packages/components/src/img/js/constants.js","../../../packages/components/src/img/img.js","../../../packages/components/src/link/link.js","../../../packages/helpers/src/assets/js/viewportTracking.js","../../../packages/helpers/src/assets/js/zoneTracking.js","../../../packages/components/src/container/container.js","../../../packages/components/src/chip/chip.js","../../../packages/helpers/src/assets/js/scopedKeyboardNav.js","../../../packages/components/src/dropdown/dropdown.js","../../../packages/helpers/src/assets/js/productTracking.js","../../../packages/components/src/add-to-cart/addToCart.js","../../../packages/components/src/plp-sticky-bar/plp-sticky-bar.js","../../../packages/helpers/src/swipeEvents.ts","../../../packages/components/src/popin/components/overlay.js","../../../packages/components/src/popin/popin.js","../../../packages/components/src/card-logos/cardLogos.js","../../../packages/components/src/slider-menu/js/constants.js","../../../packages/components/src/slider-menu/js/SliderMenuLib.js","../../../packages/components/src/slider-menu/slider-menu.js","../../../packages/components/src/slider-natural/slider-natural.js","../../../packages/helpers/src/contrast.helpers.js","../../../packages/helpers/src/useragent.helpers.ts","../../../packages/helpers/src/refs.helpers.js","../../../packages/helpers/src/impolicy.js","../../../packages/components/src/navigation-bubbles/components/bubble/js/constants.js","../../../packages/components/src/navigation-bubbles/components/bubble/bubble.js","../../../packages/helpers/src/intersection-observer.service.js","../../../packages/helpers/src/deferred.js","../../../packages/helpers/src/scrollTo.ts","../../../packages/components/src/navigation-bubbles/data/constants.js","../../../packages/components/src/navigation-bubbles/navigation-bubbles.js","../../../packages/components/src/navigation-bubbles/services/events.manager.js","../../../services/plp-data/src/prod/index.js","../../../packages/apps/src/plp-core/config/experiments.ts","../../../packages/apps/src/plp-core/config/constants.js","../../../packages/apps/src/plp-core/store/plp.data.js","../../../packages/apps/src/plp-core/store/plp.actions.js","../../../services/crema-service/src/Store.ts","../../../services/crema-service/src/CremaService.ts","../../../packages/apps/src/plp-core/store/plp.events.js","../../../packages/apps/src/plp-core/helpers/tracking.js","../../../packages/apps/src/plp-core/store/index.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.mobileDropDown.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.content.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.footer.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-popin.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-cta.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-links.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-sort.js","../../../packages/apps/src/plp-core/components/filter/_plp.filter.main.js","../../../packages/components/src/sticky/sticky.service.js","../../../packages/apps/src/plp-core/components/navigation/plp.bar.js","../../../packages/apps/src/plp-core/components/navigation/_plp.navigation.main.js","../../../packages/apps/src/plp-core/components/results/plp.results-chip.js","../../../packages/apps/src/plp-core/components/results/plp.results-header.js","../../../packages/apps/src/plp-core/components/plp.product.js","../../../packages/apps/src/plp-core/components/results/_plp.results.main.js","../../../packages/apps/src/plp-core/components/products/_plp.products.main.js","../../../packages/apps/src/plp-core/components/products/plp.category-products.js","../../../packages/apps/src/plp-core/plp.app.js","../../../packages/apps/src/plp-core/models/Category.js","../../../packages/apps/src/plp/models/coffee.category.js","../../../packages/apps/src/plp-core/models/Product.js","../../../packages/apps/src/plp/models/coffee.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-core/helpers/getMinMaxIntensity.js","../../../packages/helpers/src/cupSizeIcons.js","../../../packages/apps/src/plp-core/helpers/getCupSizesDetails.js","../../../packages/apps/src/plp/dataTransform/plp-coffee.dto.js","../../../packages/helpers/src/notesIcons.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-core/filter/createCategoriesFilter.js","../../../packages/apps/src/plp/dataTransform/plp-coffee.filterIntensity.dto.js","../../../packages/apps/src/plp/dataTransform/plp-coffee.filters.dto.js","../../../packages/apps/src/plp/dataTransform/plp-coffee.sort.dto.js","../../../packages/apps/src/plp-core/store/plp.states.js","../../../packages/apps/src/plp/plp-coffee.component.js"],"sourcesContent":["const getData = attributes => attributes.find(attribute => attribute.nodeName === 'data')\n\nconst createProps = attributes => {\n const data = getData([...attributes])\n const props = [...attributes]\n .filter(attribute => attribute.nodeName !== 'data')\n .reduce((all, attr) => {\n return { ...all, [attr.nodeName]: attr.nodeValue }\n }, {})\n\n if (isNil(data)) {\n return props\n }\n\n try {\n return { ...props, ...JSON.parse(data.nodeValue) }\n } catch (error) {\n console.log('ERROR: No data', error, data?.nodeValue)\n }\n}\n\nconst isNil = obj => obj === undefined || obj === null\n\nexport const parseBool = value => (!value || value === 'false' ? false : true)\n\nexport default createProps\n","import createProps from '@kissui/helpers/src/props.helpers'\n\nclass CardLabels extends HTMLElement {\n constructor() {\n super()\n this.props = {}\n this.labels = []\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n }\n\n render() {\n const { labels = [], direction = 'column' } = this.props\n this.classList.add(`${direction === 'row' ? 'direction-row' : 'direction-' + direction}`)\n\n if (labels.length === 0) {\n return ''\n }\n this.labels = labels\n\n this.innerHTML = `${this.renderLabels()}`\n }\n\n renderLabels() {\n return this.labels\n .map(label => {\n const { name = '', bgColor = '', color = '' } = label\n return `<mark class=\"t-3xs-500-caps-sl\"\n ${\n bgColor &&\n color &&\n `style=\"background: ${bgColor}; color: ${color}\"`\n }>\n <span>${name}</span>\n </mark>`\n })\n .join('')\n }\n}\n\ncustomElements.get('nb-card-labels') || customElements.define('nb-card-labels', CardLabels)\n\nexport default CardLabels\n","export const MAX_WIDTH_CONTAINER = 1160\n\nexport const BREAKPOINT_XL = 1920\nexport const BREAKPOINT_TABLET = 1024\nexport const BREAKPOINT_L = 996\nexport const BREAKPOINT_M = 768\nexport const BREAKPOINT_S = 750\nexport const BREAKPOINT_XS = 375\n\nexport const CTA_PRIMARY = 'primary'\nexport const CTA_PRIMARY_TRANSPARENT = 'primary_transparent'\nexport const CTA_SUBTLE = 'subtle'\nexport const CTA_LINK = 'link'\nexport const CTA_LINK_UNDERLINE = 'link-underline'\nexport const CTA_LINK_GOLD = 'link-gold'\nexport const CTA_LINK_ADD_TO_CART_SMALL = 'AddToCart_small'\nexport const CTA_LINK_ADD_TO_CART_LARGE = 'AddToCart_large'\n\nexport const EVENT_TAB_CHANGE = 'EVENT_TAB_CHANGE'\n\nexport const EVENT_VIDEO = 'WEB_COMPONENT_VIDEO'\nexport const EVENT_POPIN_OPEN = 'WEB_COMPONENT_POPIN_OPEN'\nexport const EVENT_POPIN_OPENED = 'WEB_COMPONENT_POPIN_OPENED'\nexport const EVENT_POPIN_CLOSE = 'WEB_COMPONENT_POPIN_CLOSE'\nexport const EVENT_POPIN_CLOSED = 'WEB_COMPONENT_POPIN_CLOSED'\nexport const EVENT_POPIN_CLOSE_CLICK = 'WEB_COMPONENT_POPIN_CLOSE_CLICK'\nexport const EVENT_POPIN_KEY_DOWN = 'keydown'\nexport const EVENT_POPIN_FORM_TOGGLE_TITLE = 'WEB_COMPONENT_POPIN_FORM_TOGGLE_TITLE'\nexport const EVENT_CTA_CLICK = 'WEB_COMPONENT_CTA_CLICK'\nexport const EVENT_HERO_REORDER_OPEN = 'WEB_COMPONENT_HERO_REORDER_OPEN'\nexport const EVENT_HERO_REORDER_CLOSE = 'WEB_COMPONENT_HERO_REORDER_CLOSE'\nexport const EVENT_QUICKVIEW_OPEN = 'WEB_COMPONENT_QUICKVIEW_OPEN'\nexport const EVENT_QS_OPEN = 'WEB_COMPONENT_QS_OPEN'\nexport const EVENT_QS_OPENED = 'WEB_COMPONENT_QS_OPENED'\nexport const EVENT_QS_CLOSE = 'WEB_COMPONENT_QS_CLOSE'\nexport const EVENT_QS_CLOSED = 'WEB_COMPONENT_QS_CLOSED'\nexport const EVENT_QS_CLOSE_CLICK = 'WEB_COMPONENT_QS_CLOSE_CLICK'\nexport const EVENT_QS_KEY_DOWN = 'keydown'\nexport const EVENT_ADD_TO_CART = 'WEB_COMPONENT_ADD_TO_CART'\nexport const EVENT_CART_UPDATED = 'WEB_COMPONENT_CART_UPDATED'\nexport const EVENT_VIDEO_TOGGLE = 'WEB_COMPONENT_VIDEO_TOGGLE'\nexport const VIDEO_ON_HOVER = 'VIDEO_ON_HOVER'\nexport const VIDEO_ON_OUT = 'VIDEO_ON_OUT'\nexport const EVENT_DETAIL_OPEN = 'WEB_COMPONENT_DETAIL_OPEN'\nexport const EVENT_SLIDER_READY = 'WEB_COMPONENT_SLIDER_READY'\nexport const EVENT_SLIDE_CHANGE = 'WEB_COMPONENT_SLIDE_CHANGE'\nexport const EVENT_OVERLAY_OPEN = 'WEB_COMPONENT_OVERLAY_OPEN'\nexport const EVENT_OVERLAY_CLOSE = 'WEB_COMPONENT_OVERLAY_CLOSE'\nexport const EVENT_OVERLAY_CLICKED = 'WEB_COMPONENT_OVERLAY_CLICKED'\nexport const EVENT_OPEN_PRODUCT_AR_CLICKED = 'OPEN_PRODUCT_AR_CLICKED'\nexport const EVENT_SORT_BY_CHANGE = 'WEB_COMPONENT_SORT_BY_CHANGE'\n\nexport const EVENT_BUBBLE_SELECTED = 'EVENT_BUBBLE_SELECTED'\nexport const EVENT_RECO_TOOL_OPTION_CLICKED = 'EVENT_RECO_TOOL_OPTION_CLICKED'\nexport const WEB_COMPONENT_PROJECTS_LOADED = 'WEB_COMPONENT_PROJECTS_LOADED'\nexport const WEB_COMPONENT_ANCHOR_LOADED = 'WEB_COMPONENT_ANCHOR_LOADED'\n\nexport const EVENT_SWIPED_UP = 'swiped-up'\nexport const EVENT_SWIPED_DOWN = 'swiped-down'\nexport const EVENT_SWIPED_LEFT = 'swiped-left'\nexport const EVENT_SWIPED_RIGHT = 'swiped-right'\n\nexport const EVENT_HEADER_POSITION_CHANGED = 'EVENT_HEADER_POSITION_CHANGED'\n\nexport const keys = { ESC: 'Escape' }\n\nexport const ADD_TO_CART_MODIFIER_MINI = 'mini'\nexport const ADD_TO_CART_MODIFIER_DEFAULT = ADD_TO_CART_MODIFIER_MINI\n\nexport const COFFEE_ORIGINAL = 'original'\nexport const COFFEE_VERTUO = 'vertuo'\nexport const COFFEE_PRO = 'pro'\nexport const COFFEE_OL = 'OL'\nexport const COFFEE_VL = 'VL'\nexport const INTENSITY_MAX_OL = 14\nexport const INTENSITY_MAX_VL = 12\nexport const DEFAULT_BUBBLE_ICON = ''\n\nexport const NUMBER_PRODUCTS_SLIDER = 8\nexport const NUMBER_FEATURES_PDP = 8\n\nexport const ALIGNMENT = ['center', 'left', 'right']\nexport const POSITION = ['top', 'right', 'bottom', 'left']\nexport const TRANSLATION_ADD_TO_CART = 'Add to cart'\nexport const TRANSLATION_UPDATE_BASKET = 'Update basket'\n\nexport const TIME_INSTANT = 1\nexport const TIME_FAST = 300\nexport const TIME_MEDIUM = 600\nexport const TIME_SLOW = 1200\n\nexport const APP_APPLE_LINK = {\n default: 'https://apps.apple.com/us/app/nespresso/id342879434',\n us: 'https://apps.apple.com/us/app/nespresso-new/id1609639566',\n uk: 'https://apps.apple.com/gb/app/nespresso-new/id1609639566'\n}\nexport const APP_ANDROID_LINK =\n 'https://play.google.com/store/apps/details?id=com.nespresso.activities'\nexport const APP_HUAWEI_LINK = 'https://appgallery.huawei.com/app/C102571517'\n\nexport const SRC_PAGE_PLP = 'plp'\nexport const SRC_PAGE_PDP = 'pdp'\n\nexport const PLP_TYPE_COFFEE = 'coffee'\nexport const PLP_TYPE_MACHINE = 'machine'\nexport const PLP_TYPE_ACCESSORY = 'accessory'\nexport const CALLEO_API_DOMAIN = 'https://www.contact.nespresso.com/'\n\n// SCSS RELATED\n// Todo : should be shared by JS and SCSS\nexport const BROWSER_CONTEXT = 16 // 1rem = 16px\nexport const COLOR_WHITE_1000 = '#FFFFFF' // Do not change for #FFF shortcut, it will break slider-natural gradients !\n\nexport const CONTRAST_DARK = 'dark'\nexport const CONTRAST_LIGHT = 'light'\n\nexport const B2B_CONTACT_FORM_POPIN_ID = 'b2b-contact-form-popin-id'\nexport const B2B_CONTACT_FORM_POPIN_SRC_SEARCH = 'coveo-search'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO = 'sku-main-info'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO_AUTO = 'sku-main-info-auto'\n\nexport const ASPECT_RATIO_16_9 = '16/9'\nexport const ASPECT_RATIO_1_1 = '1/1'\n\nexport const NESPRESSO_PRODUCTION_DOMAIN = 'https://www.nespresso.com'\nexport const NESPRESSO_ROLLOUT_DOMAIN = 'https://nc2-env-rollout.nespresso.com'\n\nexport const EVENT_QUIZ_ON_GO_BACK = 'WEB_COMPONENT_EVENT_QUIZ_ON_GO_BACK'\nexport const EVENT_QUIZ_SUBMIT = 'WEB_COMPONENT_EVENT_QUIZ_SUBMIT'\n","export class NespressoElement extends HTMLElement {\n constructor() {\n super()\n this.template = ''\n }\n\n connectedCallback() {\n this.props = this._createProps()\n this.onStart?.()\n this.loadTemplate()\n this.onReady?.()\n }\n\n /**\n * Load the attributes and create the props object\n * @returns {any}\n * @private\n */\n _createProps(forceAttributes = null) {\n const attributes = forceAttributes || this.attributes\n\n const getData = attr => attr.find(attribute => attribute.nodeName === 'data')\n\n let props\n try {\n props = [...attributes].reduce((all, attr) => {\n return { ...all, [attr.nodeName]: attr.nodeValue }\n }, {})\n\n const data = getData([...attributes])\n\n if (data === undefined || data === null) {\n return props\n }\n\n return { ...props, ...JSON.parse(data.nodeValue) }\n } catch (error) {\n console.log(this.nodeName, 'ERROR: No data', error)\n }\n }\n\n /**\n * Render by DOM diff\n */\n render(force = false) {\n if (force) {\n // todo review the performance of this\n this.innerHTML = ''\n }\n /**\n * Convert a template string into HTML DOM nodes\n * @param {String} str The template string\n * @return {Node} The template HTML\n */\n const _stringToHTML = str => {\n const parser = new DOMParser()\n const doc = parser.parseFromString(str, 'text/html')\n return doc.body\n }\n\n /**\n * Compare the template to the UI and make updates\n * @param {Node} template The template HTML\n * @param {Node} elem The UI HTML\n */\n const _diff = (template, elem) => {\n /**\n * Get the type for a node\n * @param {Node} node The node\n * @return {String} The type\n */\n const _getNodeType = node => {\n if (node.nodeType === 3) {\n return 'text'\n }\n if (node.nodeType === 8) {\n return 'comment'\n }\n return node.tagName.toLowerCase()\n }\n\n /**\n * Get the content from a node\n * @param {Node} node The node\n * @return {String} The type\n */\n const _getNodeContent = node => {\n if (node.childNodes && node.childNodes.length > 0) {\n return null\n }\n return node.textContent\n }\n\n // Get arrays of child nodes\n const domNodes = Array.prototype.slice.call(elem.childNodes)\n const templateNodes = Array.prototype.slice.call(template.childNodes)\n\n // If extra elements in DOM, remove them\n var count = domNodes.length - templateNodes.length\n if (count > 0) {\n for (; count > 0; count--) {\n domNodes[domNodes.length - count].parentNode.removeChild(\n domNodes[domNodes.length - count]\n )\n }\n }\n\n // Diff each item in the templateNodes\n templateNodes.forEach(function (node, index) {\n // If element doesn't exist, create it\n if (!domNodes[index]) {\n elem.appendChild(node.cloneNode(true))\n return\n }\n\n // If element is not the same type, replace it with new element\n if (_getNodeType(node) !== _getNodeType(domNodes[index])) {\n domNodes[index].parentNode.replaceChild(node.cloneNode(true), domNodes[index])\n return\n }\n\n // If content is different, update it\n const templateContent = _getNodeContent(node)\n if (templateContent && templateContent !== _getNodeContent(domNodes[index])) {\n domNodes[index].textContent = templateContent\n }\n\n // If target element should be empty, wipe it\n if (domNodes[index].childNodes.length > 0 && node.childNodes.length < 1) {\n domNodes[index].innerHTML = ''\n return\n }\n\n // If element is empty and shouldn't be, build it up\n // This uses a document fragment to minimize reflows\n if (domNodes[index].childNodes.length < 1 && node.childNodes.length > 0) {\n const fragment = document.createDocumentFragment()\n _diff(node, fragment)\n domNodes[index].appendChild(fragment)\n return\n }\n\n // If there are existing child elements that need to be modified, diff them\n if (node.childNodes.length > 0) {\n _diff(node, domNodes[index])\n }\n })\n }\n\n // todo - add support to reactivity\n // this.template(this.state)\n const templateHTML = _stringToHTML(this.template)\n _diff(templateHTML, this)\n }\n\n /**\n * Set the HTML to be used in the template\n * @param {String} html The HTML to use\n *\n * This function is overwritten by the extended class to set the HTML\n *\n */\n loadTemplate(template = '', force = false) {\n this.template = template === '' ? this.template : `${template}`\n this.render(force)\n }\n\n disconnectedCallback() {\n this.onDestroy?.()\n }\n}\n\ncustomElements.get('nb-nespresso-element') ||\n customElements.define('nb-nespresso-element', NespressoElement)\n","import { BREAKPOINT_M, BREAKPOINT_TABLET } from '@kissui/components'\n\nconst viewport = () => {\n const lt = (ref: number) => {\n return window.innerWidth < ref\n }\n\n return {\n get is() {\n const { innerWidth: vw, devicePixelRatio } = window\n return {\n mobile: vw < BREAKPOINT_M,\n mobile_tablet: vw < BREAKPOINT_TABLET,\n tablet: vw >= BREAKPOINT_M && vw < BREAKPOINT_TABLET,\n desktop: vw >= BREAKPOINT_TABLET && devicePixelRatio <= 1,\n retina: vw >= BREAKPOINT_TABLET && devicePixelRatio > 1\n }\n },\n lt\n }\n}\n\nconst helper = viewport()\n\nexport default helper\n","export { waitForSelector } from './waitForSelector'\n\nexport const constants = {\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n ESC: 27,\n SPACE: 32,\n ENTER: 13,\n TAB: 9\n}\n\nexport function capitalize(s = '') {\n return s[0].toUpperCase() + s.slice(1)\n}\n\nexport const convertToCamelCase = (str: string): string => {\n const arr = str.match(/[a-z]+|\\d+/gi)\n if (!arr) { return str }\n return arr.map((m, i) => {\n let low = m.toLowerCase()\n if (i !== 0) {\n low = low.split('').map((s, k) => (k === 0 ? s.toUpperCase() : s)).join(\"\")\n }\n return low\n }).join(\"\")\n}\n\nexport function slug(s = '') {\n return s\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, '-') // Replace spaces with -\n .replace(/[^\\w-]+/g, '') // Remove all non-word chars\n .replace(/--+/g, '-') // Replace multiple - with single -\n}\n\nexport function pxToEm(target: number, stripedInnerFontSize = 1) {\n return target / 14 / stripedInnerFontSize + 'em'\n}\n\nexport function percent(target: number) {\n return target + '%'\n}\n\nexport function parseHTML(str: string) {\n const tmp = document.implementation.createHTMLDocument('')\n tmp.body.innerHTML = str\n return tmp.body.childNodes\n}\n\nexport function stripHTML(str: string) {\n const tmp = document.implementation.createHTMLDocument('')\n tmp.body.innerHTML = str\n return (tmp.body.textContent ?? \"\").replace(RegExp('[\\\\s|\\'|\"]', 'g'), '')\n}\n\nexport function makeId(length: number) {\n var result = ''\n var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n var charactersLength = characters.length\n for (var i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength))\n }\n return result\n}\n\nexport function removeEmptyValues(obj: { [key: string]: any }): { [key: string]: any } {\n const findText = [\n 'Default campaign ID (tracking missing in Page Builder export)',\n 'Default campaign name (tracking missing in Page Builder export)',\n 'promoname', \n 'promoid', \n 'promocreative', \n 'undefined'\n ];\n \n for (let key in obj) {\n const value = obj[key];\n \n if (value === null || value === undefined || value === '') {\n delete obj[key];\n continue;\n }\n \n if (typeof value === 'string') {\n for (const text of findText) {\n if (value.includes(text)) {\n delete obj[key];\n break;\n }\n }\n }\n }\n \n return obj;\n}\n\nexport function makeHash(str: string) {\n var hash = 0,\n i,\n chr\n if (!str) {\n return hash\n }\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i)\n hash = (hash << 5) - hash + chr\n hash |= 0 // Convert to 32bit integer\n }\n return 'id-' + hash\n}\n\nexport function getHashLink(link: string) {\n let linkHash = link\n let linkNoHash = link\n if (link.indexOf('#') !== -1) {\n linkNoHash = link.replace('#', '')\n } else {\n linkHash = '#' + link\n }\n\n return { linkNoHash, linkHash }\n}\n\nexport function lazyLoad(node: Element, attribute: string, value: any, url: string) {\n const CLASSNAME_OUT_OF_SCREEN = 'lazy-load'\n const CLASSNAME_IN_SCREEN = 'lazy-loaded'\n const CLASSNAME_ON_ERROR = 'lazy-loaded-error'\n\n const isOldIOS = () => {\n var agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n }\n return false\n }\n\n const inViewPort = (attribute: string, value: any) => {\n node.setAttribute(attribute, value)\n\n const cb = () => node.classList.add(CLASSNAME_IN_SCREEN)\n\n if (url) {\n const img = new Image()\n img.src = url\n img.onload = cb\n img.onerror = () => {\n cb()\n node.classList.add(CLASSNAME_ON_ERROR)\n throw new Error(`Image ${url} cannot be loaded`)\n }\n\n return\n }\n\n cb()\n }\n\n if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n inViewPort(attribute, value)\n } else {\n if ('IntersectionObserver' in window) {\n node.classList.add(CLASSNAME_OUT_OF_SCREEN)\n let lazyBackgroundObserver = new IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n inViewPort(attribute, value)\n lazyBackgroundObserver.unobserve(entry.target)\n }\n })\n })\n lazyBackgroundObserver.observe(node)\n } else {\n inViewPort(attribute, value)\n }\n }\n}\n\nexport function lazyLoadCallback(node: Element, cb: () => void) {\n const isOldIOS = () => {\n var agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n }\n return false\n }\n\n if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n cb()\n } else {\n if ('IntersectionObserver' in window) {\n let lazyBackgroundObserver = new IntersectionObserver(\n function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n cb()\n lazyBackgroundObserver.unobserve(entry.target)\n }\n })\n },\n { rootMargin: '150% 0px' }\n )\n lazyBackgroundObserver.observe(node)\n }\n }\n}\n\n// Debounce\nexport function debounce<T>(func: (v: T) => void, time = 100) {\n let timer: number\n return function (event: T) {\n if (timer) {\n window.clearTimeout(timer)\n }\n timer = window.setTimeout(func, time, event)\n }\n}\n\n// isIE - to check for internet explorer\nexport function isIE() {\n let ua = window.navigator.userAgent,\n isIE = /MSIE|Trident/.test(ua)\n\n return isIE\n}\n\n// Load external script\nexport const loadExternalScript = ({\n src,\n callback = null,\n async = false,\n defer = false,\n module = false,\n id = ''\n}: {\n src: string;\n callback: null | GlobalEventHandlers[\"onload\"]\n module: boolean,\n defer: boolean,\n async: boolean,\n id: string\n}) => {\n const script = document.createElement('script')\n script.type = module ? 'module' : 'text/javascript'\n script.src = src\n id ? (script.id = id) : false // add id attribute only if passed\n if (typeof callback === 'function') {\n script.onload = callback\n }\n script.async = async\n script.defer = defer\n document.body.appendChild(script)\n}\n\n// Load external css\nexport const loadExternalCss = ({ src }: { src: string }) => {\n const script = document.createElement('link')\n script.rel = 'stylesheet'\n script.href = src\n document.body.appendChild(script)\n}\n// Lazy load vendor script\nexport const lazyLoadVendorScript = (handler, el) => {\n const observer = new IntersectionObserver(handler)\n observer.observe(el)\n}\n\n/**\n * Replaces variable inside a given string\n * Each variable have to be enclosed between stChr and enChr\n * The values have to be contained in the vars object, they key must match\n * example :\n * txt : 'See {resultsLength} Results'\n * vars : {resultsLength:'30'}\n * stChr : '{'\n * enChr : '}'\n *\n * will return : 'See 30 Results'\n *\n * @param {string} txt\n * @param {object} vars\n * @param {string} stChr\n * @param {string} enChr\n */\nexport function interpolate(txt: string, vars: Record<string, null | undefined | string>, stChr: string, enChr: string) {\n let curIdx = 0\n\n while (txt) {\n const stIdx = txt.indexOf(stChr, curIdx)\n if (stIdx === -1) {\n break\n }\n const enIdx = txt.indexOf(enChr, stIdx + 1)\n if (enIdx === -1) {\n break\n }\n const hashId = txt.substring(stIdx + stChr.length, enIdx)\n if (vars[hashId] != null) {\n txt = txt.substr(0, stIdx) + vars[hashId] + txt.substr(enIdx + enChr.length)\n curIdx = stIdx\n } else {\n curIdx = enIdx\n }\n }\n return txt\n}\n\n/**\n * Find in container element, add height to equal size of element\n * @param container css path where my element is contain e.g. `.c-container`\n * @param el css path of elements to equalized\n */\nexport const equalHeight = (containerSelector: string, el: string, elementScope: HTMLElement) => {\n const container = elementScope.querySelector<HTMLElement>(containerSelector)\n if (!container) {\n return\n }\n\n const items = container.querySelectorAll<HTMLElement>(el)\n let max = -1\n\n for (let i = 0; i < [...items].length; i++) {\n const item = [...items][i]\n let h = item.offsetHeight\n max = h > max ? h : max\n }\n\n if (max <= 0) {\n return\n }\n\n for (let i = 0; i < [...items].length; i++) {\n const item = [...items][i]\n item.style.height = `${max}px`\n }\n}\n\nexport const stringifyCurlyQuote = (data: {}) => JSON.stringify(data).replace(\"'\", '’')\n\nexport const stringifyForAttribute = (data = {}) => {\n return escapeHtml(JSON.stringify(data))\n}\n\n/**\n * This function is included instead of sanitizeString because for\n * inserting HTML into innerHTML we need to make sure all HTML\n * entities are escaped.\n */\nexport const escapeHtml = (text: string) => {\n const map = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n } as { [s: string]: string }\n\n return text.replace(/[&<>\"']/g, (m) => map[m])\n}\n\n/**\n * Because setting attributes escapes more than the characters above and then preact also\n * escapes text we need a more complete way of unescaping all html entities (not just the ones\n * above)\n */\nconst domParser = new DOMParser()\nexport const unescapeHtml = (text: string) => {\n return domParser.parseFromString(text, \"text/html\").body.textContent\n}\n\nexport const sanitizeString = (data: {}) => {\n if (!data) {\n return ''\n }\n\n return data.toString().replace(/\"/g, '"').replace(/'/g, ''')\n}\n\nexport const stripTags = (s: string) => {\n return (s || '').replace(/(<([^>]+)>)/gi, '')\n}\n\nexport const setAttributes = (element: Element, attrs: Record<string, any>) => {\n for (let key in attrs) {\n element.setAttribute(key, attrs[key])\n }\n return element\n}\n\nexport const getMetaContent = (metaName: string) => {\n const metaTag = document.querySelector(`meta[name=${metaName}]`)\n if (!metaTag) {\n return ''\n }\n return metaTag.getAttribute('content')\n}\n\nexport const isObjectEmpty = (obj: {}) => {\n return Object.keys(obj).length === 0\n}\n","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 { COFFEE_VERTUO } from '@kissui/components/src/constants.mjs'\nimport { getCurrency } from './getCurrency'\nexport { getCurrency } from './getCurrency'\n\nexport const ECAPI_TYPE_CAPSULE = 'capsule'\nexport const ECAPI_TYPE_MACHINE = 'machine'\nexport const ECAPI_TYPE_ACCESSORY = 'accessory'\nexport const ECAPI_TYPE_GIFT_CARD = 'giftcard'\n\nconst TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\nconst SLEEVE_OF_10 = 10\nconst SLEEVE_OF_7 = 7\n\nconst trimSku = sku => sku.replace(/[^a-z0-9- +./]/gi, '')\n\nexport const getLegacySKU = productId => productId.split('prod/').pop()\n\nexport const getPriceFormatter = async () => await window.napi.priceFormat()\n\nexport const getProduct = sku => window.napi.catalog().getProduct(trimSku(sku))\n\nexport function getTechnologyName(productData) {\n const techno = productData.technologies[0]\n return techno.substring(\n techno.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) + TECHNOLOGY_CATEGORY_IDENTIFIER.length\n )\n}\n\nfunction isMultipleOf(quantity, multiple) {\n return quantity % multiple === 0\n}\n\nexport function getSleeveNumber(product, getTechnologyNameFn = getTechnologyName) {\n if (product.sales_multiple !== 1 && isMultipleOf(product.sales_multiple, SLEEVE_OF_10)) {\n // Sleeve of original or vertuo\n return product.sales_multiple / SLEEVE_OF_10\n }\n\n if (\n product.sales_multiple !== 1 &&\n getTechnologyNameFn(product) === COFFEE_VERTUO &&\n isMultipleOf(product.sales_multiple, SLEEVE_OF_7)\n ) {\n // Sleeve of vertuo\n return product.sales_multiple / SLEEVE_OF_7\n }\n\n if (product.sales_multiple === 1 && isMultipleOf(product.unitQuantity, SLEEVE_OF_10)) {\n // Bundle of original or vertuo\n return product.unitQuantity / SLEEVE_OF_10\n }\n\n if (\n product.sales_multiple === 1 &&\n getTechnologyNameFn(product) === COFFEE_VERTUO &&\n isMultipleOf(product.unitQuantity, SLEEVE_OF_7)\n ) {\n // Bundle of vertuo\n return product.unitQuantity / SLEEVE_OF_7\n }\n\n return NaN\n}\n\n/**\n * Guess if the product is part of a bundle.\n * This is determined by checking the 'sales_multiple' and 'unitQuantity' properties.\n */\nexport function isBundled(productData) {\n // TODO: this function should not change the productData, but some components still need it\n productData.sales_multiple = productData.sales_multiple || productData.salesMultiple\n\n const isSalesMultipleGreaterThanOne = productData.sales_multiple > 1\n const isUnitQuantityEqualToOne = productData.unitQuantity === 1\n const isSalesMultipleEqualToOne = productData.sales_multiple === 1\n const isUnitQuantityGreaterThanOne = productData.unitQuantity > 1\n\n // The product is not bundled if sales_multiple > 1 and unitQuantity = 1\n if (isSalesMultipleGreaterThanOne && isUnitQuantityEqualToOne) {\n return false\n }\n\n // The product is bundled if sales_multiple = 1 and unitQuantity > 1\n return isSalesMultipleEqualToOne && isUnitQuantityGreaterThanOne\n}\n\n/**\n * Replace an array of SKU with product data\n * Remove the element inside the list if sku fail. It prevents to get an empty item.\n * @param {Array.<String>} skus\n * @param getProductFn\n * @returns {Promise<Awaited<unknown>[]>}\n */\nexport function getProductAndClean(skus, getProductFn = getProduct, napi = window.napi) {\n const promises = []\n\n if (!napi) {\n return Promise.reject()\n }\n\n if (!Array.isArray(skus)) {\n skus = [skus]\n }\n\n // Load manually the product to delete SKU fail\n for (const sku of skus) {\n promises.push(\n getProductFn(sku)\n .then(data => skus.splice(skus.indexOf(sku), 1, data))\n .catch(() => {\n skus.splice(skus.indexOf(sku), 1)\n console.error(`getProduct fail on sku ${sku}`)\n })\n )\n }\n\n return Promise.all(promises)\n}\n\nexport const getFormattedPrice = async price => {\n const priceFormatter = await getPriceFormatter()\n const currency = getCurrency()\n\n return priceFormatter.html\n ? priceFormatter.html(currency, price)\n : priceFormatter.short(currency, price) || ''\n}\n\nexport const getProductCategories = async sku => {\n const productDetails = await getProduct(sku)\n const productCategories = productDetails ? productDetails.supercategories : []\n const productCategoriesNew = await Promise.all(\n productCategories.map(async categoryEncoded => {\n const productCategoryData = await window.napi.catalog().getCategory(categoryEncoded)\n return productCategoryData\n })\n )\n return productCategoriesNew\n}\n","export const getCurrency = () => window[window.config.padl.namespace].dataLayer.app.app.currency\n","import { getFormattedPrice } from '@kissui/helpers/src/catalog'\n\nconst getStrikethroughPriceElement = component => {\n return component.querySelector('.cb-price-old')\n}\n\nconst fetchStrikethroughPrice = strikethroughPrice => {\n return getFormattedPrice(strikethroughPrice)\n}\n\nexport const renderStrikethroughPrice = ({ strikethrough_price }, component) => {\n if (!strikethrough_price) {\n return ''\n }\n\n fetchStrikethroughPrice(strikethrough_price)\n .then(payload => {\n const element = getStrikethroughPriceElement(component)\n if (!element) {\n return\n }\n\n element.innerHTML = payload\n })\n .catch(e => {\n console.error(`Error: Component SKU - Strike Through Price - ${e}`)\n\n const element = getStrikethroughPriceElement(component)\n if (!element) {\n return\n }\n\n element.style.display = 'none'\n })\n\n return `<p class=\"cb-price-old t-sm-400-sl\"></p>`\n}\n","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","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 {\n getVertuoNext,\n getOrganicEu,\n getRainforest,\n getLabels,\n getProductHighlight,\n getFairTrade,\n getSustainability,\n isRange,\n getCategoryRegEx,\n RANGE_CATEGORY_NAME,\n getArabica\n} from '@kissui/helpers/src/cremaDataHelper'\n\n/**\n * Modifies the structure to make it easier to use in components\n * Applies all the data customization mixing Page builder with HMC data\n * @param {object} plpData : original PLP data\n */\nexport async function getMergedPLPData(plpData) {\n const { data } = plpData\n if (!data) {\n return []\n }\n\n const eCommerceData = data.configuration.eCommerceData\n\n addLabels(eCommerceData)\n\n addProductAttribute(\n eCommerceData,\n getFairTrade,\n (prod, category) => (prod.fairTrade = category.name)\n )\n addProductAttribute(eCommerceData, getProductHighlight, prod => (prod.highlighted = true))\n addProductAttribute(eCommerceData, getVertuoNext, prod => (prod.onlyVertuoNext = true))\n addProductAttribute(eCommerceData, getOrganicEu, prod => (prod.organicEu = true))\n addProductAttribute(eCommerceData, getRainforest, prod => (prod.rainforest = true))\n addProductAttribute(eCommerceData, getSustainability, prod => (prod.sustainability = true))\n addProductAttribute(eCommerceData, getArabica, prod => (prod.arabica = true))\n\n addSubSegments(eCommerceData)\n\n return eCommerceData.categories\n}\n\nfunction addSubSegments(eCommerceData) {\n const { categories, productGroups, products } = eCommerceData\n // should be forEach if nothing returned/assigned\n categories.forEach(category => {\n const hasSegment = category.subCategories.length > 0 && isRange(category)\n if (hasSegment) {\n category.segments = category.subCategories.map(categoryId => {\n const segment = categories.find(subCategory => subCategory.id === categoryId)\n if (segment && isSubsegment(categories, segment)) {\n segment.products = getProductsData(productGroups, segment.id, products)\n segment.isSegment = true\n }\n return segment\n })\n }\n\n category.products = getProductsData(productGroups, category.id, products)\n })\n}\n\nexport function getProductsData(productGroups, categoryId, products) {\n let result = []\n try {\n const currentCategory = productGroups.find(category => category.categoryId === categoryId)\n\n if (!currentCategory) {\n return result\n }\n\n const { productIds } = currentCategory\n return productIds.map(productId => {\n const product = products.find(product => product.id === productId)\n return product\n })\n } catch (e) {\n //generally an anti pattern to only log the error, with no try catch the result would be the same\n console.log(e)\n }\n\n return result\n}\n\n/**\n * adds labels property to products containing each label's category data (JSON parsed description property) assigned to it\n * labels are categories that have the label base category as parent\n * to apply a label on a given product, the label has to contain the product\n * this function has to clean the productGroups as well by removing the label ones\n * @param {category[]} categories\n * @param {productGroup[]} productGroups\n * @param {product[]} products\n */\nfunction addLabels(eCommerceData) {\n const { categories, productGroups, products } = eCommerceData\n const labels = getLabels(categories)\n const labelGroups = getLabelGroups(productGroups, labels)\n labelGroups.forEach(group => {\n const label = labels.find(label => label.id === group.categoryId)\n group.productIds.forEach(productId => {\n const prod = products.find(product => product.id === productId)\n prod.labels = prod.labels || []\n prod.labels.push(label.description)\n })\n })\n //removing label categories from productGroups\n labelGroups.forEach(labelGroup => {\n const indexToRemove = productGroups.findIndex(\n productGroup => productGroup.categoryId === labelGroup.categoryId\n )\n productGroups.splice(indexToRemove, 1)\n })\n}\n\n/**\n * adds a property to products containing the given category assigned to it\n * The category is recognized by ID\n * to apply a the category on a given product, the category's productGroup has to contain the product\n * this function has to clean the productGroups as well by removing the given's one to not let it display as a range in the PLP\n * @param {category[]} categories\n * @param {productGroup[]} productGroups\n * @param {product[]} products\n */\nfunction addProductAttribute(eCommerceData, categoryFetcher, assignHandler) {\n const { categories, productGroups, products } = eCommerceData\n const category = categoryFetcher(categories)\n if (!category) {\n return\n }\n const categoryGroup = getCategoryGroup(productGroups, category)\n if (!categoryGroup) {\n return\n }\n categoryGroup.productIds.forEach(productId => {\n const prod = products.find(product => product.id === productId)\n if (categoryFetcher === getArabica) {\n console.log('addProductAttribute', prod)\n }\n assignHandler(prod, category)\n })\n const indexToRemove = productGroups.findIndex(\n productGroup => productGroup.categoryId === categoryGroup.categoryId\n )\n productGroups.splice(indexToRemove, 1)\n}\n\n/**\n * retrieve all the productGroup that are labels\n * @param {productGroup[]} productGroups\n * @param {category[]} labels\n */\nfunction getLabelGroups(productGroups, labels) {\n return productGroups.filter(group => labels.some(label => label.id === group.categoryId))\n}\n\n/**\n * retrieve the productGroup which correspond to a category\n * @param {productGroup[]} productGroups\n * @param {category} fairTrade\n */\nfunction getCategoryGroup(productGroups, category) {\n return productGroups.find(group => category.id === group.categoryId)\n}\n\n/**\n * returns true when the category is child of the range category (is type range)\n * @param {category} category\n */\nexport function isSubsegment(categories, category) {\n /*category.superCategories.some(superCategoryId => {\n const superCategoryData = categories.find(categoryToFind => categoryToFind.id === superCategoryId)\n })*/\n const result = category.superCategories.some(superCategory =>\n getCategoryRegEx(RANGE_CATEGORY_NAME).test(superCategory)\n )\n return result\n}\nexport function getFinalPrice(show_sleeve_price, product, isBundled) {\n let showCapsulePrice = show_sleeve_price\n let final_price\n let price_per_capsule\n\n const bundled = isBundled(product)\n\n if (product.type === 'capsule' && !bundled) {\n final_price = product.price * product.salesMultiple\n // this isn't necessary in prod but the mock price formatter needs it\n final_price = Math.round(final_price * 100) / 100\n price_per_capsule = product.price\n } else {\n showCapsulePrice = false\n final_price = product.price\n }\n\n return { showCapsulePrice, final_price, price_per_capsule }\n}\n","import { INTENSITY_MAX_OL, INTENSITY_MAX_VL } from '@kissui/components'\n\nexport const getMaxIntensity = ({ technologies }) =>\n technologies.indexOf('original') !== -1 ? INTENSITY_MAX_OL : INTENSITY_MAX_VL\n","import {\n ECAPI_TYPE_ACCESSORY,\n ECAPI_TYPE_CAPSULE,\n ECAPI_TYPE_GIFT_CARD,\n ECAPI_TYPE_MACHINE\n} from '@kissui/helpers/src/catalog'\n\nexport const getSkuComponentByType = ({ type, is_machine_b2b }) => {\n let result = 'nb-sku'\n\n if (type === ECAPI_TYPE_CAPSULE) {\n result = 'nb-sku-coffee'\n } else if (type === ECAPI_TYPE_MACHINE && is_machine_b2b) {\n result = 'nb-sku-machine-b2b'\n } else if (type === ECAPI_TYPE_MACHINE) {\n result = 'nb-sku-machine'\n } else if (type === ECAPI_TYPE_ACCESSORY) {\n result = 'nb-sku-accessory'\n } else if (type === ECAPI_TYPE_GIFT_CARD) {\n result = 'nb-sku-gift-card'\n }\n\n return result\n}\n\nexport const apiOverride = (productData, pageBuilderData) => {\n if (!productData || !pageBuilderData) {\n return {}\n }\n\n const { images, name, headline, description } = productData\n const { api_override } = pageBuilderData\n\n if (!api_override) {\n return {}\n }\n\n return {\n image: api_override.image || images?.icon || images?.url || images?.push || images?.main,\n name: api_override.name || name,\n headline: api_override.headline || headline,\n description: api_override.description || description\n }\n}\n","import { sanitizeString } from '@kissui/helpers/src/utils'\nimport { getMergedProductCoffeeData } from './product.coffee.dto'\nimport { getMergedProductMachineData } from './product.machine.dto'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { getMergedProductGiftCardData } from './product.giftCard.dto'\nimport { getMergedProductAccessoryData } from './product.accessory.dto'\nimport { apiOverride } from '@kissui/components/src/sku/services'\nimport {\n ECAPI_TYPE_ACCESSORY,\n ECAPI_TYPE_CAPSULE,\n ECAPI_TYPE_GIFT_CARD,\n ECAPI_TYPE_MACHINE\n} from '@kissui/helpers/src/catalog'\n\nexport const getMergedProductData = (\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n) => {\n const { options } = pageBuilderProps\n const {\n variant = {},\n labels = [],\n strikethrough_price,\n additional_message,\n additional_message_icon,\n additional_message_link,\n contact_cta\n } = pageBuilderProductProps || {}\n\n // lists header props not coming from this.props\n let data = {\n sku: product.internationalId,\n technologies: product.technologies,\n longSku: product.id,\n name: product.name,\n headline: sanitizeString(product.headline),\n sales_multiple: product.salesMultiple,\n unit_quantity: product.unitQuantity,\n type: product.type,\n category_name: product.rangeData?.name || '',\n label_range: product.rangeData?.name || '',\n price: product.price ? priceFormatter.short(currency, product.price) : null,\n rawPrice: product.price,\n strikethrough_price: strikethrough_price || '',\n variation: VARIATION_PLP,\n image_alt_text: product.name,\n image: product.images?.icon || product.images?.push || product.images?.main,\n additional_message: additional_message || '',\n additional_message_icon: additional_message_icon || '',\n additional_message_link: additional_message_link || {},\n contact_cta: contact_cta || {},\n ...apiOverride(product, pageBuilderProductProps)\n }\n\n if (labels && labels.length) {\n data.labels = labels\n }\n\n if (product.highlighted) {\n data.highlighted = product.highlighted\n }\n\n let dataTransformObjectProductType = {}\n if (product.type === ECAPI_TYPE_CAPSULE) {\n dataTransformObjectProductType = getMergedProductCoffeeData(\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n )\n } else if (product.type === ECAPI_TYPE_MACHINE) {\n dataTransformObjectProductType = getMergedProductMachineData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n } else if (product.type === ECAPI_TYPE_ACCESSORY) {\n dataTransformObjectProductType = getMergedProductAccessoryData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n } else if (product.type === ECAPI_TYPE_GIFT_CARD) {\n dataTransformObjectProductType = getMergedProductGiftCardData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n }\n\n return {\n ...product,\n ...options,\n ...variant,\n ...data,\n ...dataTransformObjectProductType\n }\n}\n","import { getFinalPrice } from '@kissui/plp/services'\nimport { isBundled } from '@kissui/helpers/src/catalog'\nimport { getMaxIntensity } from '@kissui/components/src/sku-coffee/services'\n\nexport const getMergedProductCoffeeData = (\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n) => {\n const { bundle_details } = pageBuilderProductProps\n const { options } = pageBuilderProps\n const { show_sleeve_price } = options\n\n const isBundledResult = isBundled(product)\n\n const { showCapsulePrice, price_per_capsule, final_price } = getFinalPrice(\n show_sleeve_price,\n product,\n isBundled\n )\n\n const option = {\n bundled: isBundledResult,\n intensity: product.capsuleProperties?.intensity || product.intensity || null,\n max_intensity: getMaxIntensity(product),\n price_per_capsule: price_per_capsule\n ? priceFormatter.short(currency, price_per_capsule)\n : null,\n show_capsule_price: showCapsulePrice\n }\n\n if (show_sleeve_price) {\n option.price = priceFormatter.short(currency, final_price)\n }\n\n if (bundle_details) {\n option.bundle_details = bundle_details\n }\n\n return option\n}\n","export const getMergedProductMachineData = (product, pageBuilderProductProps, pageBuilderProps) => {\n const { strikethrough_price, variant = {} } = pageBuilderProductProps\n const { ratingsAndReviews } = product\n\n // lists header props not coming from this.props\n const options = {\n ratings: ratingsAndReviews\n }\n\n if (variant?.colors) {\n options.colors = variant.colors\n options.activeSku = product.internationalId\n options.max_colors = 99\n }\n\n options.strikethrough_price = strikethrough_price || ''\n options.show_ratings = (pageBuilderProps && pageBuilderProps.options.show_ratings) || false\n options.minimum_rating = (pageBuilderProps && pageBuilderProps.options.minimum_rating) || 0\n\n return options\n}\n","export const getMergedProductAccessoryData = () => ({})\n","export const getMergedProductGiftCardData = (_, pageBuilderProductProps) => {\n const { variant = {} } = pageBuilderProductProps\n\n return {\n image: variant && variant.default_image\n }\n}\n","export const VARIATION_CROSS_SELL = 'cross-sell'\nexport const VARIATION_PLP = 'plp'\n\nexport interface CapsuleFeaturesInputType {\n acidity?: number | null\n bitterness?: number | null\n body?: number | null\n intensity?: number | null\n roastLevel?: number | null\n}\n\nexport interface CapsuleFeatureType {\n value: number | null\n}\n\nexport interface CapsuleFeaturesOutputType {\n acidity: CapsuleFeatureType\n bitterness: CapsuleFeatureType\n body: CapsuleFeatureType\n intensity: CapsuleFeatureType\n roast: CapsuleFeatureType\n}\n\nexport type QuickViewProductType = {\n modelType: string\n id: string\n legacyId: string\n internationalId: string\n name: string\n urlFriendlyName: string\n internationalName: string\n headline: string\n rootCategory: string\n category: string\n supercategories: string[]\n mobileImages: {\n modelType: string\n icon: string\n main: string\n }\n responsiveImages: {\n standard: string\n }\n pdpURLs: {\n opr: string\n desktop: string\n mobile: string\n }\n unitQuantity: number\n salesMultiple: number\n maxOrderQuantity: number\n technologies: string[]\n comingSoon: boolean\n unit_quantity: number\n productSelections: string[]\n type: string\n priceDisplay: string\n isOrderable: boolean\n bundled: boolean\n capsuleProperties: {\n intensity: number\n bitterness: number\n acidity: number\n roastLevel: number\n }\n capsuleProductAromatics: string[]\n aromaticProfileDescription: string\n roastingDescription: string\n capsuleCupSizes: string[]\n capsuleCupSizesDetails: {\n id: string\n name: string\n capacityLabel: string\n }[]\n capsuleAromatics: {\n id: string\n name: string\n }[]\n decaffeinated: boolean\n}\n\n//Confirmed this props are not available in Product Type\nexport type ProductNewPropsType = {\n currency: string\n pdpURLs: {\n desktop: string\n mobile: string\n }\n responsiveImages: {\n standard: string\n }\n supercategories: string[]\n productSelections: string[]\n capsuleProperties?: CapsuleFeaturesInputType\n capsuleProductAromatics: string[]\n unitPrice: number\n cupSizesDetails?: {\n icon: string\n label: string\n size: string\n capacityLabel: string | null\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string\n }\n detailsIcon: {\n url: string\n altText: string\n }\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n }[]\n category_name: string\n url: string\n}\n\n// This is the Product Type signature Combined\nexport type ProductPropsType = QuickViewProductType & ProductNewPropsType\n\nexport type AddToCartPropsType = {\n sku?: string\n longSku?: string\n category_name?: string\n price?: string\n strikethrough_price?: number\n hidePrice?: boolean\n type?: string\n price_per_capsule?: number | string\n show_capsule_price?: boolean\n label_capsules?: string\n capsule_price_label?: string\n capsule_price_syntax?: string\n show_sleeve_price?: boolean\n show_sleeve?: boolean\n sleeve_syntax?: string\n number_of_sleeves?: number\n label_sleeves?: string\n label_sleeve?: string\n technologies: string[]\n sales_multiple?: number\n unitQuantity?: number\n unit_quantity?: number\n bundled?: boolean\n url?: string\n}\n\nexport type PageBuilderProductPropsType = {\n sku: string\n highlighted: boolean\n labels: {\n bgColor: string\n color: string\n name: string\n }[]\n strikethrough_price: string\n variant: {\n is_capsule: boolean\n number_of_sleeves: number\n number_of_capsules: string\n bundle_details: {\n popin_link_text: string\n popin_label_close: string\n description: string\n other_skus: string\n other_skus_quantity: string\n }\n logos: {\n fair_trade: boolean\n alt_fair_trade: string\n is_organic: boolean\n alt_organic: string\n only_vertuo_next: boolean\n alt_vertuo_next: string\n is_rainforest: boolean\n alt_rainforest: string\n is_sustainable: boolean\n alt_sustainable: string\n is_q_certified_arabica: boolean\n alt_q_certification_arabica: string\n }\n sku_timer: {\n launch_date: string\n remaining_days: string\n remaining_day: string\n label: string\n a11y_label: string\n }\n ingredients: {\n heading: string\n description: string\n }\n }\n}\n\nexport type PageBuilderPropsType = {\n quick_view_plp?: {\n popin?: {\n close?: string\n }\n cup_sizes?: {\n heading: string\n unit_is_oz: boolean\n items: string[]\n }\n aromatic_profile?: {\n heading: string\n items: string[]\n }\n link?: {\n label: string\n url: string\n }\n levels?: {\n a11y_level_of: string\n acidity_label: string\n bitterness_label: string\n roastiness_label: string\n body_label: string\n }\n }\n campaign?: {\n id?: string\n name?: string\n creative?: string\n position?: string\n }\n tracking_position: string\n tracking_list: string\n capsuleProperties?: CapsuleFeaturesInputType\n price_per_capsule?: number | string\n show_capsule_price?: boolean\n label_capsules?: string\n capsule_price_label?: string\n capsule_price_syntax?: string\n show_sleeve_price?: boolean\n show_sleeve?: boolean\n sleeve_syntax?: string\n number_of_sleeves?: number\n label_sleeves?: string\n label_sleeve?: string\n technologies: string[]\n sales_multiple?: number\n unit_quantity?: number\n bundled?: boolean\n pdpURLs: {\n desktop: string\n mobile: string\n }\n intensity_label: string\n products: {\n sku: string\n longSku: string\n price: number\n strikethrough_price: number\n hidePrice: boolean\n url: string\n }[]\n priceFormatter: {\n formatPrice: (price: number) => string\n }\n currency: string\n options: {\n intensity_label: string\n show_sleeve: boolean\n label_sleeve: string\n label_sleeves: string\n label_capsules: string\n sleeve_syntax: string\n show_sleeve_price: boolean\n capsule_price_label: string\n capsule_price_syntax: string\n a11y_intensity_max: string\n label_decaffeinato: string\n is_headline_hidden: boolean\n sizes_title: string\n notes_title: string\n enabledExperiments: string[]\n }\n copywriting: {\n sku_quick_view: {\n more_info: string\n a11y_more_info: string\n popin: {\n close: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: boolean\n items: string[]\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n }\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n }\n}\n\nexport type SkuType = {\n tracking_list: string\n tracking_position: string\n id: string\n sku: string\n longSku: string\n name: string\n name_custom: string\n available: boolean\n description: string | null\n hidePrice: boolean\n image_alt_text: string\n inStock: boolean\n internationalId: string\n internationalName: string\n legacyId: string\n maxOrderQuantity: number | null\n packagingType: string | null\n price: string\n pushRatingEnabled: boolean\n ranges: string[]\n salesMultiple: number\n technologies: string[]\n type: string\n unitQuantity: number\n url: string\n labels: []\n category_name: string\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string | null\n }\n detailsIcon: string | null\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n highlighted: boolean\n strikethrough_price: string\n view_details_label: string\n headline: string\n cupSizes: string[]\n cupSizesDetails: {\n icon: string\n label: string\n size: string\n capacityLabel: string | null\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string | null\n }\n detailsIcon: string | null\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n }[]\n flavors: string[]\n in_stock: boolean\n sales_multiple: number\n bundled: boolean\n logos: []\n is_headline_hidden: boolean\n a11y_price: string\n a11y_product_card: string\n label_sleeve: string\n label_sleeves: string\n label_capsules: string\n intensity: number\n a11y_intensity_max: string\n label_decaffeinato: string\n show_sleeve_price: boolean\n show_sleeve: boolean\n price_per_capsule: number | string\n final_price: string | null\n capsule_price_label: string\n capsule_price_syntax: string\n sleeve_syntax: string\n perSleeveLabel: string\n number_of_sleeves: number\n number_of_capsules: string\n show_capsule_price: boolean\n sort_price: number\n bundle_details: any\n quick_view_plp: {\n show_view: boolean\n quick_view_text: string\n popin: {\n close: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: boolean\n items: string[]\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n }\n levels: {\n a11y_level_of: string\n acidity_label: string\n bitterness_label: string\n roastiness_label: string\n body_label: string\n }\n }\n hasPricePerSleeve: boolean\n sleevePrice: string\n rendererName: string\n position: number\n rawPrice: number\n variation: string\n intensity_label: string\n campaign: {\n id: string\n name: string\n creative: string\n position: string\n }\n capsuleProductAromatics: string[]\n copywriting: {\n heading: string\n sku_quick_view: {\n more_info: string\n a11y_more_info: string\n popin: {\n close: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: false\n items: string[]\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n }\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n }\n options: {\n intensity_label: string\n show_sleeve: boolean\n label_sleeve: string\n label_sleeves: string\n label_capsules: string\n sleeve_syntax: string\n show_sleeve_price: boolean\n capsule_price_label: string\n capsule_price_syntax: string\n a11y_intensity_max: string\n label_decaffeinato: string\n is_headline_hidden: boolean\n sizes_title: string\n notes_title: string\n enabledExperiments: string[]\n }\n products: {\n sku: string\n longSku: string\n price: number\n strikethrough_price: number\n hidePrice: boolean\n url: string\n }[]\n priceFormatter: {\n formatPrice: (price: number) => string\n }\n currency: string\n}\n\nexport type MergedProductType = {\n intensity_label: string\n capsuleProductAromatics?: string[]\n pdpURLs?: {\n desktop: string\n mobile: string\n }\n}\n\nexport type AddToCardPropertiesType = SkuType & MergedProductType\n\ntype CupSizeType = {\n icon: string\n label: string\n size: string\n capacityLabel: string | null\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string\n }\n detailsIcon: {\n url: string\n altText: string\n }\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n}[]\n\nexport type QuickViewPropsType = {\n popin: {\n popin_id: string\n close?: string\n footer: boolean\n }\n product: MergedProductType\n intensity: {\n intensity_label?: string\n a11y_intensity_max: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: boolean\n items?: [] | CupSizeType\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n url?: string\n }\n levels: any\n pricing: {\n add_to_cart: AddToCartPropsType & {\n position: string\n variation: string\n url: string\n view_details_label: string\n rendererName: string\n }\n showSleeve: any\n showCapsulePrice: any\n }\n campaign: any\n}\n","import { getMergedProductData } from '@kissui/page-builder-sections/src/cross-sell-natural/dataTransform'\n\nimport {\n CapsuleFeaturesInputType,\n CapsuleFeaturesOutputType,\n ProductPropsType,\n AddToCartPropsType,\n SkuType,\n ProductNewPropsType,\n MergedProductType,\n AddToCardPropertiesType,\n QuickViewPropsType,\n VARIATION_PLP,\n VARIATION_CROSS_SELL\n} from './shared-quick-view-types'\n\nexport const getCapsuleFeatures = ({\n acidity = null,\n bitterness = null,\n body = null,\n intensity = null,\n roastLevel = null\n}: CapsuleFeaturesInputType = {}): CapsuleFeaturesOutputType => ({\n acidity: { value: acidity },\n bitterness: { value: bitterness },\n body: { value: body },\n intensity: { value: intensity },\n roast: { value: roastLevel }\n})\n\nexport const getSkuQuickViewData = async (\n product: ProductPropsType,\n popinId: string,\n skuData: SkuType,\n componentType: string\n) => {\n const { tracking_position, tracking_list } = skuData\n\n const handlePLPVariation = () => {\n if (!product) return\n let quickViewElement = document.createElement('nb-sku-quick-view')\n quickViewElement.setAttribute(\n 'data',\n JSON.stringify(getSkuQuickViewProp(popinId, product, skuData, componentType))\n )\n quickViewElement.setAttribute('id', popinId)\n quickViewElement.setAttribute('tracking_no_impression', 'true')\n quickViewElement.setAttribute('tracking_position', tracking_position)\n quickViewElement.setAttribute('tracking_list', tracking_list)\n quickViewElement.setAttribute('campaign_position', skuData.campaign.position)\n quickViewElement.setAttribute('listname_text', skuData.copywriting.heading)\n document.body.appendChild(quickViewElement)\n }\n\n const handleCrossSellVariation = () => {\n const { sku_quick_view } = skuData.copywriting\n if (!sku_quick_view.more_info) return ''\n const quickViewElement = document.querySelector('nb-sku-quick-view')\n if (quickViewElement) quickViewElement.remove()\n\n let newQuickViewElement = document.createElement('nb-sku-quick-view')\n newQuickViewElement.setAttribute(\n 'data',\n JSON.stringify(getSkuQuickViewProp(popinId, product, skuData, componentType))\n )\n newQuickViewElement.setAttribute('tracking_no_impression', 'true')\n newQuickViewElement.setAttribute('tracking_position', tracking_position)\n newQuickViewElement.setAttribute('tracking_list', tracking_list)\n newQuickViewElement.setAttribute('campaign_position', skuData.campaign.position)\n newQuickViewElement.setAttribute('listname_text', skuData.copywriting.heading)\n document.body.appendChild(newQuickViewElement)\n }\n\n const variationHandlers: { [key: string]: () => void | string } = {\n [VARIATION_PLP]: handlePLPVariation,\n [VARIATION_CROSS_SELL]: handleCrossSellVariation\n }\n\n const handleVariation = variationHandlers[componentType]\n if (handleVariation) {\n handleVariation()\n }\n}\n\nexport const getSkuQuickViewProp = (\n popinId: string,\n product: ProductPropsType,\n skuData: SkuType,\n componentType: string\n) => {\n let mergedProductData = getMergedProductDataForComponentType(product, skuData, componentType)\n let addToCartProps = getAddToCartProperties(componentType, skuData, mergedProductData)\n\n return isVariationOnPLP(componentType)\n ? getPlpQuickViewProps(popinId, skuData, mergedProductData, addToCartProps)\n : getCrossSellQuickViewProps(popinId, product, skuData, mergedProductData, addToCartProps)\n}\n\nconst getMergedProductDataForComponentType = (\n product: ProductPropsType,\n skuData: SkuType,\n componentType: string\n) => {\n switch (componentType) {\n case VARIATION_PLP:\n return {\n ...skuData,\n ...product,\n ...getCapsuleFeatures(product?.capsuleProperties)\n }\n case VARIATION_CROSS_SELL: {\n const matchedProduct =\n skuData.products?.find(\n productPageBuilder => productPageBuilder.sku === product?.legacyId\n ) || {}\n return getMergedProductData(\n product,\n matchedProduct,\n skuData,\n skuData?.priceFormatter,\n skuData?.currency\n )\n }\n default:\n return {}\n }\n}\n\nexport const getAddToCartProperties = (\n componentType: string,\n skuData: SkuType,\n mergedProductData: MergedProductType\n): AddToCartPropsType => {\n const data: AddToCardPropertiesType = isVariationOnPLP(componentType)\n ? skuData\n : (mergedProductData as AddToCardPropertiesType)\n return getAddToCartProps(data, componentType)\n}\n\nexport const getAddToCartProps = (\n data: AddToCardPropertiesType,\n componentType: string\n): AddToCartPropsType => {\n const commonProps: AddToCartPropsType = {\n sku: data.sku,\n longSku: data.longSku,\n category_name: data.category_name,\n price: data.price ?? 0,\n strikethrough_price: Number(data.strikethrough_price),\n hidePrice: data.hidePrice,\n technologies: data.technologies || [],\n url: data.url || ''\n }\n\n if (isVariationOnPLP(componentType)) {\n return {\n ...commonProps,\n type: data.type,\n price_per_capsule: data.price_per_capsule,\n show_capsule_price: data.show_capsule_price,\n label_capsules: data.label_capsules,\n capsule_price_label: data.capsule_price_label,\n capsule_price_syntax: data.capsule_price_syntax,\n show_sleeve_price: data.show_sleeve_price,\n show_sleeve: data.show_sleeve,\n sleeve_syntax: data.sleeve_syntax,\n number_of_sleeves: data.number_of_sleeves,\n label_sleeves: data.label_sleeves,\n label_sleeve: data.label_sleeve,\n technologies: data.technologies || [],\n sales_multiple: data.sales_multiple,\n unit_quantity: data.unitQuantity,\n bundled: data.bundled,\n url: data.url || ''\n }\n }\n\n return commonProps\n}\n\nexport const getPlpQuickViewProps = (\n popinId: string,\n skuData: SkuType,\n mergedProductData: MergedProductType,\n addToCartProps: AddToCartPropsType\n): QuickViewPropsType => {\n return {\n popin: {\n popin_id: popinId,\n close: skuData?.quick_view_plp?.popin?.close,\n footer: true\n },\n product: {\n ...mergedProductData\n },\n intensity: {\n intensity_label: mergedProductData?.intensity_label,\n a11y_intensity_max: 'max of {max_intensity}'\n },\n cup_sizes: {\n ...skuData?.quick_view_plp?.cup_sizes,\n items: skuData?.cupSizesDetails\n },\n aromatic_profile: {\n ...skuData?.quick_view_plp?.aromatic_profile,\n items: skuData?.capsuleProductAromatics || mergedProductData?.capsuleProductAromatics\n },\n link: {\n ...skuData?.quick_view_plp?.link,\n url: skuData?.url\n },\n levels: {\n ...skuData?.quick_view_plp?.levels\n },\n pricing: {\n add_to_cart: {\n ...addToCartProps,\n position: '',\n variation: 'small',\n url: '',\n view_details_label: 'View details',\n rendererName: ''\n },\n showSleeve: {},\n showCapsulePrice: {}\n },\n campaign: skuData.campaign\n }\n}\n\nexport const getCrossSellQuickViewProps = (\n popinId: string,\n product: ProductNewPropsType,\n skuData: SkuType,\n mergedProductData: MergedProductType,\n addToCartProps: AddToCartPropsType\n): QuickViewPropsType => {\n const props: QuickViewPropsType = {\n popin: {\n popin_id: popinId,\n close: skuData?.copywriting?.sku_quick_view?.popin?.close,\n footer: true\n },\n product: {\n ...mergedProductData\n },\n intensity: {\n intensity_label: skuData?.options?.intensity_label,\n a11y_intensity_max: 'max of {max_intensity}'\n },\n cup_sizes: {\n ...skuData?.copywriting?.sku_quick_view?.cup_sizes,\n items: product?.cupSizesDetails\n },\n aromatic_profile: {\n ...skuData?.copywriting?.sku_quick_view?.aromatic_profile,\n items: product?.capsuleProductAromatics || mergedProductData?.capsuleProductAromatics\n },\n link: {\n ...skuData?.copywriting?.sku_quick_view?.link,\n url: mergedProductData?.pdpURLs?.desktop\n },\n levels: {\n ...skuData?.quick_view_plp?.levels\n },\n pricing: {\n add_to_cart: {\n ...addToCartProps,\n position: '',\n variation: 'small',\n url: '',\n view_details_label: 'View details',\n rendererName: ''\n },\n showSleeve: {},\n showCapsulePrice: {}\n },\n campaign: {}\n }\n return props\n}\nconst isVariationOnPLP = (componentType: string) => componentType === VARIATION_PLP\n","export const dispatchEvent = ({ eventName, args, element }) => {\n // Use the provided element or fallback to window if available\n if (!element) {\n if (typeof window !== 'undefined') {\n element = window\n } else {\n throw new Error(\n '`element` is not provided and `window` is unavailable. Provide a valid element to dispatch the event.'\n )\n }\n }\n\n let event\n if (args) {\n event = new CustomEvent(eventName, { detail: args, bubbles: true })\n } else {\n if (typeof Event === 'function') {\n event = new Event(eventName)\n } else {\n event = document.createEvent('Event')\n event.initEvent(eventName, true, true)\n }\n }\n element.dispatchEvent(event)\n}\n\nexport const readEvent = e => {\n if (!e.detail) {\n return\n }\n return e.detail\n}\n","export type EventListener = {\n element: HTMLElement\n type: string\n listener: (e: Event) => void\n options?: boolean | AddEventListenerOptions\n}\n\nconst add = (eventListeners: EventListener[] = []) => {\n eventListeners.forEach(eventListener => {\n if (!eventListener || !eventListener.element) {\n return\n }\n return eventListener.element.addEventListener(\n eventListener.type,\n eventListener.listener,\n eventListener.options\n )\n })\n}\n\nconst remove = (eventListeners: EventListener[] = []) => {\n eventListeners.forEach(eventListener => {\n if (!eventListener || !eventListener.element) {\n return\n }\n eventListener.element.removeEventListener(eventListener.type, eventListener.listener)\n })\n}\n\nconst busNamespace = 'pageBuilder'\n\nexport const emitCustomEvent = (eventName: string, data: unknown) => {\n const customEvent = new CustomEvent(`${busNamespace}.${eventName}`, {\n detail: data,\n bubbles: true,\n cancelable: true,\n composed: false\n })\n\n window.dispatchEvent(customEvent)\n}\n\nexport default { add, emitCustomEvent, remove }\n","import { getProduct } from '@kissui/helpers/src/catalog'\nimport { emitCustomEvent } from './events.helpers'\nimport { removeEmptyValues } from '@kissui/helpers/src/utils'\n\nconst raisedByPB = 'page builder'\nconst raisedByWC = 'Web component'\n\n/**\n * helper method for 'itemDisplay' GTM event\n * @param {*} event : 'itemDisplay' - Mandatory as is\n * @param {*} eventRaisedBy : 'Web component' - Mandatory as is\n * @param {*} eventAction : 'Click' - Action that led to the item display. For example, click\n * @param {*} itemTypes : ['products'] - Mandatory as is\n * @param {*} rootElement : ['nb-slider'] - Root DOM element for item detection. Closest common ancestor element of the inserted/displayed promotions and products. It will help the detection to reduce its performance consumption. Set to 0 (zero) in order to request detection through the entire document.\n */\nexport const itemDisplay = args => {\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'itemDisplay',\n eventRaisedBy: raisedByWC,\n eventAction: 'Click',\n itemTypes: ['products'],\n ...args\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('itemDisplay', eventData)\n}\n\n/**\n *\n * helper method for 'customEvent' GTM event\n * @param {*} args (event, eventRaisedBy, eventCategory, eventAction, eventLabel, nonInteraction)\n */\n\nexport const customEvent = args => {\n window.gtmDataObject = window.gtmDataObject || []\n var eventData\n if (args.event_GA4 === undefined || args.event_GA4 === false) {\n eventData = {\n event: 'customEvent',\n eventRaisedBy: raisedByWC,\n eventCategory: 'User Engagement',\n eventAction: 'Click',\n eventLabel: '',\n nonInteraction: 0,\n ...args\n }\n } else {\n eventData = {\n event_raised_by: raisedByPB,\n ...args\n }\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('customEvent', eventData)\n}\n\n/**\n * Helper method for tracking component interactions, compatible with GA4.\n *\n * @param {String} creative : component raising the event, e.g. 'before_coffees_list', 'before_machines_list', 'before_accessories_list'\n * @param {String} actionType : description of the interaction, e.g 'pdp quick view'\n * @param {String} internationalId : long SKU, e.g. 'erp.pt.b2c/prod/7243.30'\n * @param {String} internationalName : international name of the product, e.g. 'Vertuo Carafe Pour-Over Style Mild'\n * @param {String} productType : type of product, i.e. 'capsule', 'machine', 'accessory'\n * @param {String} range : product range, e.g. 'ispirazione italiana'\n * @param {String} technology : technology, i.e. 'original', 'vertuo'\n * @param {Number} price : price, e.g. .51\n * @param {String} eventAction : description of the action, e.g. 'PDP Quick View'\n *\n * Initally created for PDP Quick View tracking:\n * https://dsu-confluence.nestle.biz/display/DIANA/BEFORE+-+PDP+Quick+View\n * Will probably be rolled out across all components, update this comment accordingly.\n */\nexport const trackComponentInteraction = ({\n creative = '',\n actionType = '',\n internationalId = '',\n internationalName = '',\n productType = '',\n technology = '',\n category = '',\n rawPrice = '',\n eventAction = ''\n}) => {\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'page_builder_component_interaction',\n event_raised_by: raisedByPB,\n component_name: creative,\n action_type: actionType,\n item_id_event: internationalId,\n item_name_event: internationalName,\n item_category_event: productType,\n item_technology_event: technology,\n item_range_event: category,\n item_price_event: rawPrice,\n eventCategory: 'User Engagement',\n eventAction: eventAction,\n eventLabel: `${productType} - ${technology} - ${internationalName}`\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\n/**\n *\n * Push 'view_promotion' event for GA 4\n * @param {*} args (event, event_raised_by, ecommerce: {promotion_id, promotion_name, creative_slot, creative_name})\n */\nexport const viewPromotion = args => {\n const event = 'view_promotion'\n const eventData = {\n event,\n event_raised_by: raisedByPB,\n ecommerce: {}\n }\n if (Object.keys(args).length) {\n const { id = '', creative = '', name = '', position = '' } = args\n let ecommerceData = {\n promotion_id: id,\n promotion_name: name,\n creative_slot: position,\n creative_name: creative\n }\n ecommerceData = removeEmptyValues(ecommerceData)\n eventData.ecommerce = ecommerceData\n }\n window.gtmDataObject ??= []\n window.gtmDataObject.push(eventData)\n emitCustomEvent(event, eventData)\n}\n\nexport const handlePromoClick = args => {\n const { campaign, cta_name } = args\n\n const cleanedData = removeEmptyValues(campaign)\n selectPromotion({ cta_name, ...cleanedData })\n}\n\n/**\n *\n * Push 'select_promotion' event for GA 4\n * @param {*} args (event, event_raised_by, cta_name, ecommerce: {promotion_id, promotion_name, creative_slot, creative_name})\n */\nexport const selectPromotion = args => {\n const event = 'select_promotion'\n const eventData = {\n event: 'select_promotion',\n cta_name: args?.cta_name ?? '(not set)',\n event_raised_by: raisedByPB,\n ecommerce: {}\n }\n if (Object.keys(args).length) {\n const { id = '', creative = '', name = '', position = '' } = args\n let ecommerceData = {\n promotion_id: id,\n promotion_name: name,\n creative_slot: position,\n creative_name: creative\n }\n ecommerceData = removeEmptyValues(ecommerceData)\n eventData.ecommerce = ecommerceData\n }\n\n window.gtmDataObject ??= []\n window.gtmDataObject.push(eventData)\n emitCustomEvent(event, eventData)\n}\n\nexport const interactionClick = (nameComponent, ctaName) => {\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'page_builder_component_interaction',\n event_raised_by: raisedByPB,\n eventCategory: 'User Engagement',\n eventAction: 'Click CTA',\n eventLabel: `Page Builder - ${nameComponent} - ${ctaName}`,\n component_name: nameComponent,\n action_type: 'web component click',\n cta_name: ctaName\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\nexport const getProductInfo = async (sku, data) => {\n let product = data\n if (!product) {\n product = await getProduct(sku)\n }\n return product\n}\n\nexport const getProductPayload = (data, actionField = {}) => {\n const {\n internationalName,\n internationalId,\n category,\n unitPrice,\n legacyId,\n name,\n technologies,\n bundled,\n inStock,\n type\n } = data\n\n const technology = technologies.map(item => item.split('/').pop()).join('|')\n const isDiscovery = category.toLowerCase().includes('discovery')\n\n return [\n // Array consists of one product details for PDP Product Detail View\n {\n ...actionField,\n name: internationalName, // '[[International Product Name]]' NIE, Contract\n id: internationalId, // '[[International Product ID]]'\n price: unitPrice, // '[[Product Price]'\n // dimension43: '[[true/false]]', // '[[true/false]]' // Signifies if this product is part of a standing order or not\n dimension44: isDiscovery.toString(), // '[[true/false]]', // Signifies if this product is part of a discovery offer\n dimension53: legacyId, // '[[Product Local market ID]]', // Local market id for product\n dimension54: name, // '[[Product Local market Name]]', // Local market name for product\n dimension55: category, // '[[Product Range]]', // Range of the product, eg: Barista Creations for Ice (Nessoft Category)\n dimension56: technology, // '[[Product Technology]]', //Product technology according to Nespresso categorization (original, vertuo, pro)\n dimension57: bundled ? 'bundle' : 'single', // '[[Product Type]]', //If the product is single or bundle\n dimension192: inStock ? 'in stock' : 'out of stock', // '[in stock]', // \"in stock\" or \"out of stock\"\n category: type, // '[[Product Category]]', //Product category according to Nespresso categorization (Nessoft type): capsule, accessory, machine\n brand: 'Nespresso' // Static value set to Nespresso\n }\n ]\n}\n\nexport const trackDetailView = async (sku, data) => {\n // https://dsu-confluence.nestle.biz/display/DIANA/HQ+PB+Tracking+-+Product+Detail+View\n if (window.pbTrackDetailViewPDP || !sku || !window.napi) {\n return\n }\n\n const productInfo = await getProductInfo(sku, data)\n const productPayload = getProductPayload(productInfo)\n const currency = productInfo.currency\n\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'detailView',\n currencyCode: currency,\n eventRaisedBy: raisedByPB,\n ecommerce: {\n detail: {\n actionField: {},\n products: productPayload\n }\n }\n }\n window.gtmDataObject.push(eventData)\n // Track only once per page\n window.pbTrackDetailViewPDP = true\n emitCustomEvent('detailView', eventData)\n}\n\nexport const trackAddToCartImpression = (product, isStickyBar) => {\n // https://dsu-confluence.nestle.biz/pages/viewpage.action?spaceKey=DIANA&title=PDP+-+Sticky+Add+To+Cart+Custom+Event\n\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'page_builder_component_interaction',\n event_raised_by: raisedByPB,\n component_name: 'before_sku_main_info',\n action_type: isStickyBar\n ? 'sticky add to cart impression'\n : 'standard add to cart impression',\n //product info\n item_id_event: product.internationalId,\n item_name_event: product.internationalName,\n item_category_event: product.type,\n item_price_event: product.price_per_capsule?.split(' ')[0],\n item_market_id_event: product.legacyId,\n item_market_name_event: product.name,\n item_range_event: product.category_name,\n item_technology_event: product.technology?.[0]?.split('/').slice(-1) ?? '',\n item_type_event: product.bundled ? 'bundle' : 'single'\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\nexport const productImpression = async (position, list, sku, data) => {\n // https://dsu-confluence.nestle.biz/pages/viewpage.action?pageId=225612781\n // don't track already tracked products\n window.gtmDataObject = window.gtmDataObject || []\n const hasDetailView = window.gtmDataObject.find(item => item.event === 'detailView')\n const alreadyTracked = !!hasDetailView?.ecommerce?.detail?.products.find(p =>\n sku.includes(p.id)\n )\n if (alreadyTracked) {\n return\n }\n\n const productInfo = await getProductInfo(sku, data)\n const productPayload = getProductPayload(productInfo, { list: list, position: position })\n const currency = productInfo.currency\n const eventData = {\n event: 'impression',\n eventAction: 'Product Impression',\n currencyCode: currency,\n eventRaisedBy: raisedByPB,\n ecommerce: {\n impressions: productPayload\n }\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('impression', eventData)\n}\n\nexport const productClick = async (position, list, sku, data) => {\n // https://dsu-confluence.nestle.biz/pages/viewpage.action?pageId=225612781\n\n if (typeof list !== 'string') return\n\n const productInfo = await getProductInfo(sku, data)\n const productPayload = getProductPayload(productInfo, { position: position })\n const currency = productInfo.currency\n\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'productClick',\n eventAction: 'Product Click',\n currencyCode: currency,\n eventRaisedBy: raisedByPB,\n ecommerce: {\n click: {\n actionField: {\n list: list\n },\n products: productPayload\n }\n }\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('productClick', eventData)\n}\n\nexport function filterTrackingFromPlpFilters(filtersSelected) {\n const grouped = groupSelectedFilters(filtersSelected)\n const groupKeys = Object.keys(grouped)\n const typesFiltersSelected = groupKeys.join('|').substring(0, 99)\n const valuesFiltersSelected = groupKeys\n .map(key => grouped[key].values.map(value => value.split('/').at(-1)).join(','))\n .join('|')\n .substring(0, 99)\n\n return [typesFiltersSelected, valuesFiltersSelected]\n}\n\nexport const filterActionEvent = (\n actionType,\n filterType,\n filterValues,\n clickLocation,\n dataType\n) => {\n // https://dsu-confluence.nestle.biz/display/DIANA/PLP+-+Filter+Revamp\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = getExplicitFilterEventData(\n actionType,\n filterType,\n filterValues,\n clickLocation\n )\n\n window.gtmDataObject.push(eventData)\n if (window.NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING && dataType) {\n window.gtmDataObject.push({\n ...window.NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING,\n experiment_action: `${actionType} - ${dataType}`,\n cta_name: 'All filters'\n })\n }\n\n emitCustomEvent('plp_filter', eventData)\n}\n\nconst getExplicitFilterEventData = (actionType, filterType, filterValues, clickLocation) => {\n return {\n event: 'plp_filter',\n event_raised_by: raisedByPB,\n action_type: actionType,\n filter_type: filterType,\n ...(filterValues ? { filter_values: filterValues } : {}),\n ...(clickLocation ? { click_location: clickLocation } : {})\n }\n}\n\nfunction groupSelectedFilters(filtersSelected = []) {\n return filtersSelected.reduce((grouped, { key, value }) => {\n if (!grouped[key]) grouped[key] = { key, values: [] }\n grouped[key].values.push(value.replaceAll(',', '-'))\n return grouped\n }, {})\n}\n\nfunction arrTolastURLElementMapper(arr) {\n if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n return arr.map(item => item.split('/').pop()?.trim() || '')\n}\n\nfunction arrToJoinedString(arr, joiner = '|') {\n if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n return arr.map(item => item.trim()).join(joiner)\n}\n\nfunction findTechnogiesText(arr) {\n if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n if (arr.length === 1) return cleanText(arrTolastURLElementMapper(arr)?.[0])\n else return 'multiple'\n}\n\nfunction cleanText(str) {\n if (typeof str === 'undefined') return undefined\n\n return str.toString().trim()\n}\n\nconst generateEcommerceObject = async (productIds, options) => {\n const productRequests = productIds.map(SKU => getProduct(SKU))\n const productData = await Promise.all(productRequests)\n\n return {\n ecommerce: {\n currency: window[window.config.padl.namespace].dataLayer.app.app.currency,\n value: productData.reduce((ac, product) => {\n return ac + product.price\n }, 0),\n items: productData.map((product, index) => {\n if (product.type === 'bundle' || product.type === 'giftcard') {\n return {\n item_id: cleanText(product.internationalId),\n item_name: cleanText(product.internationalName),\n item_brand: 'nespresso',\n item_category: cleanText(product.type),\n index: index + 1\n }\n }\n\n let output = {\n item_id: cleanText(product.internationalId),\n item_name: cleanText(product.internationalName),\n item_brand: 'nespresso',\n item_category: cleanText(product.type),\n item_category2: arrToJoinedString(\n arrTolastURLElementMapper(product.technologies)\n ),\n item_category3: cleanText(product.category),\n price: product.price,\n quantity: product.salesMultiple,\n affiliation: 'nespresso online store',\n coupon: undefined,\n discount: undefined,\n location_id: undefined,\n item_list_name: cleanText(options?.listName),\n item_list_id: cleanText(options?.listId),\n index: index + 1,\n item_market_id: cleanText(product.legacyId),\n item_market_name: cleanText(product.name),\n item_technology: findTechnogiesText(product.technologies),\n item_range: cleanText(product.category),\n item_discovery_offer: product.category.includes('discovery').toString(),\n item_added_by_user: undefined,\n item_ecotax_applicable: product?.displayEcoTax\n ? cleanText(product?.displayEcoTax.toString())\n : undefined,\n item_selection_list: cleanText(arrToJoinedString(product.productSelections)),\n item_in_stock: product?.inStock\n ? cleanText(product?.inStock.toString())\n : undefined,\n item_subscription_name: undefined,\n item_subscription_category: undefined,\n item_subscription_price: undefined,\n item_subscription_duration: undefined,\n item_subscription_fee: undefined\n }\n\n switch (product.type) {\n case 'capsule': {\n const capsuleProduct = product\n\n output.item_category4 = capsuleProduct.bundled ? 'bundle' : 'single'\n\n output.item_type = capsuleProduct.bundled ? 'bundle' : 'single'\n\n output.item_coffee_aromatic_profile = cleanText(\n arrToJoinedString(capsuleProduct.capsuleProductAromatics)?.toLowerCase()\n )\n\n output.item_coffee_intensity =\n cleanText(capsuleProduct.capsuleProperties.intensity) ?? undefined\n\n output.item_coffee_cup_size = cleanText(\n arrToJoinedString(capsuleProduct.capsuleCupSizes)\n )?.toLowerCase()\n\n break\n }\n case 'machine': {\n const machineProduct = product\n\n output.item_machine_shade = cleanText(machineProduct.colorShade?.name)\n\n break\n }\n }\n\n if (product.type === 'machine' || product.type === 'accessory') {\n output.item_avg_rating = product.ratingCode\n output.item_number_of_reviews = product.ratingCode\n }\n\n return output\n })\n }\n }\n}\n\nexport const selectItems = async (productIds, options) => {\n const ecommerceObject = await generateEcommerceObject(productIds, options)\n\n const output = {\n event: 'select_item',\n event_raised_by: options?.eventRaisedBy ?? 'before_cross_sell_v3',\n click_location: options?.clickLocation ?? 'page builder cross sell quick view',\n item_list_id: options?.listId ?? 'before_cross_sell_v3',\n subscription_product_included: 'false',\n discovery_offer_included: 'false',\n ...ecommerceObject\n }\n\n window.gtmDataObject.push({ ecommerce: null })\n window.gtmDataObject.push(output)\n}\n\nexport const viewItemList = async (productIds, options) => {\n const ecommerceObject = await generateEcommerceObject(productIds, options)\n\n const output = {\n event: 'view_item_list',\n event_raised_by: options?.eventRaisedBy,\n subscription_product_included: 'false',\n discovery_offer_included: 'false',\n ...ecommerceObject\n }\n\n if (options?.eventRaisedBy === undefined) delete output.event_raised_by\n\n window.gtmDataObject.push({ ecommerce: null })\n window.gtmDataObject.push(output)\n}\n\nexport const isGtmTrackingExists = trackingData => {\n window.gtmDataObject = window.gtmDataObject || []\n\n return window.gtmDataObject.some(\n event =>\n event.event === trackingData.event &&\n event.ecommerce?.creative_slot === trackingData.campaign.position &&\n event.ecommerce?.promotion_id === trackingData.campaign.id &&\n event.ecommerce?.promotion_name === trackingData.campaign.name &&\n event.ecommerce?.creative_name === trackingData.campaign.creative\n )\n}\n","import { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { renderLabels } from './fragments/labels'\nimport { renderLogos } from '@kissui/helpers/src/logos.helpers'\nimport { renderImage } from './fragments/image'\nimport { renderHeading } from './fragments/heading'\nimport { renderHeadline } from './fragments/headline'\nimport { renderLabelTechnology } from './fragments/labelTechnology'\nimport { renderLabelRange } from './fragments/labelRange'\nimport { renderQuickView } from './fragments/quickView'\nimport { renderStrikethroughPrice } from './fragments/strikethroughPrice'\nimport { renderPrice } from './fragments/price'\nimport { renderAddToCart } from './fragments/addToCart'\nimport { renderAdditionalMessage } from './fragments/additionalMessage'\nimport { setCardTheme } from './fragments/setCardTheme'\nimport { getSkuQuickViewData } from '@kissui/components/src/sku-quick-view/shared-quick-view'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { getTechnologyName, getProduct } from '@kissui/helpers/src/catalog'\nimport { trackComponentInteraction, productClick } from '@kissui/helpers/src/gtmEvents'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\n\nclass Sku extends NespressoElement {\n constructor() {\n super()\n this.type = 'default'\n this.popinId = ''\n this.isQuickViewPlp = false\n this.boundOnPDPLinkClick = this.onPDPLinkClick.bind(this)\n this.boundOnQuickViewOpen = this.onQuickViewOpen.bind(this)\n this.clickMethod = this.boundOnPDPLinkClick\n }\n\n loadTemplate() {\n this.classList.add('nb-sku')\n this.classList.add(`nb-sku__${this.type}`)\n setCardTheme(this.props, this)\n\n Object.assign(this.props, this.getSleevePrice(this.props))\n Object.assign(this.props, this.checkHiddenPriceForLoggedInUser(this.props))\n\n const { quick_view_plp = {} } = this.props\n this.isQuickViewPlp = quick_view_plp?.show_view || false\n this.clickMethod = this.isQuickViewPlp\n ? this.boundOnQuickViewOpen\n : this.boundOnPDPLinkClick\n\n this.template = `${this.renderVisual()}\n ${this.renderHeader()}\n <div class=\"cb-content\">\n ${this.renderInformation()}\n ${this.isQuickViewPlp ? this.renderQuickView() : ''}\n <div class=\"cb-shop\">\n <div class=\"cb-price\">\n ${this.renderPricing()}\n </div>\n ${this.renderAction()}\n </div>\n ${this.renderFooter()}\n </div>`\n\n this.render()\n }\n\n onReady() {\n const { activeSku, sku } = this.props\n this.setAttribute('data-product-short-sku', activeSku || sku)\n this.bindEvent()\n }\n\n renderHeaderDefault() {\n return `${renderLabels(this.props, this)}${renderLogos(this.props, this)}`\n }\n\n renderHeader() {\n return this.renderHeaderDefault()\n }\n\n renderVisualDefault() {\n const theme = this.hasAttribute('portrait') ? 'portrait' : 'landscape'\n return renderImage(this.props, theme)\n }\n\n getSleevePrice({ number_of_sleeves, price }) {\n let hasPricePerSleeve = true\n let sleevePrice\n if (number_of_sleeves === '1') {\n sleevePrice = price\n } else {\n hasPricePerSleeve = false\n }\n return { hasPricePerSleeve, sleevePrice }\n }\n\n checkHiddenPriceForLoggedInUser({ hidePrice, show_view_details }) {\n return {\n hidePrice: isLoggedIn() ? false : hidePrice,\n show_view_details: isLoggedIn() ? false : show_view_details\n }\n }\n\n renderVisual() {\n return this.renderVisualDefault()\n }\n\n renderInformationDefault() {\n return `${renderLabelTechnology(this.props)}\n ${renderLabelRange(this.props)}\n ${renderHeading(this.props)}\n ${renderHeadline(this.props)}`\n }\n\n renderInformation() {\n return this.renderInformationDefault()\n }\n\n renderQuickView() {\n return renderQuickView(this.props)\n }\n\n renderPricingDefault() {\n const isPortrait = this.hasAttribute('portrait')\n\n const pricingWithClass = `\n ${renderStrikethroughPrice(this.props, this)}\n <div class=\"${isPortrait ? 't-md-700-sl' : 't-sm-700-sl'}\">\n ${renderPrice(this.props)}\n </div>`\n\n return pricingWithClass\n }\n\n renderPricing() {\n return this.renderPricingDefault()\n }\n\n renderActionDefault() {\n return renderAddToCart(this.props, false, this)\n }\n\n renderAction() {\n const actionSlot = this.querySelector('[slot=\"action\"]')?.outerHTML\n if (actionSlot) {\n return actionSlot\n }\n return this.renderActionDefault()\n }\n\n renderFooterDefault() {\n return renderAdditionalMessage(this.props)\n }\n\n renderFooter() {\n return this.renderFooterDefault()\n }\n\n async onPDPLinkClick() {\n const productIndex = this.getAttribute('tracking_position') || 0\n const list = this.getAttribute('tracking_list') || ''\n\n await productClick(productIndex, list, this.props.longSku)\n }\n\n renderSkuQuickView(product) {\n this.popinId = `plp-quick-view`\n\n let quickViewElement = document.querySelector(`#${this.popinId}`)\n if (quickViewElement) {\n quickViewElement.remove()\n }\n\n getSkuQuickViewData(product, this.popinId, this.props, VARIATION_PLP)\n }\n\n async onQuickViewOpen(e) {\n e.preventDefault()\n\n const { sku } = this.props\n if (!sku) {\n return\n }\n\n try {\n const product = await getProduct(sku)\n\n this.renderSkuQuickView(product)\n trackComponentInteraction({\n creative: this.props.campaign?.creative,\n actionType: 'pdp quick view',\n internationalId: product.internationalId,\n internationalName: product.internationalName,\n productType: product.type,\n technology: getTechnologyName(product),\n category: product.category,\n rawPrice: product.price,\n eventAction: 'PDP Quick View'\n })\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: this.popinId } })\n } catch (e) {\n console.error(`getProduct fail on sku ${sku}`)\n }\n return false\n }\n\n bindEvent() {\n this.unbindEvent()\n const showQuickView = this.props.quick_view_plp?.show_view\n const quickViewTextExists = this.props.quick_view_plp?.quick_view_text\n\n if (!quickViewTextExists) {\n this.classList.add('sku-hover')\n }\n\n if (showQuickView && this.props.variation === VARIATION_PLP) {\n const elements = quickViewTextExists ? this.querySelectorAll('nb-link button') : [this]\n\n elements.forEach(element => {\n element.addEventListener('click', this.clickMethod)\n })\n\n // to avoid adding click event to the button inside the sku card\n this.addStopPropagationEvent('nb-add-to-cart')\n this.addStopPropagationEvent('nb-cta')\n }\n }\n\n unbindEvent() {\n const showQuickView = this.props.quick_view_plp?.show_view\n const quickViewTextExists = this.props.quick_view_plp?.quick_view_text\n\n if (showQuickView && this.props.variation === VARIATION_PLP) {\n const elements = quickViewTextExists ? this.querySelectorAll('nb-link button') : [this]\n\n elements.forEach(element => {\n element.removeEventListener('click', this.clickMethod)\n })\n\n this.removeStopPropagationEvent('nb-add-to-cart')\n this.removeStopPropagationEvent('nb-cta')\n }\n }\n\n addStopPropagationEvent(selector) {\n const element = this.querySelector(selector)\n if (element) {\n element.addEventListener('click', this.stopPropagationHandler)\n }\n }\n\n removeStopPropagationEvent(selector) {\n const element = this.querySelector(selector)\n if (element) {\n element.removeEventListener('click', this.stopPropagationHandler)\n }\n }\n\n stopPropagationHandler(event) {\n event.stopPropagation()\n }\n\n disconnectedCallback() {\n this.unbindEvent()\n }\n}\n\ncustomElements.get('nb-sku') || customElements.define('nb-sku', Sku)\n\nexport default Sku\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { VARIATION_PDP, VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { ECAPI_TYPE_CAPSULE } from '@kissui/helpers/src/catalog'\n\nexport const setCardTheme = ({ variation, type }, component) => {\n // PDP\n if (variation === VARIATION_PDP) {\n component.setAttribute('pdp', 'true') // Used by CSS to increase font-size, etc.\n }\n\n // COFFEE on PLP on MOBILE\n if (variation === VARIATION_PLP && type === ECAPI_TYPE_CAPSULE && viewportHelper.is.mobile) {\n component.setAttribute('landscape', 'true')\n return\n }\n\n component.setAttribute('portrait', 'true')\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\n/**\n * Display labels\n * @param {Object[]} labels - List of labels\n * @param {string} labels[].name - Text\n * @param {string} labels[].bgColor - Background\n * @param {string} labels[].color - Font color\n * @param {HTMLElement} component - Apply css on component\n * @returns {String} - Render of labels\n */\nexport const renderLabels = ({ labels = [] }, component = null) => {\n if (!component || !labels || !labels.length) {\n return ''\n }\n\n if (component && labels.length) {\n component.classList.add('has-labels')\n }\n\n const direction = viewportHelper.is.mobile ? 'row' : 'column'\n const data = stringifyForAttribute({ labels })\n\n return `<nb-card-labels data=\"${data}\" direction=\"${direction}\"></nb-card-labels>`\n}\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nexport const renderLogos = (props, component) => {\n const {\n fair_trade,\n alt_fair_trade,\n is_organic,\n alt_organic,\n only_vertuo_next,\n alt_vertuo_next,\n is_rainforest,\n alt_rainforest,\n is_sustainable,\n alt_sustainable,\n is_q_certified_arabica,\n alt_q_certification_arabica,\n logos\n } = props\n\n if (\n !fair_trade &&\n !is_organic &&\n !only_vertuo_next &&\n !is_rainforest &&\n !is_sustainable &&\n !is_q_certified_arabica &&\n (logos == null || logos.length < 1)\n ) {\n return ''\n }\n\n component.classList.add('has-logos')\n\n const data = {\n fair_trade,\n alt_fair_trade,\n is_organic,\n alt_organic,\n only_vertuo_next,\n alt_vertuo_next,\n is_rainforest,\n alt_rainforest,\n is_sustainable,\n alt_sustainable,\n is_q_certified_arabica,\n alt_q_certification_arabica,\n logos\n }\n return `<nb-card-logos data='${stringifyForAttribute(data)}'></nb-card-logos>`\n}\n","import './image.scss'\n\nexport const renderImage = (\n { url, image_alt_text, image, quick_view_plp = {} },\n theme = 'portrait'\n) => {\n if (!image) {\n return ''\n }\n\n let img = `<nb-img file=\"${image}\"\n description=\"${image_alt_text}\"\n aspect_ratio=\"${theme === 'portrait' ? '16/9' : '1/1'}\"\n object_fit=\"contain\"\n force_height=\"${theme === 'portrait' ? '160' : '120'}\">\n </nb-img>`\n\n const renderClass = url ? '' : 'class=\"cursor-default\"'\n\n if (url || quick_view_plp?.show_view) {\n const linkHref = url || 'javascript:void(0)'\n img = `<a ${renderClass.trim()} href=\"${linkHref}\" target=\"_self\" aria-hidden=\"true\" tabindex=\"-1\">${img}</a>`\n }\n\n return `<div class=\"cb-image\">\n ${img}\n </div>`\n}\n","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 { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { setAttributes } from '@kissui/helpers/src/utils'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nconst bundlePopinIDPrefix = 'bundle-popin-id-'\nlet bundlePopinContent = ''\nlet label_close\n\nexport const renderBundlePopinLink = (\n { type, bundle_details, bundled, sku, position, range },\n component\n) => {\n if (\n type === 'capsule' &&\n bundle_details &&\n bundle_details.popin_link_text &&\n bundled === true\n ) {\n bundlePopinContent = `<nb-bundle-details\n main_sku='${sku}'\n description='${bundle_details.description}'\n other_skus='${bundle_details.other_skus}'\n other_skus_quantity= '${bundle_details.other_skus_quantity}'\n range='${range}'\n position='${position}'>\n </nb-bundle-details>`\n\n component.variation = 'white'\n\n label_close = bundle_details.popin_label_close\n return `<nb-link class=\"cb-cta-bundle\" size=\"large\" color=\"gold\" label=\"${bundle_details.popin_link_text}\"></nb-link>`\n }\n return ''\n}\n\nexport const openBundlePopin = component => {\n const sku = component.props.legacyId || ''\n renderPopinBundleDetail(component)\n let bundlePopinID = bundlePopinIDPrefix + sku\n component.bundlePopIn = document.getElementById(bundlePopinID)\n component.appendChild(component.bundlePopIn)\n\n setAttributes(component.bundlePopIn, {\n variation: 'before',\n bgcolor: 'white',\n size: 'L',\n padding: 'false',\n label_close,\n content: bundlePopinContent\n })\n\n component.bundlePopIn.classList.add('nb-popin--bundle')\n\n dispatchEvent({\n eventName: EVENT_POPIN_OPEN,\n args: { id: bundlePopinID }\n })\n}\n\nconst renderPopinBundleDetail = component => {\n const sku = component.props.legacyId || ''\n let bundlePopinID = bundlePopinIDPrefix + sku\n if (document.getElementById(bundlePopinID) != null) return\n\n let popin = document.createElement('nb-popin')\n\n popin = component.appendChild(popin)\n popin.setAttribute('id', bundlePopinID)\n popin.setAttribute('content', '')\n}\n","/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","import{options as r}from\"preact\";export{Fragment}from\"preact\";var _=0;function o(o,e,n,t,f,l){var s,u,a={};for(u in e)\"ref\"==u?s=e[u]:a[u]=e[u];var i={type:o,props:a,key:n,ref:s,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:--_,__source:f,__self:l};if(\"function\"==typeof o&&(s=o.defaultProps))for(u in s)void 0===a[u]&&(a[u]=s[u]);return r.vnode&&r.vnode(i),i}export{o as jsx,o as jsxDEV,o as jsxs};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","import cn from 'classnames'\nimport styles from './CompatibilityButton.module.scss'\n\nexport type CompatibilityButtonProps = {\n /** The button text */\n text: string\n /** If set, the text will be text aligned center */\n textCentered?: boolean\n /** Button click handler */\n onClick: (event: MouseEvent) => void\n /** If true, the focus styles will be persistently applied after clicking */\n maintainElementFocus?: boolean\n /** Additional class */\n class?: string\n}\n\nexport default function CompatibilityButton({\n class: className,\n onClick,\n text,\n textCentered,\n maintainElementFocus\n}: CompatibilityButtonProps) {\n const classes = cn(\n styles.button,\n maintainElementFocus ? styles.buttonFocus : null,\n className\n )\n return (\n <button class={classes} type=\"button\" onClick={onClick}>\n <span class={styles.inner}>\n <span class={styles.contents}>\n <span class={styles.icon} />\n <span class={cn(\n styles.text,\n textCentered ? styles.textCentered : null\n )}>{text}</span>\n <span class={styles.chevron} />\n </span>\n </span>\n </button>\n )\n}\n","async function fetchHtml(url: string): Promise<string | null> {\n try {\n const response = await fetch(url)\n if (response.ok) {\n const html = await response.text()\n return html\n }\n return null\n } catch (error) {\n return null\n }\n}\n\nfunction parseHtml(html: string): Document | null {\n const parser = new DOMParser()\n try {\n const result = parser.parseFromString(html, 'text/html')\n return result\n } catch (error) {\n return null\n }\n}\n\nexport async function fetchAndParse(url: string): Promise<string> {\n const document = await fetchHtml(url)\n if (!document) return ''\n const parser = parseHtml(document)\n if (!parser) return '' // error parsing\n const { body } = parser\n const mainTag = Array.from<HTMLElement>(body.querySelectorAll('main#main')) // there's 2 <main>s on the page!\n if (mainTag.length === 0) return '' // no main tag!\n\n // filter out span.visually-hidden!\n if (mainTag[0].children.length > 0) {\n Array.from(mainTag[0].children).forEach(child => {\n if (child.classList.contains('visually-hidden')) {\n child.remove()\n }\n })\n }\n return mainTag[0].innerHTML\n}\n","import { createContext, type ComponentChildren } from 'preact'\nimport {\n useRef,\n useEffect,\n useState,\n useMemo,\n useContext,\n type StateUpdater\n} from 'preact/hooks'\nimport cn from 'classnames'\nimport styles from './ModalDrawer.module.scss'\nimport isOldSafari from '@kissui/apps/src/utils/isOldSafari'\n\nexport type ModalDrawerParentContext = {\n setFooter: StateUpdater<ComponentChildren>\n}\n\nconst Context = createContext<ModalDrawerParentContext>({ setFooter: () => { } })\n\nexport type ModalDrawerProps = {\n children: ComponentChildren\n title: ComponentChildren\n closeIconAltText: string\n isOpen?: boolean\n maxHeightMobile?: 25 | 33 | 50 | 66 | 75 | 87 | 100\n onClose?: () => void\n}\n\nexport default function ModalDrawer({\n children,\n title,\n closeIconAltText,\n isOpen = false,\n maxHeightMobile = 75,\n onClose = () => { }\n}: ModalDrawerProps) {\n const dialogRef = useRef<HTMLDialogElement>(null)\n const [isClosing, setIsClosing] = useState<boolean>(false)\n const [footer, setFooter] = useState<ComponentChildren>(null)\n\n function hideModal() {\n setIsClosing(true)\n // have to manually close after animation due to Safari\n const close = () => {\n setIsClosing(false)\n dialogRef.current?.close()\n dialogRef.current?.removeEventListener('animationend', close)\n }\n dialogRef.current?.addEventListener('animationend', close)\n }\n\n useEffect(() => {\n if (!dialogRef || !dialogRef.current) return undefined\n\n // handles old safari + <dialog> support with dynamic import polyfill\n if (isOldSafari(navigator?.userAgent)) {\n (async () => {\n if (dialogRef.current) {\n try {\n const { default: dialogPolyfill } = await import('dialog-polyfill')\n dialogPolyfill.registerDialog(dialogRef.current)\n } catch (error) {\n\n }\n }\n })()\n }\n\n function onDialogClick(event: MouseEvent) {\n if (event.target === dialogRef.current) {\n onClose()\n }\n }\n\n dialogRef.current?.addEventListener('click', onDialogClick)\n\n return () => {\n dialogRef.current?.removeEventListener('click', onDialogClick)\n }\n }, [dialogRef.current])\n\n useEffect(() => {\n if (!dialogRef || !dialogRef.current) return\n\n if (isOpen) {\n dialogRef.current.showModal()\n } else if (dialogRef.current.open) {\n hideModal()\n }\n }, [dialogRef?.current, isOpen])\n\n const parentContext = useMemo<ModalDrawerParentContext>(\n () => ({\n setFooter\n }),\n [setFooter]\n )\n\n return (\n <dialog\n ref={dialogRef}\n onClose={onClose}\n class={cn(\n styles.container,\n { [styles.isClosing]: isClosing },\n styles[`h${maxHeightMobile}`]\n )}\n >\n {(isOpen || isClosing) && (\n <article class={styles.article}>\n <Context.Provider value={parentContext}>\n <header class={styles.header}>\n <h2 class={styles.title}>{title}</h2>\n <button\n class={styles.closeButton}\n type=\"button\"\n onClick={onClose}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n aria-label={closeIconAltText}\n />\n </header>\n <div class={styles.content}>{children}</div>\n {footer && <footer class={styles.footer}>{footer}</footer>}\n </Context.Provider>\n </article>\n )}\n </dialog>\n )\n}\n\nexport type ModalDrawerFooterProps = {\n children: ComponentChildren\n}\n\nModalDrawer.Footer = function Footer({ children }: ModalDrawerFooterProps) {\n const { setFooter } = useContext(Context)\n setFooter(children)\n return null\n}\n","/** Returns true if user agent is Safari/iPhone and version is lower than 15.3 */\nexport default function isOldSafari(userAgent?: string) {\n const agent = userAgent ?? navigator.userAgent;\n const versionMatch = agent.match(/Version\\/(\\d+\\.\\d+)/);\n const safariVersion = versionMatch ? parseFloat(versionMatch[1]) : 0;\n const isOlderThan153 = safariVersion < 15.3;\n const isSafari = agent.includes('Safari') && agent.includes('iPhone');\n\n return isSafari && isOlderThan153;\n}\n","import {\n useEffect,\n useState\n} from 'preact/hooks'\nimport { Product } from '@kissui/apps/src/product.type'\nimport { fetchAndParse } from './modalUtils'\nimport useAppData from '@kissui/apps/src/hooks/useAppData'\nimport plpAppData from '@kissui/apps/src/plp-core/store/plp.data'\nimport ModalDrawer from '@kissui/apps/src/components/ModalDrawer/ModalDrawer'\nimport styles from './CompatibilityModal.module.scss'\n\nexport type CompatibilityModalProps = {\n isOpen: boolean\n product: Product | null\n onClose: () => void\n modalSettings: {\n url: string\n title: string\n loadingLabel: string\n loadingLabelError: string\n closeButtonLabel: string\n }\n}\nexport default function CompatibilityModal({\n isOpen,\n product,\n onClose,\n modalSettings: {\n url: compatibilityUrl,\n title: modalTitle,\n loadingLabel,\n loadingLabelError: errorLoadingLabel,\n closeButtonLabel\n }\n}: CompatibilityModalProps) {\n const [data, setData] = useState<CompatibilityState>({\n status: 'INITIAL',\n html: ''\n })\n\n async function fetchData() {\n if (!compatibilityUrl) {\n return\n }\n if (data.status === 'LOADED' || data.status === 'PENDING') {\n return\n }\n setData({ status: 'PENDING', html: '' })\n\n const html = await fetchAndParse(compatibilityUrl)\n if (!html) {\n setData({ status: 'ERROR', html: '' })\n return\n }\n setData({ status: 'LOADED', html })\n }\n\n useEffect(() => {\n if (!isOpen) {\n return\n }\n (async () => {\n try {\n await fetchData()\n } catch (error: any) {\n console.error(error)\n }\n })()\n }, [isOpen])\n\n if (!compatibilityUrl) {\n return null\n }\n\n return (\n <ModalDrawer\n title={modalTitle}\n isOpen={isOpen}\n closeIconAltText={closeButtonLabel}\n onClose={onClose}\n maxHeightMobile={87}>\n {data.status === 'LOADED' && <Loaded html={data.html} />}\n {data.status === 'PENDING' && <Pending label={loadingLabel}></Pending>}\n {data.status === 'ERROR' && <Error label={errorLoadingLabel}></Error>}\n </ModalDrawer>\n )\n}\n\nfunction Loaded({ html }: { html: string }) {\n return (\n <div class={styles.stateLoaded} dangerouslySetInnerHTML={{ __html: html }} />\n )\n}\n\nfunction Pending({ label }: { label: string }) {\n return (\n <div class={styles.statePending}>{label}</div>\n )\n}\n\nfunction Error({ label }: { label: string }) {\n return (\n <div class={styles.stateError}>{label}</div>\n )\n}\n\ntype CompatibilityState = {\n status: 'INITIAL' | 'PENDING' | 'LOADED' | 'ERROR'\n html: string\n}\n","import{h as t,hydrate as e,render as n,cloneElement as o}from\"preact\";function r(){return(r=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])}return t}).apply(this,arguments)}function i(t){this.getChildContext=function(){return t.context};var e=t.children,n=function(t,e){if(null==t)return{};var n,o,r={},i=Object.keys(t);for(o=0;o<i.length;o++)e.indexOf(n=i[o])>=0||(r[n]=t[n]);return r}(t,[\"context\",\"children\"]);return o(e,n)}function a(){var o=new CustomEvent(\"_preact\",{detail:{},bubbles:!0,cancelable:!0});this.dispatchEvent(o),this._vdom=t(i,r({},this._props,{context:o.detail.context}),function e(n,o){if(3===n.nodeType)return n.data;if(1!==n.nodeType)return null;var r=[],i={},a=0,c=n.attributes,l=n.childNodes;for(a=c.length;a--;)\"slot\"!==c[a].name&&(i[c[a].name]=c[a].value,i[s(c[a].name)]=c[a].value);for(a=l.length;a--;){var p=e(l[a],null),d=l[a].slot;d?i[d]=t(u,{name:d},p):r[a]=p}var h=o?t(u,null,r):r;return t(o||n.nodeName.toLowerCase(),i,h)}(this,this._vdomComponent)),(this.hasAttribute(\"hydrate\")?e:n)(this._vdom,this._root)}function s(t){return t.replace(/-(\\w)/g,function(t,e){return e?e.toUpperCase():\"\"})}function c(t,e,r){if(this._vdom){var i={};i[t]=r=null==r?void 0:r,i[s(t)]=r,this._vdom=o(this._vdom,i),n(this._vdom,this._root)}}function l(){n(this._vdom=null,this._root)}function u(e,n){var o=this;return t(\"slot\",r({},e,{ref:function(t){t?(o.ref=t,o._listener||(o._listener=function(t){t.stopPropagation(),t.detail.context=n},t.addEventListener(\"_preact\",o._listener))):o.ref.removeEventListener(\"_preact\",o._listener)}}))}export default function(t,e,n,o){function r(){var e=Reflect.construct(HTMLElement,[],r);return e._vdomComponent=t,e._root=o&&o.shadow?e.attachShadow({mode:\"open\"}):e,e}return(r.prototype=Object.create(HTMLElement.prototype)).constructor=r,r.prototype.connectedCallback=a,r.prototype.attributeChangedCallback=c,r.prototype.disconnectedCallback=l,n=n||t.observedAttributes||Object.keys(t.propTypes||{}),r.observedAttributes=n,n.forEach(function(t){Object.defineProperty(r.prototype,t,{get:function(){return this._vdom.props[t]},set:function(e){this._vdom?this.attributeChangedCallback(t,null,e):(this._props||(this._props={}),this._props[t]=e,this.connectedCallback());var n=typeof e;null!=e&&\"string\"!==n&&\"boolean\"!==n&&\"number\"!==n||this.setAttribute(t,e)}})}),customElements.define(e||t.tagName||t.displayName||t.name,r)}\n//# sourceMappingURL=preact-custom-element.esm.js.map\n","import register from 'preact-custom-element'\nimport { useRef, useEffect, useState } from 'preact/hooks'\nimport type { Ref } from 'preact/hooks'\nimport type { FunctionComponent } from 'preact'\n\n/**\n * Turns a Preact component into a Web Component,\n * allowing the component to be used in either context\n * @param func A (P)React function component\n * @param tagName The Web Component tag name, like 'my-component'\n * @param observedAttributes Array of element attributes to observe for changes\n * @param options Additional web component options\n * @returns The custom element\n */\nexport default function asWebComponent(\n func: FunctionComponent<any>,\n tagName: string,\n observedAttributes?: string[],\n options?: { shadow: boolean }\n): CustomElementConstructor {\n if (customElements.get(tagName)) {\n return customElements.get(tagName) as CustomElementConstructor\n }\n register(func, tagName, observedAttributes, options)\n return customElements.get(tagName) as CustomElementConstructor\n}\n\ninterface useCustomElementReturn {\n immediateChildRef: Ref<any>\n customElement: HTMLElement | null | undefined\n}\n\n/**\n * Allows access to the Web Component wrapper, from within the Preact Component\n */\nexport function useCustomElement(): useCustomElementReturn {\n const ref = useRef<any>(null)\n const [customElement, setCustomElement] = useState(undefined)\n useEffect(() => {\n setCustomElement(ref.current?.parentElement)\n }, [ref])\n\n return { immediateChildRef: ref, customElement }\n}\n","import CompatibilityButton from \"@kissui/components/src/compatibility/CompatibilityButton/CompatibilityButton\"\nimport CompatibilityModal, { CompatibilityModalProps } from \"@kissui/components/src/compatibility/CompatibilityModal/CompatibilityModal\"\nimport { Product } from \"@kissui/apps/src/product.type\"\nimport asWebComponent from \"@kissui/helpers/src/asWebComponent\"\nimport { useState } from \"preact/hooks\"\nimport styles from './compatibility-section.module.scss'\n\n/** Should match the schema data structure */\ntype SkuMainInfoCompatibilitySchema = {\n compatibility_modal_url: string\n compatibility_modal_title: string\n compatibility_modal_loading_text: string\n compatibility_modal_loading_text_error: string\n compatibility_modal_close_button_ally: string\n compatibility_card_button_text: string\n}\n\ntype CompatibilityProps = {\n /** A stringified version of the product */\n product: string\n compatibility: string\n}\nfunction Compatibility({ product: productStringified, compatibility: compatibilityStringified }: CompatibilityProps) {\n const [modalState, setModalState] = useState<Product | null>(null)\n\n let product: Product | null = null\n let compatibilityDataParsed: SkuMainInfoCompatibilitySchema | null = null\n\n\n try {\n product = JSON.parse(productStringified) as Product\n compatibilityDataParsed = JSON.parse(compatibilityStringified) as SkuMainInfoCompatibilitySchema\n } catch (error) {\n return null // do not render the compatibility button\n }\n if (!product || !compatibilityDataParsed) return null\n\n\n const toggleCompatibilityModal = (product: Product) => {\n setModalState(product)\n }\n const hideModal = () => {\n setModalState(null)\n }\n\n function handleCompatibilityClick(event: MouseEvent, product: Product) {\n event.stopPropagation()\n event.preventDefault()\n toggleCompatibilityModal(product)\n }\n\n const compatibilityButtonLabel = compatibilityDataParsed?.compatibility_card_button_text ?? ''\n const modalSettings: CompatibilityModalProps['modalSettings'] = {\n url: compatibilityDataParsed?.compatibility_modal_url ?? '',\n title: compatibilityDataParsed?.compatibility_modal_title ?? '',\n loadingLabel: compatibilityDataParsed?.compatibility_modal_loading_text ?? '',\n loadingLabelError: compatibilityDataParsed?.compatibility_modal_loading_text_error ?? '',\n closeButtonLabel: compatibilityDataParsed?.compatibility_modal_close_button_ally ?? ''\n }\n\n if (!compatibilityButtonLabel) return null\n\n // we don't want to persist the compat button focus on the PDP\n const isPDP = (product.variation ?? '') === 'pdp'\n\n return (<>\n <CompatibilityButton\n text={compatibilityButtonLabel}\n textCentered\n onClick={(e) => handleCompatibilityClick(e, product)}\n class={styles.button}\n maintainElementFocus={!isPDP}\n ></CompatibilityButton>\n <CompatibilityModal\n isOpen={!!modalState}\n product={modalState}\n onClose={hideModal}\n modalSettings={modalSettings}\n ></CompatibilityModal>\n </>)\n}\n\nexport default asWebComponent(Compatibility, 'nb-compatibility-section')\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { renderHeading as renderHeadingSku } from '@kissui/components/src/sku/fragments/heading'\n\nconst getDecaffeinatoRegExp = props => {\n const { label_decaffeinato } = props\n return new RegExp(label_decaffeinato, 'ig')\n}\n\nconst hasDecaffeinato = (props, heading) => {\n const { label_decaffeinato } = props\n\n return (\n label_decaffeinato &&\n label_decaffeinato !== '' &&\n getDecaffeinatoRegExp(props).test(heading)\n )\n}\n\nexport const renderHeading = props => {\n const { name } = props\n\n if (hasDecaffeinato(props, name)) {\n const { label_decaffeinato } = props\n const className = viewportHelper.is.mobile ? 't-xs-700-sl' : 't-md-700-sl'\n\n props.name_custom = name\n .replace(\n getDecaffeinatoRegExp(props),\n `<span class='cb-heading__label ${className}'>${label_decaffeinato}</span>`\n )\n .trim()\n }\n\n return renderHeadingSku(props)\n}\n","import { interpolate } from '@kissui/helpers/src/utils'\nimport { getSleeveNumber } from '@kissui/helpers/src/catalog'\n\nconst getSleeveLabel = props => {\n const { number_of_sleeves, label_sleeves, label_sleeve } = props\n const sleeveNumber = number_of_sleeves || getSleeveNumber(props)\n return sleeveNumber > 1 && label_sleeves ? label_sleeves : label_sleeve\n}\n\nconst getQuantity = ({ bundled, sales_multiple, unit_quantity, unitQuantity }) =>\n bundled === false ? sales_multiple : unit_quantity || unitQuantity || 0\n\nexport const renderShowSleeve = props => {\n const { show_sleeve = false } = props\n\n if (!show_sleeve) {\n return ''\n }\n\n const { label_capsules, sleeve_syntax } = props\n const label = getSleeveLabel(props)\n const quantity = props.number_of_capsules ? props.number_of_capsules : getQuantity(props)\n const sleeveNumber = props.number_of_sleeves ? props.number_of_sleeves : getSleeveNumber(props)\n\n if (!quantity || !sleeveNumber) {\n return ''\n }\n\n const showSleeve = interpolate(\n sleeve_syntax,\n {\n numberOfSleeves: sleeveNumber,\n sleeveLabel: label,\n quantity,\n label_capsules,\n sleevePrice: props.hasPricePerSleeve ? props.sleevePrice : '',\n perSleeveLabel: props.hasPricePerSleeve ? props.perSleeveLabel : ''\n },\n '{',\n '}'\n )\n\n if (!showSleeve) {\n return ''\n }\n\n return `<p class=\"cb-price-items cb-show-sleeve t-xs-500-sl\">${showSleeve}</p>`\n}\n","import Sku from '@kissui/components/src/sku'\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 { renderStrikethroughPrice } from '@kissui/components/src/sku/fragments/strikethroughPrice'\nimport { renderPrice } from '@kissui/components/src/sku/fragments/price'\nimport { renderBundlePopinLink, openBundlePopin } from './fragments/bundle'\nimport { renderIntensity } from './fragments/intensity'\nimport '@kissui/components/src/compatibility/compatibility-section/compatibility-section' // registers the compatibility Preact Web Component!\nimport { renderHeading } from './fragments/heading'\nimport { renderShowSleeve } from './fragments/sleeve'\nimport { renderCapsulePrice } from './fragments/priceCapsule'\nimport { renderBoxTube } from './fragments/boxTube'\nimport { renderPackFormat } from './fragments/packFormat'\nimport { renderSkuQuickViewLink } from './fragments/skuQuickViewLink'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { capsuleHasMachineCompatibilityIssue } from '@kissui/helpers/src/productCompatibility'\n\nclass SkuCoffee extends Sku {\n constructor() {\n super()\n this.type = 'coffee'\n this.boundHandleBundleOpen = this.handleBundleOpen.bind(this)\n }\n\n onReady() {\n this.bundlePopinLink = this.querySelector('.cb-cta-bundle')\n super.onReady()\n }\n\n renderInformation() {\n return `${renderLabelTechnology(this.props)}\n ${renderLabelRange(this.props)}\n ${renderHeading(this.props)}\n ${renderHeadline(this.props)}\n ${renderSkuQuickViewLink(this.props)}\n ${renderIntensity(this.props)}\n ${this.renderCompatibility(this.props)}\n ${renderBundlePopinLink(this.props, this)}\n ${renderBoxTube(this.props)}`\n }\n\n renderCompatibility() {\n // only show the feature on the PDP\n if (this.props.variation !== 'pdp') {\n return ''\n }\n // only show compatibility button if capsule exists in specific range\n if (!capsuleHasMachineCompatibilityIssue(this.props?.ranges ?? [])) {\n return ''\n }\n const compatibilityStringified = this.dataset?.compatibility ?? ''\n if (!compatibilityStringified) {\n return ''\n }\n const compatibilityDataParsed = JSON.parse(compatibilityStringified)\n return `<nb-compatibility-section product=\"${stringifyForAttribute(\n this.props\n )}\" compatibility=\"${stringifyForAttribute(\n compatibilityDataParsed\n )}\"></nb-compatibility-section>`\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 ${renderPackFormat(this.props)}\n ${renderShowSleeve(this.props)}\n ${renderCapsulePrice(this.props)}`\n }\n\n handleBundleOpen() {\n openBundlePopin(this)\n }\n\n bindEvent() {\n super.bindEvent()\n if (this.bundlePopinLink) {\n this.bundlePopinLink.addEventListener('click', this.boundHandleBundleOpen)\n }\n }\n\n unbindEvent() {\n super.unbindEvent()\n if (this.bundlePopinLink) {\n this.bundlePopinLink.removeEventListener('click', this.boundHandleBundleOpen)\n }\n }\n}\n\ncustomElements.get('nb-sku-coffee') || customElements.define('nb-sku-coffee', SkuCoffee)\n\nexport default SkuCoffee\n","import { escapeHtml, stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nexport const renderSkuQuickViewLink = props => {\n const { quick_view_plp, id, campaign, tracking_list, tracking_position } = props\n\n let quickViewLabel = quick_view_plp?.quick_view_text\n\n if (!quick_view_plp?.show_view || !quickViewLabel) {\n return ''\n }\n\n return `<div class=\"cb-link sku-quick-view-link\">\n <nb-link\n target=\"_self\"\n size=\"small\"\n campaign_id=\"${escapeHtml(campaign?.id || '')}\"\n campaign_name=\"${escapeHtml(campaign?.name || '')}\"\n campaign_position=\"${escapeHtml(campaign?.position || '')}\"\n campaign_creative=\"${escapeHtml(campaign?.creative || '')}\"\n data=\"${stringifyForAttribute({ product: { id: id } })}\"\n long_sku=\"${id}\"\n tracking_position=\"${tracking_position}\"\n tracking_list=\"${tracking_list}\"\n >\n ${quickViewLabel}\n </nb-link>\n </div>`\n}\n","import { getMaxIntensity } from '@kissui/components/src/sku-coffee/services'\n\nexport const renderIntensity = ({\n technologies,\n intensity,\n a11y_intensity_max,\n intensity_label = ''\n}) => {\n const maxIntensity = getMaxIntensity({ technologies })\n\n if (intensity === 0) {\n return ''\n }\n\n return `<nb-intensity\n intensity=\"${intensity}\"\n max_intensity=\"${maxIntensity}\"\n a11y_intensity_max=\"${a11y_intensity_max}\"\n intensity_label=\"${intensity_label}\">\n </nb-intensity>`\n}\n","export const renderBoxTube = ({ packaging }) => {\n if (!packaging) {\n return ''\n }\n const { show_packaging, packaging_list, a11y_packaging_label } = packaging\n if (!show_packaging || !packaging_list || !packaging_list.length) {\n return ''\n }\n\n const packagingItem = packaging_list\n .map(({ label, url, selected }) => {\n if (url && !selected) {\n return `<a href=\"${url}\" target=\"_self\"><span class=\"t-sm-400-sl\">${label}</span></a>`\n }\n\n return `<div aria-current=\"page\"><span class=\"t-sm-700-sl\">${label}</span></div>`\n })\n .join('')\n\n return `<div class=\"cb-sku-tab\">\n <span class=\"sr-only\">${a11y_packaging_label}</span>\n ${packagingItem}\n </div>`\n}\n","import { Product } from '@kissui/apps/src/product.type'\n\nconst COMPATIBILITY_RANGE_IDENTIFIER = 'capsule-range-label-compatibility-vertuo' as const\n\n/** Capsules tagged to certain range categories will show the machine compatibility button/modal */\nexport function capsuleHasMachineCompatibilityIssue(ranges: Product['ranges']) {\n const rangesSimple = simplifyRangeIds(ranges)\n return rangesSimple.some(id => id === COMPATIBILITY_RANGE_IDENTIFIER)\n}\n\n/**\n * Full range strings are like: 'nesclub2.es.b2c/cat/capsule-range-label-compatibility-vertuo'\n * @returns The range string without the website/market info\n */\nfunction simplifyRangeIds(ranges: string[]) {\n return ranges.map(range => range.split('/').pop())\n}\n","export const renderPackFormat = ({ packaging }) => {\n if (!packaging) {\n return ''\n }\n const { show_packaging, packaging_list } = packaging\n if (!show_packaging || !packaging_list || !packaging_list.length) {\n return ''\n }\n\n const selectedPack = packaging_list.find(obj => {\n return obj.selected === true\n })\n\n return `<p class=\"cb-price-items cb-pack-format t-xs-500-sl\">${selectedPack.pack_format}</p>`\n}\n","import { interpolate } from '@kissui/helpers/src/utils'\n\nexport const renderCapsulePrice = props => {\n const {\n show_capsule_price = false,\n capsule_price_label,\n capsule_price_syntax = '{capsule_price_label}: {price_per_capsule}',\n price_per_capsule,\n show_sleeve_price\n } = props\n if (!show_capsule_price || !capsule_price_label || !show_sleeve_price) {\n return ''\n }\n\n const pricePerCapsule = interpolate(\n capsule_price_syntax,\n {\n capsule_price_label,\n price_per_capsule\n },\n '{',\n '}'\n )\n\n if (!pricePerCapsule || !price_per_capsule) {\n return ''\n }\n\n return `<p class=\"cb-price-items cb-price-capsule t-xs-500-sl\">${pricePerCapsule}</p>`\n}\n","import createProps from '@kissui/helpers/src/props.helpers'\n\nclass Intensity extends HTMLElement {\n constructor() {\n super()\n this.props = {}\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n }\n\n render() {\n const { intensity_label = 'Intensity', a11y_intensity_max, max_intensity } = this.props\n const intensity = parseInt(this.props.intensity)\n\n if (!intensity || isNaN(intensity)) {\n return ''\n }\n\n const a11yIntensityMax = a11y_intensity_max?.replace('{max_intensity}', max_intensity)\n\n this.innerHTML = `\n <p>\n <span class=\"sr-only\">${intensity_label} ${intensity} ${a11yIntensityMax}</span>\n <div class=\"t-xs-500-sl\" aria-hidden=\"true\">${intensity_label}</div>\n ${this.renderIntensityMin(intensity)}\n <div class=\"t-xs-700-sl\" aria-hidden=\"true\">${intensity}</div>\n ${this.renderIntensityMax(intensity)}\n </p>\n `\n }\n\n renderIntensityMin(intensity) {\n const min_intensity = 0\n\n return new Array(Math.max(intensity, 0) - min_intensity)\n .fill('<span class=\"bar filled\"></span>')\n .join('')\n }\n\n renderIntensityMax(intensity) {\n let { max_intensity } = this.props\n if (!max_intensity || max_intensity === 'undefined') {\n max_intensity = 14\n }\n\n return new Array(parseInt(max_intensity) - Math.min(intensity, parseInt(max_intensity)))\n .fill('<span class=\"bar\"></span>')\n .join('')\n }\n}\n\ncustomElements.get('nb-intensity') || customElements.define('nb-intensity', Intensity)\n\nexport default Intensity\n","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 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 // Search the option to be updated and assign the new value\n this.selected = this.props.options.find(\n option => option.label === this.selectedOption.value\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.value)\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 } = 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 ${heading && `<h2 class=\"${heading_class}\">${heading}</h2>`}\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 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 kill() {\n this.clearListeners()\n }\n\n setOverflowAttribute() {\n this._element.setAttribute(\n 'data-overflowing',\n this.determineOverflow(this._container, this._root)\n )\n\n this.observe()\n }\n\n observe() {\n if (!('IntersectionObserver' in window)) {\n return false\n }\n\n this._entriesBounds = []\n\n // Using IntersectionObserver to prevent reflow while getting boundingClientRect\n const observer = new IntersectionObserver(\n entries => {\n for (const entry of entries) {\n this._entriesBounds.push({\n target: entry.target,\n intersection:\n entry.boundingClientRect.right <=\n window.innerWidth - link_plp_category_padding_x &&\n entry.boundingClientRect.left >= link_plp_category_padding_x,\n boundingClientRect: entry.boundingClientRect\n })\n }\n\n observer.disconnect()\n },\n { root: this._container }\n )\n\n this._slides.map(element => observer.observe(element))\n }\n\n isInViewport(element) {\n if (!this._entriesBounds) {\n return false\n }\n\n const entry = this._entriesBounds.find(entryBound => element === entryBound.target)\n\n return entry.intersection\n }\n}\n\nexport default SliderMenu\n","import SliderMenuLib from './js/SliderMenuLib'\nimport { debounce, makeId } from '@kissui/helpers/src/utils'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { customEvent, itemDisplay } from '@kissui/helpers/src/gtmEvents'\nimport { EVENT_SLIDE_CHANGE, EVENT_SLIDER_READY } from '@kissui/components'\n\nclass SliderMenu extends HTMLElement {\n constructor() {\n super()\n this.slot = this.innerHTML\n this.navBarTravelling = true\n this.disableAutoScroll = false\n this.navBarTravelDirection = ''\n this.navBarTravelDistance = 200\n this.randomId = null\n this.sliderMenu = null\n this.boundOnResize = this.onResize.bind(this)\n this.onLoad = this.onLoad.bind(this)\n this.debouncedOnResize = debounce(this.boundOnResize, 250)\n }\n\n static get observedAttributes() {\n return ['navBarTravelling', 'navBarTravelDirection', 'navBarTravelDistance']\n }\n\n render() {\n const navigation = this.getAttribute('navigation') === 'true' ? true : ''\n const a11y_slider_previous_button = this.getAttribute('a11y_slider_previous_button') || ''\n const a11y_slider_next_button = this.getAttribute('a11y_slider_next_button') || ''\n\n this.innerHTML = `\n <div id=\"pnProductNav-${this.randomId}\" class=\"pn-ProductNavWrapper ${this.randomId}\">\n ${\n navigation &&\n `<nb-cta id=\"pnAdvancerLeft-${this.randomId}\"\n class=\"pn-Advancer pn-AdvancerLeft\"\n variation=\"navigation\"\n contrast=\"highlight\"\n size=\"32\"\n icon_right=\"24/symbol/chevron-left\"\n label=\"${a11y_slider_previous_button}\"></nb-cta>`\n }\n ${this.slot}\n ${\n navigation &&\n `<nb-cta id=\"pnAdvancerRight-${this.randomId}\"\n class=\"pn-Advancer pn-AdvancerRight\"\n variation=\"navigation\"\n contrast=\"highlight\"\n size=\"32\"\n icon_right=\"24/symbol/chevron-right\"\n label=\"${a11y_slider_next_button}\"></nb-cta>`\n }\n <span id=\"pnIndicator-${this.randomId}\"\n class=\"pn-ProductNavIndicator\">\n </span>\n </div>\n\n `\n this.loadSwiper()\n }\n\n connectedCallback() {\n this.randomId = this.getAttribute('testId')\n ? this.getAttribute('testId')\n : `swiperMenu_${makeId(5)}`\n this.navBarTravelling = this.getAttribute('navBarTravelling') || this.navBarTravelling\n this.navBarTravelDirection =\n this.getAttribute('navBarTravelDirection') || this.navBarTravelDirection\n this.navBarTravelDistance =\n this.getAttribute('navBarTravelDistance') || this.navBarTravelDistance\n this.disableAutoScroll = this.getAttribute('disable_auto_scroll') || ''\n\n this.render()\n window.addEventListener('resize', this.debouncedOnResize)\n }\n\n loadSwiper() {\n let navBarTravelDirection = this.navBarTravelDirection\n let navBarTravelDistance = this.navBarTravelDistance\n\n this.sliderMenu = new SliderMenuLib(this.querySelector('.' + this.randomId), {\n id: this.randomId,\n index: this.index,\n navBarTravelDirection: navBarTravelDirection,\n navBarTravelDistance: navBarTravelDistance,\n disableAutoScroll: this.disableAutoScroll\n })\n\n this.sliderMenu.then(() => {\n this.classList.add('is-show')\n\n dispatchEvent({\n eventName: EVENT_SLIDER_READY,\n args: { className: this.randomId },\n element: this\n })\n })\n\n // Updates slider menu to follow semantics, accessibility\n const productNavLinkWrappers = document.querySelectorAll('.pn-ProductNavLinkWrapper')\n productNavLinkWrappers.forEach(div => {\n const li = document.createElement('li')\n li.classList.add('pn-ProductNavLinkWrapper')\n while (div.firstChild) {\n li.appendChild(div.firstChild)\n }\n div.parentNode.replaceChild(li, div)\n })\n }\n\n handleClick() {\n dispatchEvent({ eventName: EVENT_SLIDE_CHANGE })\n\n // GTM 'itemDisplay' event\n itemDisplay({ rootElement: ['nb-slider-menu'] })\n }\n\n onLoad() {\n this.sliderMenu.then(slider => slider.onLoad())\n }\n\n onResize() {\n this.sliderMenu.then(slider => slider.onResize())\n }\n\n onNavigationClick(e) {\n let name = ''\n\n if (\n e.target &&\n e.target.closest('.link') &&\n e.target.closest('.link').getAttribute('tracking_label')\n ) {\n name = e.target.closest('.link').getAttribute('tracking_label')\n }\n\n customEvent({ eventAction: 'PLP Content Tab', eventLabel: name })\n }\n\n disconnectedCallback() {\n window.removeEventListener('resize', this.debouncedOnResize)\n this.sliderMenu.then(slider => slider.kill())\n }\n}\n\ncustomElements.get('nb-slider-menu') || customElements.define('nb-slider-menu', SliderMenu)\n\nexport default SliderMenu\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { makeId, setAttributes, convertToCamelCase } from '@kissui/helpers/src/utils'\nimport { isSafari } from '@kissui/helpers/src/useragent.helpers'\nimport { CONTRAST_LIGHT } from '@kissui/components'\nimport { getOppositeContrast } from '@kissui/helpers/src/contrast.helpers'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { BROWSER_CONTEXT, EVENT_SLIDER_READY } from '../constants.mjs'\n\nconst MAX_LOOP_TO_INIT = 50 // max 5 seconds\n\nclass SliderNatural extends HTMLElement {\n constructor() {\n super()\n // Default options\n this.contrast = CONTRAST_LIGHT\n this.defaultPosition = 0\n this.displayButtons = true\n this.displayNav = true\n this.displayCounter = false\n this.displayGradients = false\n this.itemsPerSlide = 1\n this.overflow = true\n this.overflowOpacity = 0.25\n this.flexAuto = false\n // Events\n this.boundPrevClick = this.#onPrevClick.bind(this)\n this.boundNextClick = this.#onNextClick.bind(this)\n this.boundNavClick = this.#onNavClick.bind(this)\n this.boundScroll = this.#onScroll.bind(this)\n }\n\n connectedCallback() {\n this.slot = this.innerHTML\n this.props = createProps(this.attributes)\n this.#render()\n\n // We need an id for event dispatcher\n if (!this.id || this.id === 'undefined') {\n this.id = this.props.testId ? this.props.testId : `slider_natural_${makeId(5)}`\n }\n\n this.#setProperties()\n\n this.loops = 0\n this.#waitForSliderToBeSized()\n .then(() => {\n this.initSlider()\n this.#dispatchReady()\n })\n .catch(e => {\n console.error(e)\n })\n .finally(() => {\n if (this.wait) {\n clearInterval(this.wait)\n this.wait = null\n }\n })\n }\n\n #waitForSliderToBeSized() {\n return new Promise((resolve, reject) => {\n this.wait = setInterval(() => {\n if (this.carousel.offsetWidth > 0) {\n return resolve()\n }\n\n this.loops += 1\n if (this.loops === MAX_LOOP_TO_INIT) {\n return reject(\n 'Error: slider width is ZERO even after 5s, cannot finish slider init'\n )\n }\n }, 100)\n })\n }\n\n #set(key, value) {\n const normalisedValue = this.#getOption(value)\n if (normalisedValue !== undefined) {\n this[convertToCamelCase(key)] = normalisedValue\n }\n }\n\n #getOption(value) {\n if (!isNaN(value)) {\n return parseFloat(value)\n } else if (value === 'true') {\n return true\n } else if (value === 'false') {\n return false\n } else {\n return value\n }\n }\n\n #setProperties() {\n const { options, a11y_labels } = this.props\n\n // Create refs to html elements\n this.container = this.querySelector('.container')\n this.wrapper = this.querySelector('.wrapper')\n this.carousel = this.querySelector('ul')\n\n // Set slider properties\n this.currentIndex = 0\n this.a11y_labels = a11y_labels\n if (viewportHelper.is.mobile) {\n this.options = options.mobile\n } else if (viewportHelper.is.tablet) {\n this.options = options.tablet\n } else {\n this.options = options.desktop\n }\n\n // Set options\n for (const property in this.options) {\n this.#set(property, this.options[property])\n }\n\n // If counter is displayed we force buttons and pagination to false\n if (this.displayCounter) {\n this.displayNav = this.displayButtons = false\n }\n\n // Overflow needs a class\n if (this.overflow) {\n this.container.classList.add('overflow')\n }\n\n // Contrast needs an attribute\n this.buttonsContrast = getOppositeContrast(this.contrast)\n this.setAttribute('contrast', this.contrast)\n\n // Set CSS properties for non dynamic options\n this.#setCssSlideMinHeight()\n this.#setCssSliderGap()\n this.#setCssPlaceholder()\n }\n\n /** Public Method **/\n initSlider() {\n // Get an updated number of items (if async we run again)\n this.slidesElements = this.querySelectorAll('.nn-carousel > li:not(.safari-fix)')\n this.itemNumber = this.slidesElements.length\n\n // For asynchronous initSlider() we need to reset first itemWidth and itemPerSlide to get the original values before other calculations\n this.#set('item_width', this.options['item_width'])\n this.#set('items_per_slide', this.options['items_per_slide'])\n\n // If itemsPerSlide is 'auto' we need to calculate it's real value based on itemWidth or scrollWidth / itemNumber\n // We also need to set the CSS --item-width variable to handle the calculation correctly\n if (this.itemsPerSlide === 'auto') {\n this.#calculateItemsPerSlide()\n }\n this.#setCssSlideWidth()\n this.#setCssItemsPerSlide()\n this.#setCssFlexAuto()\n\n // Other properties that can be set only after the rest\n this.maxSlides = this.itemNumber - this.itemsPerSlide\n\n // Finish rendering\n this.#renderButtons()\n this.#renderNav()\n this.#renderCounter()\n this.#renderGradients()\n\n // Init methods in this order !\n this.#applyCenteredLayout()\n this.#getSliderPositions()\n this.#getOpacityParams()\n this.#setOpacity()\n this.#updateStates()\n this.#bindEvent()\n this.#gotoDefaultPosition()\n\n // Render this safariFix at the end because we don't want the extra li to be considered in sliderElements\n this.#renderSafariFix()\n }\n\n #render() {\n this.innerHTML = `<div class=\"container\"><div class=\"wrapper\"><ul class=\"nn-carousel\">${this.slot}</ul></div></div>`\n }\n\n #renderButtons() {\n // Important: if maxSlides <= 0 it means we don't have scroll, so we don't need buttons\n const hasNoButton = !this.displayButtons || this.maxSlides <= 0\n if (hasNoButton) {\n // Needed if we reinit\n if (this.prevButton && this.nextButton) {\n this.prevButton.remove()\n this.nextButton.remove()\n }\n return\n }\n\n // Check if button exists already (for async content in order to avoid creating two occurrences)\n if (!this.prevButton) {\n this.prevButton = this.#renderButton('prev')\n }\n if (!this.nextButton) {\n this.nextButton = this.#renderButton('next')\n }\n }\n\n #renderButton(pos, renderInCounter = false) {\n const { creative = '', id = '', name = '', position = '' } = this.props.campaign ?? {}\n const buttonContrast = renderInCounter ? this.contrast : this.buttonsContrast\n const isPrev = pos === 'prev'\n\n const buttonEl = document.createElement('nb-cta')\n buttonEl.classList.add(pos)\n setAttributes(buttonEl, {\n variation: 'navigation',\n contrast: buttonContrast,\n size: '48',\n icon_right: isPrev ? '24/symbol/chevron-left' : '24/symbol/chevron-right',\n label: this.a11y_labels[pos],\n campaign_creative: creative,\n campaign_id: id,\n campaign_name: name,\n campaign_position: position\n })\n if (!renderInCounter) {\n isPrev ? this.container.prepend(buttonEl) : this.container.append(buttonEl)\n } else {\n isPrev ? this.counter.prepend(buttonEl) : this.counter.append(buttonEl)\n }\n return buttonEl\n }\n\n #renderNav() {\n if (!this.displayNav || this.maxSlides === 0) {\n // Needed if we reinit\n if (this.nav) {\n this.nav.remove()\n }\n return\n }\n\n // Check if nav exists already (for async content in order to avoid creating two occurrences)\n if (this.nav) {\n this.nav.remove()\n }\n\n const nav = document.createElement('nav')\n\n let bullets = ''\n for (let i = 0; i <= this.maxSlides; i++) {\n bullets += this.#renderBullet(i)\n }\n\n nav.innerHTML = `${bullets}`\n\n this.appendChild(nav)\n this.nav = this.querySelector('nav')\n this.navElements = this.querySelectorAll('nav button')\n }\n\n #renderBullet(index) {\n return `<button data-item='${index}' aria-label='${this.a11y_labels.nav} ${index}'><span></span></button>`\n }\n\n #renderCounter() {\n if (!this.displayCounter || this.maxSlides === 0) {\n // Needed if we reinit\n if (this.counter) {\n this.counter.remove()\n }\n return\n }\n\n // Check if counter exists already (for async content in order to avoid creating two occurrences)\n if (this.counter) {\n this.counter.remove()\n }\n\n this.counter = document.createElement('div')\n this.counter.classList.add('counter')\n this.counter.classList.add('t-sm-500')\n this.counter.setAttribute('aria-hidden', 'true')\n\n this.counter.innerHTML = `<span class='current'>${this.currentIndex + 1}</span>\n <span>/</span>\n <span>${this.maxSlides + 1}</span>`\n\n this.prevButton = this.#renderButton('prev', true)\n this.nextButton = this.#renderButton('next', true)\n\n this.appendChild(this.counter)\n }\n\n #renderGradients() {\n if (!this.displayGradients || this.overflow) {\n return\n }\n\n if (this.gradientsWidth) {\n this.#setCss('--gradients-width', this.gradientsWidth, true)\n }\n\n if (this.gradientsColor) {\n this.#setCss('--gradients-color', this.gradientsColor)\n this.#setCss('--gradients-color-transparent', this.gradientsColor + '00')\n }\n\n this.container.classList.add('hasGradients')\n }\n\n #renderSafariFix() {\n // In safari, both Desktop and iOS, the scroll doesn't reach the end, because the scroll-padding on the right side seems to not been taken into account\n // Same bug is happening in Chrome on iOS (seems to use Safari webkit rendering)\n // The fix is to render an extra <li> with the size equal to the scroll-padding\n if (!this.overflow || !isSafari()) {\n return\n }\n\n // Check if safariFix exists already (for async content in order to avoid creating two occurences)\n if (!this.safariFix) {\n this.safariFix = document.createElement('li')\n this.safariFix.classList.add('safari-fix')\n this.safariFix.setAttribute('aria-hidden', true)\n this.carousel.appendChild(this.safariFix)\n }\n\n const safariFixWidth = (this.paddingCorrection - this.sliderGap) / BROWSER_CONTEXT\n this.safariFix.style.setProperty('width', safariFixWidth + 'rem')\n }\n\n #calculateItemsPerSlide() {\n // For asynchronous slider content, if initSlider() is called twice, we need to remove first this class\n this.carousel.classList.remove('no-slides')\n\n let itemWidth = this.itemWidth\n\n // If itemWidth is not provided or 'auto', we need to calculate an average width for items that doesn't have fixed width\n if (this.itemWidth === undefined || this.itemWidth === 'auto') {\n itemWidth =\n (this.carousel.scrollWidth - this.sliderGap * (this.itemNumber - 1)) /\n this.itemNumber\n }\n\n this.itemsPerSlide = Math.floor(this.carousel.offsetWidth / itemWidth)\n // TODO: the fix below doesn't work, needs to be resolved.\n // const isLastElementSingle =\n // this.slidesElements[this.slidesElements.length - 2].offsetWidth +\n // this.slidesElements[this.slidesElements.length - 1].offsetWidth >\n // this.carousel.offsetWidth\n\n // this.itemsPerSlide = isLastElementSingle\n // ? 0\n // : Math.floor(this.carousel.offsetWidth / itemWidth)\n }\n\n #getSliderPositions() {\n this.sliderPositions = []\n this.maxScroll = this.carousel.scrollWidth - this.carousel.offsetWidth\n\n if (this.slidesElements.length === 0) {\n return\n }\n\n // We need to manage the first item initial position in case the slides are\n // visible on each side (equivalent to scroll-padding CSS of ul.nn-carousel)\n const firstItemOffsetLeft = this.slidesElements[0].offsetLeft\n\n this.querySelectorAll('.nn-carousel > li:not(.safari-fix)').forEach(element => {\n this.sliderPositions.push(element.offsetLeft - firstItemOffsetLeft)\n })\n }\n\n #setCss(name, value, isRem = false) {\n this.style.setProperty(name, isRem ? value / BROWSER_CONTEXT + 'rem' : value)\n }\n\n #setCssSlideWidth() {\n if (this.itemWidth === 'auto') {\n const itemWidthAuto =\n (this.container.clientWidth - (this.itemsPerSlide - 1) * this.sliderGap) /\n (this.itemsPerSlide || 1)\n this.#setCss('--item-width', itemWidthAuto, true)\n } else if (this.itemWidth) {\n this.#setCss('--item-width', this.itemWidth, true)\n }\n }\n\n #setCssSlideMinHeight() {\n if (this.slideMinHeight === 'auto') {\n this.#setCss('--slide-min-height', 'auto')\n } else if (this.slideMinHeight !== undefined) {\n this.#setCss('--slide-min-height', this.slideMinHeight, true)\n }\n }\n\n #setCssSliderGap() {\n if (this.sliderGap || this.sliderGap === 0) {\n this.#setCss('--slider-gap', this.sliderGap, true)\n }\n }\n\n #setCssFlexAuto() {\n if (this.flexAuto) {\n this.carousel.classList.add('flex-auto')\n }\n }\n\n #setCssPlaceholder() {\n if (this.placeholderBackground) {\n this.#setCss('--placeholder-background', this.placeholderBackground)\n }\n }\n\n #setCssItemsPerSlide() {\n this.#setCss('--items-per-slide', this.itemsPerSlide)\n }\n\n #applyCenteredLayout() {\n if (this.maxSlides > 0) {\n return\n }\n // If maxSlides is 0 or negative, it means that we have less items than needed to fulfill the carousel width\n // So to center the items (for example the bubbles when only 3) we need to apply a justify-content: center fix\n this.carousel.classList.add('no-slides')\n }\n\n /** Public Method **/\n updateSlider(index, instantly = false) {\n this.#getSliderPositions()\n this.goToSlide(parseInt(index), instantly)\n }\n\n #updateStates() {\n this.#setActiveButtons()\n this.#setActiveBullet()\n this.#setCounter()\n this.#setActiveSlides()\n }\n\n #updateStatesScroll(index) {\n this.#setActiveButtons(index)\n this.#setCounter()\n }\n\n #setActiveButtons(currentIndex) {\n if ((!this.displayButtons || this.maxSlides <= 0) && !this.displayCounter) {\n return\n }\n\n // First we remove all hide classes (because with pagination we can move from more than 2 slides)\n this.prevButton.classList.remove('hide')\n this.nextButton.classList.remove('hide')\n\n // Then we reset hide class on the right button\n if (this.currentIndex === 0) {\n this.prevButton.classList.add('hide')\n } else if (this.currentIndex === this.maxSlides || currentIndex === this.maxSlides) {\n this.nextButton.classList.add('hide')\n }\n }\n\n #setActiveBullet() {\n if (!this.displayNav || this.maxSlides <= 0) {\n return\n }\n\n this.navElements.forEach(item => {\n item.classList.remove('active')\n })\n\n this.navElements[this.currentIndex].classList.add('active')\n }\n\n #setCounter() {\n if (!this.displayCounter || this.maxSlides === 0) {\n return\n }\n\n if (!this.displayCounter) {\n return\n }\n\n this.counter.querySelector('.current').textContent = parseInt(this.currentIndex + 1)\n }\n\n #setActiveSlides() {\n // If we have no items overflowing on each side, we don't need to manage disabled slides\n if (!this.overflow) {\n return\n }\n\n this.slidesElements.forEach(element => {\n element.setAttribute('aria-disabled', 'true')\n })\n\n let tempIndex = parseInt(this.currentIndex)\n for (let i = 0; i < this.itemsPerSlide; i++) {\n if (this.slidesElements[tempIndex + i]) {\n this.slidesElements[tempIndex + i].removeAttribute('aria-disabled')\n }\n }\n }\n\n /** Public Method **/\n goToSlide(index, instantly = false) {\n if (index !== undefined) {\n this.currentIndex = index\n }\n\n // If index is over maxSlides, it means we reached out the end of scroll, so we don't need to update states anymore\n if (index < this.maxSlides) {\n this.#updateStates()\n }\n\n // We scroll to the right position (scrollTo duration is approx 750ms)\n this.carousel.scrollTo({\n left: this.sliderPositions[parseInt(this.currentIndex, 10)],\n behavior: instantly ? 'auto' : 'smooth'\n })\n }\n\n #gotoDefaultPosition() {\n if (this.defaultPosition === 0 || this.defaultPosition > this.maxSlides + 1) {\n return\n }\n this.goToSlide(this.defaultPosition, true)\n }\n\n #onScroll() {\n // Clear our timeout throughout the scroll\n if (this.isScrolling) {\n clearTimeout(this.isScrolling)\n }\n\n this.#setOpacity()\n\n // Set a timeout to run after scrolling ends\n this.isScrolling = setTimeout(() => {\n // Update the expected scroll positions again as sometimes they are initially incorrect\n this.#getSliderPositions()\n\n const carouselScrollLeft = Math.round(this.carousel.scrollLeft)\n\n // Ideal use case (exact pixel value)\n let index = this.sliderPositions.indexOf(carouselScrollLeft)\n\n // Sometimes the scrollLeft value can be +1 or -1 pixels. If the position is not found\n // then the index will be -1. In this case, try searching the list of positions to see\n // if the scroll position is one pixel left or right of the expected position (hence\n // using -1 and +1 in the indexOf() call below)\n if (index === -1) {\n index = this.sliderPositions.indexOf(carouselScrollLeft - 1)\n }\n if (index === -1) {\n index = this.sliderPositions.indexOf(carouselScrollLeft + 1)\n }\n\n // For items with flexible width (flex_auto) the last position of the scroll can not match an exact SliderPositions\n if (carouselScrollLeft === this.maxScroll) {\n index = this.maxSlides\n }\n\n if (index >= 0) {\n this.#switchBullets(index, true)\n }\n\n this.#updateStatesScroll(index)\n }, 100)\n }\n\n #getOpacityParams() {\n if (!this.overflow || !this.slidesElements.length) {\n return\n }\n // Set properties used for slide opacity calculation in #setOpacity()\n this.paddingCorrection = parseInt(\n getComputedStyle(this.carousel).getPropertyValue('padding-left')\n )\n\n this.itemWidthAdjusted = this.slidesElements[0].offsetWidth + this.sliderGap\n }\n\n #setOpacity() {\n if (!this.overflow) {\n return\n }\n const scrollX = this.carousel.scrollLeft\n\n this.slidesElements.forEach((item, index) => {\n // Adjust item offsetLeft because of slider padding on each side\n const itemOffsetLeft = item.offsetLeft - this.paddingCorrection\n // Adjust item offsetLeft to add itemWidth + sliderGap\n let itemX = itemOffsetLeft + this.itemWidthAdjusted\n\n // Determine if we need to calculate left or right items\n let percentage = 100\n\n if (scrollX > itemX) {\n // Avoid calculation if item is outside on left\n percentage = 0\n } else if (scrollX >= this.itemWidthAdjusted * index) {\n // Do left calculations\n percentage = Math.round(((itemX - scrollX) / this.itemWidthAdjusted) * 100)\n } else if (scrollX < itemX - (1 + this.itemsPerSlide) * this.itemWidthAdjusted) {\n // Avoid calculation if item is outside on right\n percentage = 0\n } else if (scrollX <= itemX - this.itemsPerSlide * this.itemWidthAdjusted) {\n // Do right calculations\n percentage = Math.round(\n (this.itemsPerSlide + 1) * 100 -\n ((itemX - scrollX) / this.itemWidthAdjusted) * 100\n )\n }\n\n const opacityPercentage = percentage / 100\n let finalOpacity =\n Math.round(\n (opacityPercentage * (1 - this.overflowOpacity) + this.overflowOpacity) * 100\n ) / 100\n\n item.firstElementChild.style.setProperty('opacity', finalOpacity)\n })\n }\n\n #switchBullets(index, alreadyScrolled = false) {\n if (!this.slidesElements[index]) {\n return\n }\n\n this.currentIndex = index\n\n // only fires goToSlide if user clicks on pagination buttons\n if (!alreadyScrolled) {\n this.goToSlide()\n } else {\n this.#updateStates()\n }\n }\n\n #onPrevClick() {\n if (this.currentIndex > 0) {\n this.currentIndex = this.currentIndex - 1\n this.#updateStates()\n }\n this.goToSlide()\n }\n\n #onNextClick() {\n if (this.currentIndex < this.maxSlides) {\n this.currentIndex = this.currentIndex + 1\n this.#updateStates()\n }\n this.goToSlide()\n }\n\n #onNavClick(e) {\n this.currentIndex = parseInt(e.target.dataset.item)\n this.#setActiveBullet()\n this.#switchBullets(this.currentIndex)\n }\n\n #dispatchReady() {\n dispatchEvent({\n eventName: EVENT_SLIDER_READY,\n args: { id: this.id },\n element: this\n })\n }\n\n #bindEvent() {\n this.#unbindEvent()\n\n this.carousel.addEventListener('scroll', this.boundScroll)\n if (this.prevButton) {\n this.prevButton.addEventListener('click', this.boundPrevClick)\n }\n if (this.nextButton) {\n this.nextButton.addEventListener('click', this.boundNextClick)\n }\n if (this.navElements) {\n this.navElements.forEach(element => {\n element.addEventListener('click', this.boundNavClick)\n })\n }\n }\n\n #unbindEvent() {\n this.carousel.removeEventListener('scroll', this.boundScroll)\n if (this.prevButton) {\n this.prevButton.removeEventListener('click', this.boundPrevClick)\n }\n if (this.nextButton) {\n this.nextButton.removeEventListener('click', this.boundNextClick)\n }\n if (this.navElements) {\n this.navElements.forEach(element => {\n element.removeEventListener('click', this.boundNavClick)\n })\n }\n }\n\n disconnectedCallback() {\n this.#unbindEvent()\n }\n}\n\ncustomElements.get('nb-slider-natural') || customElements.define('nb-slider-natural', SliderNatural)\n\nexport default SliderNatural\n","import { CONTRAST_DARK, CONTRAST_LIGHT } from '@kissui/components'\n\nexport const getOppositeContrast = contrast => {\n return contrast === CONTRAST_LIGHT ? CONTRAST_DARK : CONTRAST_LIGHT\n}\n","export const isIOS = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n return (agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1\n}\n\nexport const isMacOS = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n return agent.indexOf('Mac') > -1 && start > -1\n}\n\nexport const isApple = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n return (\n (agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1 || agent.indexOf('Mac') > -1) &&\n start > -1\n )\n}\n\nexport const isAndroid = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('Android ')\n return start > -1\n}\n\nexport const isHuawei = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('HUAWEI'),\n devices = navigator.userAgent.match(\n /ALP-|AMN-|ANA-|ANE-|ANG-|AQM-|ARS-|ART-|ATU-|BAC-|BLA-|BRQ-|CAG-|CAM-|CAN-|CAZ-|CDL-|CDY-|CLT-|CRO-|CUN-|DIG-|DRA-|DUA-|DUB-|DVC-|ELE-|ELS-|EML-|EVA-|EVR-|FIG-|FLA-|FRL-|GLK-|HMA-|HW-|HWI-|INE-|JAT-|JEF-|JER-|JKM-|JNY-|JSC-|LDN-|LIO-|LON-|LUA-|LYA-|LYO-|MAR-|MED-|MHA-|MLA-|MRD-|MYA-|NCE-|NEO-|NOH-|NOP-|OCE-|PAR-|PIC-|POT-|PPA-|PRA-|RNE-|SEA-|SLA-|SNE-|SPN-|STK-|TAH-|TAS-|TET-|TRT-|VCE-|VIE-|VKY-|VNS-|VOG-|VTR-|WAS-|WKG-|WLZ-|YAL/i\n )\n return start > -1 || devices !== null\n}\n\nexport const isSafari = () => {\n // https://stackoverflow.com/questions/7944460/detect-safari-browser\n // This includes Chrome on IOS which seems to be Safari, So it's fully OK !\n const agent = window.navigator.userAgent\n return /^((?!chrome|android).)*safari/i.test(agent)\n}\n\nexport const isWebInspector = () => {\n // https://stackoverflow.com/questions/19877924/what-is-the-list-of-possible-values-for-navigator-platform-as-of-today\n // If we are in a web inspector, in our Nespresso context platform can be MacIntel or eventually Win32 for windows users\n const platform = window.navigator.platform\n return platform.indexOf('MacIntel') > -1 || platform.indexOf('Win32') > -1\n}\n","const createRefs = component => [...component.querySelectorAll('[data-ref]')].reduce(extract, {})\n\nconst extract = (refs, $ref) => {\n const { ref } = $ref.dataset\n\n // Check if ref is of type array\n const refArray = ref.match(/(\\w+)\\[(.+)\\]/)\n\n if (refArray !== null) {\n return getRefArray(refs, $ref, refArray)\n } else {\n return { ...refs, [$ref.dataset.ref]: $ref }\n }\n}\n\nconst getRefArray = (refs, $ref, [, name, index]) => {\n if (refs[name] === undefined) {\n refs[name] = []\n }\n refs[name][index] = $ref\n return refs\n}\n\nexport default createRefs\n","import viewportHelper from './viewport.helpers'\n\n/**\n * Resize image on the fly by Akamai\n * https://dsu-confluence.nestle.biz/x/06kaCQ\n * https://dsu-confluence.nestle.biz/display/EUXUI/Performance?preview=/152742355/152761429/IMPoliciesExtract-31072020.docx\n * @param {''|'carouselBannerNarrowMedium'|'carouselBannerWide'|'horizontalBannerNarrow'|'landscapeRecipeDetails'|'large'|'medium'|'portraitRecipeDetails'|'productPdpMainDefault'|'productPdpMain'|'productPdpSafeZone'|'product'|'recipeCard'|'registrationTechChoiceMediumLarge'|'resize_crop'|'small'} policy - IM Policy coming from Akamaï\n * @param {24|150|320|640|1024|2048|5000} width - IM Width size of the image\n * @returns {string} - Rules apply in a query string parameter\n */\nexport const getImpolicy = (policy = 'product', width = 160) => {\n const rules = []\n\n if (policy) {\n rules.push(`impolicy=${policy}`)\n }\n\n if (width) {\n rules.push(`imwidth=${width}`)\n }\n\n return `?${rules.join('&')}`\n}\n\n/**\n * Ask the right resolution depending on breakpoint, returns the closest one\n * No need to give a retina resolution, Akamai will return Retina automatically (you need to give the normal resolution)\n * @param {''|'medium'} policy - IM Policy coming from Akamaï, default is medium because it have the largest batch of resolutions\n * @param {''|'375'} mobileWidth - Mobile image width to be served | 375 default is full mobile screen width\n * @param {''|'1024'} tabletWidth - Tablet image width to be served | 1024 default is full tablet landscape screen width\n * @param {''|'1920'} desktopWidth - Desktop image width to be served | 1024 default is full tablet landscape screen width\n * @returns {string} - Rules to concatenate to your image url\n */\nexport const getResponsiveImpolicy = (\n policy = 'medium',\n mobileWidth = '375',\n tabletWidth = '1024',\n desktopWidth = '1920',\n retinaWidth = '3840'\n) => {\n if (viewportHelper.is.mobile) {\n return getImpolicy(policy, mobileWidth)\n } else if (viewportHelper.is.tablet) {\n return getImpolicy(policy, tabletWidth)\n } else if (viewportHelper.is.desktop) {\n return getImpolicy(policy, desktopWidth)\n } else {\n return getImpolicy(policy, retinaWidth)\n }\n}\n","export const STATE_DEFAULT = 'default'\nexport const STATE_SELECTED = 'selected'\nexport const STATE_DISABLED = 'disabled'\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport createRefs from '@kissui/helpers/src/refs.helpers'\nimport { lazyLoad, getHashLink } from '@kissui/helpers/src/utils'\nimport { getResponsiveImpolicy } from '@kissui/helpers/src/impolicy'\nimport { selectPromotion } from '@kissui/helpers/src/gtmEvents'\n\nimport { STATE_SELECTED, STATE_DISABLED } from './js/constants'\n\nclass Bubble extends HTMLElement {\n constructor() {\n super()\n this.classList.add('nb-bubble')\n }\n\n static get observedAttributes() {\n return ['state']\n }\n\n attributeChangedCallback(name) {\n if (name === 'state') {\n this.setState()\n }\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n this.refs = createRefs(this)\n this.initLazyLoad()\n this.initTracking()\n }\n\n initTracking() {\n const { label, campaign } = this.props\n\n const link = this.querySelector('a')\n\n if (link) {\n link.onclick = () => {\n selectPromotion({\n cta_name: label,\n ...campaign\n })\n }\n }\n }\n\n initLazyLoad() {\n let { src = '', src_retina = '' } = this.props.visual\n const { visual } = this.refs\n\n // If src_retina is not provided by markets, then takes the src as default\n if (src_retina === '') {\n src_retina = src\n }\n\n src_retina += getResponsiveImpolicy('small', '144', '160', '80', '160')\n src_retina += '&imdensity=1'\n\n if (visual && src_retina) {\n lazyLoad(visual, 'src', `${src_retina}`, src_retina)\n }\n }\n\n render() {\n const { label, link, state, a11y_scrollto = 'Scroll to' } = this.props\n const { linkNoHash, linkHash } = getHashLink(link)\n\n this.innerHTML = `\n ${\n state === STATE_DISABLED\n ? this.renderVisual()\n : `<a href=\"${linkHash}\" data-href=\"${linkNoHash}\" aria-label='${a11y_scrollto} ${label}'>\n ${this.renderVisual()}\n </a>`\n }\n\n ${this.renderLabel()}\n `\n\n this.link = this.querySelector('a')\n this.label = this.querySelector('span')\n state && this.setAttribute('state', state)\n this.setTheme()\n }\n\n setState() {\n const state = this.getAttribute('state')\n\n if (state === STATE_SELECTED) {\n this.link.setAttribute('aria-current', 'true')\n this.label.classList.add('t-xs-700-sl')\n this.label.classList.remove('t-xs-500-sl')\n } else {\n if (state !== STATE_DISABLED) {\n this.link.removeAttribute('aria-current')\n }\n\n this.label.classList.remove('t-xs-700-sl')\n this.label.classList.add('t-xs-500-sl')\n }\n }\n\n setTheme() {\n const { theme } = this.props\n\n if (theme && theme !== '') {\n this.style.setProperty('--placeholder-background', theme)\n }\n }\n\n renderVisual() {\n let { src = '', src_retina = '' } = this.props.visual\n const { state } = this.props\n\n if (src === '' && src_retina === '') {\n return ''\n }\n\n // Image is decorative, we can have alt=\"\" and aria-hidden should be true\n return `<img src=\"\" alt=\"\" aria-hidden=\"true\" data-ref=\"visual\" ${\n state === STATE_DISABLED ? 'class=\"is-disabled\"' : ''\n }/>`\n }\n\n renderLabel() {\n const { label, state } = this.props\n\n if (!label) {\n return\n }\n\n return `<span class=\"t-xs-500-sl ${\n state === STATE_DISABLED ? 'is-disabled' : ''\n }\">${label}</span>`\n }\n}\n\ncustomElements.get('nb-bubble') || customElements.define('nb-bubble', Bubble)\n\nexport default Bubble\n","/**\n * @typedef {Object} ObserverItem\n * @property {String} selector - target element selector\n * @property {Object} options - IntersectionObserver options\n * @property {Function} callback - function to call on threshold crossed\n */\n\nclass IntersectionObserverService {\n constructor() {\n this.observers = new Map()\n }\n\n /**\n * Creates a Map of ObserverItem objects, unique for each selector provided.\n * Each selector has its own configurable observer, target elements and callback.\n * Observers can be individually unobserved / destroyed.\n * @param {ObserverItem[]} observables\n */\n create(observables) {\n observables.forEach(({ selector, callback, options }) => {\n if (this.observers.has(selector)) {\n console.warn(`Observer for selector \"${selector}\" already exists`)\n return\n }\n\n const targets = document.querySelectorAll(selector)\n\n if (targets.length === 0) {\n console.warn(`No elements found for selector \"${selector}\"`)\n return\n }\n\n const observer = new IntersectionObserver(callback, options)\n targets.forEach(element => observer.observe(element))\n this.observers.set(selector, { observer, targets })\n })\n }\n\n /**\n * Unobserve for specified selector\n * @param {String} selector\n */\n unobserve(selector) {\n const entry = this.observers.get(selector)\n\n if (entry) {\n const { observer, targets } = entry\n targets.forEach(element => observer.unobserve(element))\n } else {\n console.warn(`No observer found for selector \"${selector}\"`)\n }\n }\n\n /**\n * Disconnect observer for specified selector\n * @param {String} selector\n */\n destroy(selector) {\n const entry = this.observers.get(selector)\n\n if (entry) {\n const { observer } = entry\n observer.disconnect()\n this.observers.delete(selector)\n } else {\n console.warn(`No observer found for selector \"${selector}\"`)\n }\n }\n\n /**\n * Disconnect all observers\n */\n destroyAll() {\n this.observers.forEach(entry => {\n entry.observer.disconnect()\n })\n\n this.observers.clear()\n }\n}\n\nexport default IntersectionObserverService\n","export default class Deferred {\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.reject = reject\n this.resolve = resolve\n })\n }\n}\n","import Deferred from './deferred'\n\nconst resolveScrollPosition = (scrollTo: HTMLElement | string | number, scrollPaddingTop = 140) => {\n if (typeof scrollTo === \"number\") {\n return scrollTo\n }\n\n const scrollToElement = typeof scrollTo === \"object\" ? scrollTo : document.querySelector(scrollTo)\n\n if (scrollToElement === null && typeof scrollTo === \"string\") {\n throw new Error(`error: No element found with the selector \"${scrollTo}\"`)\n }\n\n return window.scrollY + scrollToElement!.getBoundingClientRect().top - scrollPaddingTop\n}\n\nconst resolveScrollDuration = (scrollDuration: number, deltaScroll: number) => {\n const viewportHeight = window.innerHeight\n const bodyHeight = document.body.clientHeight\n\n if (deltaScroll > viewportHeight && bodyHeight - viewportHeight > 0) {\n return Math.abs(\n scrollDuration +\n scrollDuration * (Math.abs(deltaScroll) / (bodyHeight - viewportHeight))\n )\n }\n return scrollDuration\n}\n/**\n * Smooth scroll-to inspired by:\n * http://stackoverflow.com/a/24559613/728480\n */\nconst scrollTo = (scrollTo: HTMLElement | string | number = 0, options: { scrollPaddingTop?: number, scrollDuration?: number } = {}) => {\n const { scrollDuration: baseScrollDuration = 300 } = options\n const deferred = new Deferred()\n\n let scrollPosition: number = 0;\n\n try {\n scrollPosition = resolveScrollPosition(scrollTo, options.scrollPaddingTop)\n }\n catch (error) {\n console.error(error)\n return\n }\n\n let currentTime = 0\n const initialTimestamp = window.performance.now()\n const initialScroll = window.scrollY\n const deltaScroll = initialScroll - scrollPosition\n\n const scrollDuration = resolveScrollDuration(baseScrollDuration, deltaScroll)\n\n const finalTimestamp = initialTimestamp + scrollDuration\n\n function step() {\n const currentTimestamp = window.performance.now()\n if (currentTimestamp < finalTimestamp) {\n currentTime = (currentTimestamp - initialTimestamp) / scrollDuration\n currentTime = --currentTime * currentTime * currentTime + 1\n const moveStep = deltaScroll * currentTime\n window.scrollTo(0, scrollPosition + (deltaScroll - moveStep))\n window.requestAnimationFrame(step)\n } else {\n window.scrollTo(0, scrollPosition)\n setTimeout(() => deferred.resolve(undefined), 125)\n }\n return deferred.promise\n }\n\n window.requestAnimationFrame(step)\n return deferred.promise\n}\n\nexport default scrollTo\n","export const EVENT_NAVIGATION_SECTION_CHANGE = 'EVENT_NAVIGATION_SECTION_CHANGE'\n\n// In mobile / tablet / sticky we need a dynamic number of slides as it's a variable width\n// This 'auto' value is valid with new slider-natural, it calculates the available space and set automatically the good itemsPerSlide\nexport const NB_SLIDES_MOBILE = 'auto'\nexport const NB_SLIDES_TABLET = 'auto'\nexport const NB_SLIDES_DESKTOP = 9\nexport const NB_SLIDES_STICKY = 'auto'\n\nexport const INTERSECTION_RATIOS_SECTION = [0.2, 0.8]\n\nexport const BUBBLE_MOBILE_WIDTH = '104'\nexport const BUBBLE_TABLET_DESKTOP_WIDTH = '112'\nexport const GRADIENT_WIDTH = '8'\n\nexport const SLIDER_CONFIG_DEFAULT = {\n display_gradients: 'true',\n display_nav: 'false',\n overflow: 'false',\n placeholder_background: 'transparent',\n slide_min_height: 'auto',\n slider_gap: '0'\n}\n","import { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport eventsHelper from '@kissui/helpers/src/events.helpers'\nimport IntersectionObserverService from '@kissui/helpers/src/intersection-observer.service'\nimport createProps from '@kissui/helpers/src/props.helpers.js'\nimport createRefs from '@kissui/helpers/src/refs.helpers'\nimport scrollTo from '@kissui/helpers/src/scrollTo'\nimport { getHashLink, stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { COLOR_WHITE_1000 } from '../constants.mjs'\nimport eventsManager from './services/events.manager'\n\nimport { BREAKPOINT_M } from '@kissui/components'\nimport {\n BUBBLE_MOBILE_WIDTH,\n BUBBLE_TABLET_DESKTOP_WIDTH,\n EVENT_NAVIGATION_SECTION_CHANGE,\n GRADIENT_WIDTH,\n INTERSECTION_RATIOS_SECTION,\n NB_SLIDES_DESKTOP,\n NB_SLIDES_MOBILE,\n NB_SLIDES_STICKY,\n NB_SLIDES_TABLET,\n SLIDER_CONFIG_DEFAULT\n} from './data/constants'\n\nclass NavigationBubbles extends HTMLElement {\n constructor() {\n super()\n this.isMobile = window.innerWidth < BREAKPOINT_M\n // Used to prevent observer to fire a section change event\n // if navigation click already did it\n this.isScrolling = false\n this.scrollObserver = new IntersectionObserverService()\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.classList.add('nb-navigation-bubbles')\n this.sticky = this.isSticky()\n this.type = this.sticky ? 'Chip' : 'Bubble'\n this.isCenteredItems = this.props.is_centered_items ? 'true' : 'false'\n this.setAttribute('type', this.type.toLowerCase())\n this.setAttribute('is-centered-items', this.isCenteredItems)\n this.init()\n }\n\n isSticky() {\n if (!this.props) {\n return false\n }\n const { sticky = 'false' } = this.props\n return sticky === 'true'\n }\n\n init() {\n this.render()\n this.refs = createRefs(this)\n this.slider = this.querySelector('nb-slider-natural')\n this.eventsListeners = eventsManager(this).createListeners(this.slider)\n this.scrollObserver.create([\n {\n selector: '[data-id]',\n callback: this.onSectionChange,\n options: {\n threshold: INTERSECTION_RATIOS_SECTION,\n rootMargin: '-160px 0px 0px 0px'\n }\n }\n ])\n }\n\n render() {\n this.innerHTML = `${this.renderNavigation()}`\n }\n\n getSliderOptions() {\n return {\n flex_auto: this.sticky ? 'true' : 'false',\n gradients_color: this.sticky ? COLOR_WHITE_1000 : undefined,\n gradients_width: this.sticky ? GRADIENT_WIDTH : undefined,\n ...SLIDER_CONFIG_DEFAULT\n }\n }\n\n renderNavigation() {\n const {\n slider_id,\n a11y_slider_previous_button,\n a11y_slider_next_button,\n a11y_goto_slide = 'Goto slide',\n campaign\n } = this.props\n\n // Pass render function name by element type (Chip/Bubble)\n const list = this.renderList(`render${this.type}`)\n\n const sliderOptions = this.getSliderOptions()\n const sliderData = {\n options: {\n mobile: {\n items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_MOBILE,\n item_width: this.sticky ? 'auto' : BUBBLE_MOBILE_WIDTH,\n display_buttons: 'false',\n ...sliderOptions\n },\n tablet: {\n items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_TABLET,\n item_width: this.sticky ? 'auto' : BUBBLE_TABLET_DESKTOP_WIDTH,\n display_buttons: 'true',\n ...sliderOptions\n },\n desktop: {\n items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_DESKTOP,\n item_width: this.sticky ? 'auto' : BUBBLE_TABLET_DESKTOP_WIDTH,\n ...sliderOptions\n }\n },\n a11y_labels: {\n prev: a11y_slider_previous_button,\n next: a11y_slider_next_button,\n nav: a11y_goto_slide\n },\n campaign\n }\n\n const slider = `<nb-slider-natural\n id='${slider_id}'\n data=\"${stringifyForAttribute(sliderData)}\"\n data-ref=\"slider${this.type}\">\n ${list}\n </nb-slider-natural>`\n\n if (this.sticky) {\n return slider\n }\n\n return `<nb-container contrast=\"light\">${slider}</nb-container>`\n }\n\n renderList(renderFunction) {\n const { bubbles = [] } = this.props\n\n const output = bubbles\n .map(bubble => ({ ...bubble, campaign: this.props.campaign || undefined }))\n .map(bubble => this[renderFunction](bubble))\n .join('')\n\n return output\n }\n\n renderBubble(bubble) {\n let { link, campaign } = bubble\n if (!link) {\n return null\n }\n const { linkNoHash } = getHashLink(link)\n\n const bubbleWithCampaign = { ...bubble, campaign }\n\n return `\n <li>\n <nb-bubble data=\"${stringifyForAttribute(\n bubbleWithCampaign\n )}\" data-ref=\"bubbles[${linkNoHash}]\"></nb-bubble>\n </li>\n `\n }\n\n renderChip(chip) {\n const { link } = chip\n if (!link) {\n return null\n }\n const { linkNoHash, linkHash } = getHashLink(link)\n\n return `\n <li>\n <a href=\"${linkHash}\" data-href='${linkNoHash}' class=\"is-link\" tabindex=\"-1\" >\n <nb-chip\n background_image=\"${chip.visual.src}\"\n data-ref=\"chips[${linkNoHash}]\"\n rounded=\"false\"\n campaign_id=\"${chip.campaign?.id}\"\n campaign_name=\"${chip.campaign?.name}\"\n campaign_creative=\"${chip.campaign?.creative}\"\n campaign_position=\"${chip.campaign?.position}\"\n >\n ${chip.label}\n </nb-chip>\n </a>\n </li>\n `\n }\n\n // Called from events-manager.js, coupled code\n updateLayout() {\n this.geometry = this.getGeometry()\n }\n\n updateBubbles(sectionId) {\n const { bubbles = {} } = this.refs\n for (const bubbleId in bubbles) {\n const bubble = bubbles[bubbleId]\n const state = bubbleId === sectionId ? 'selected' : 'default'\n if (typeof bubble.setAttribute === 'function') {\n bubble.setAttribute('state', state)\n }\n }\n }\n\n updateChips(sectionId) {\n const { chips = {} } = this.refs\n for (const chipId in chips) {\n const chip = chips[chipId]\n const isChecked = chipId === sectionId ? 'true' : 'false'\n chip.setAttribute && chip.setAttribute('checked', isChecked)\n }\n }\n\n async updateSlider(sectionId, _index) {\n let index = _index\n const slider = await this.refs.sliderChip\n if (slider) {\n if (typeof _index === 'undefined') {\n const links = slider.querySelectorAll('a[data-href]')\n links.forEach((link, i) => {\n if (link.getAttribute('data-href') === sectionId) {\n index = i\n }\n })\n }\n if (index && slider && slider.goToSlide) {\n slider.goToSlide(index)\n }\n }\n }\n\n emit(event) {\n dispatchEvent({ element: this, ...event })\n }\n\n async scroll(link, index) {\n this.isScrolling = true\n const linkHref = link.getAttribute('data-href')\n const target = linkHref\n const { header, chips } = this.geometry\n\n // When clicking on first anchor we force height to 0 because sticky bar is usually not displayed yet\n const stickyBarHeight = index === 0 ? 0 : chips.height\n\n const scrollPaddingTop = header.top + header.height + stickyBarHeight\n const scrollOptions = { scrollPaddingTop }\n\n await scrollTo(`[data-id=\"${target}\"]`, scrollOptions)\n this.isScrolling = false\n\n // After scrolling visually, we need to give focus to the section for keyboard navigation\n const targetEl = document.querySelector(`[data-id=\"${target}\"]`)\n targetEl.focus({ preventScroll: true })\n }\n\n track() {\n //no-op as per https://nestle.atlassian.net/browse/DIGEX-12371?focusedCommentId=2903998\n }\n\n getGeometry() {\n const $header = document.querySelector('.Header__top')\n const $stickyBar = document.querySelector('nb-plp-sticky-bar')\n\n const headerRect = $header?.getBoundingClientRect() || { height: 0, y: 0 }\n const stickyBarRect = $stickyBar?.getBoundingClientRect() || { height: 0, y: 0 }\n\n return {\n header: { height: headerRect.height, top: headerRect.y },\n chips: { height: stickyBarRect.height, top: stickyBarRect.y }\n }\n }\n\n onSectionChange(entries) {\n const entry = entries[0]\n\n if (entry.isIntersecting && !this.isScrolling) {\n const { id = '' } = entry.target.dataset\n\n dispatchEvent({\n eventName: EVENT_NAVIGATION_SECTION_CHANGE,\n args: { sectionId: id || entry.target.getAttribute('data-id') }\n })\n }\n }\n\n disconnectedCallback() {\n eventsHelper.remove(this.eventsListeners)\n this.scrollObserver.destroy('[data-id]')\n }\n}\n\ncustomElements.get('nb-navigation-bubbles') ||\n customElements.define('nb-navigation-bubbles', NavigationBubbles)\n\nexport default NavigationBubbles\n","// TODO move the responsabiliy of the links to the correct component\nimport eventsHelper from '@kissui/helpers/src/events.helpers'\nimport { readEvent, dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nimport { EVENT_HEADER_POSITION_CHANGED, EVENT_SLIDER_READY } from '@kissui/components'\n\nimport { EVENT_NAVIGATION_SECTION_CHANGE } from '../data/constants'\n\nconst eventsManager = rootElement => {\n const bindSliderLinksEvents = slider => {\n // We need to wait for EVENT_SLIDER_READY before getting geometry for chips slider to have height\n rootElement.geometry = rootElement.getGeometry()\n\n const links = slider.querySelectorAll('a')\n\n for (const [index, link] of links.entries()) {\n link.addEventListener('click', onSliderLinkClick.bind(this, index))\n }\n }\n\n const onSliderLinkClick = (index, $event) => {\n $event.preventDefault()\n\n const link = $event.target.closest('a')\n\n if (link) {\n dispatchEvent({\n eventName: EVENT_NAVIGATION_SECTION_CHANGE,\n args: { sectionId: link.getAttribute('data-href'), index }\n })\n\n rootElement.scroll && rootElement.scroll(link, index)\n window.location.hash = link.getAttribute('data-href')\n\n let finalLabel = '',\n plpListLabel = '',\n bubbleLabel = ''\n if (rootElement.closest('nb-plp-sticky-bar')) {\n bubbleLabel = link.querySelector('nb-chip label span').textContent\n plpListLabel = rootElement.props.selected_nav_link_label || ''\n } else {\n plpListLabel = rootElement.props.selected_nav_link_label || ''\n if (link.nextElementSibling.textContent) {\n bubbleLabel = link.nextElementSibling.textContent\n } else {\n bubbleLabel = link.getAttribute('aria-label')\n }\n }\n finalLabel = plpListLabel ? `${plpListLabel} : ${bubbleLabel}` : `${bubbleLabel}`\n rootElement.track(finalLabel)\n }\n }\n\n const onSectionChange = $event => {\n const { sectionId, index } = readEvent($event)\n\n rootElement.updateBubbles && rootElement.updateBubbles(sectionId)\n rootElement.updateChips && rootElement.updateChips(sectionId)\n rootElement.updateSlider && rootElement.updateSlider(sectionId, index)\n }\n\n const createListeners = slider => {\n const eventListeners = []\n\n if (slider) {\n eventListeners.push({\n element: rootElement,\n type: EVENT_SLIDER_READY,\n listener: bindSliderLinksEvents.bind(this, slider),\n options: { once: true }\n })\n }\n eventListeners.push({\n element: window,\n type: EVENT_NAVIGATION_SECTION_CHANGE,\n listener: onSectionChange\n })\n eventListeners.push({\n element: window,\n type: EVENT_HEADER_POSITION_CHANGED,\n listener: rootElement.updateLayout.bind(rootElement)\n })\n\n eventsHelper.add(eventListeners)\n\n return eventListeners\n }\n\n return { createListeners }\n}\n\nexport default eventsManager\n","import { getDataLayer } from '@kissui/helpers/src/dataLayer'\n\nexport async function setPLPDataProvider() {\n window.getPLPData = window.getPLPData || getPLPData\n}\n\nexport async function getPLPData() {\n return await window.plpData\n}\n\nexport async function market() {\n return napi.market().read() // eslint-disable-line\n}\n\nexport function getCurrency() {\n return getDataLayer().currency\n}\n\nexport async function getPriceFormatter() {\n return napi.priceFormat() // eslint-disable-line\n}\n","const runningExperiments = new Set<string>()\n\nexport function runningExperiment(experiment: string): Boolean {\n return runningExperiments.has(experiment)\n}\n\nexport function enableExperiment(experiment: string): void {\n runningExperiments.add(experiment)\n console.info('Running experiments:', ...runningExperiments.values())\n}\n\nexport function disableExperiment(experiment: string): void {\n runningExperiments.delete(experiment)\n console.info('Running experiments:', ...runningExperiments.values())\n}\n\n// List Current experiments\nexport const EXPLICIT_FILTERS = 'EXPLICIT_FILTERS'\n","// MAIN ID BLOCKS\nexport const FILTER_MAIN_BLOCK_ID = 'filtersPLP'\nexport const SORT_MENU_ID = 'plp-sort-menu'\nexport const SORT_MENU_MOBILE_ID = 'plp-sort-menu-mobile'\nexport const POPIN_ID = 'plp-filter-popin'\nexport const NAVIGATION_MAIN_BLOCK_ID = 'navigationPLP'\nexport const PRODUCTS_LIST_MAIN_BLOCK_ID = 'productsListPLP'\nexport const PRODUCTS_RESULTS_MAIN_BLOCK_ID = 'productsResultsPLP'\nexport const PRODUCTS_RESULTS_HEADER_ID = 'productsResultsHeaderPLP'\nexport const FILTER_BUTTON = 'plp-filter-cta'\nexport const CB_RESULTS_TOTAL_ID = 'cb-results-total-id'\nexport const MY_RECOMMENDATIONS_ID = 'my-recommendations'\n\n// URL variable\nexport const QUERY_URL_PARAMETER_FILTERS = 'filters'\nexport const QUERY_URL_PARAMETER_SORT = 'sort'\n","/**\n filtersPLP:\n navigationPLP\n productsListPLP\n productsResultsPLP\n\n data-request: not mutable // not to be changed\n data-response: mutable // changed by the component\n\n\n Don't:\n const dict = {\n 'foo': 1,\n 'bar': 2\n}\n\n Better:\n const dict = new Map([\n ['foo', 1],\n ['bar', 2]\n ])\n\n dict.get('foo');\n dict.set('foo', 2);\n dict.has('baz');\n dict.keys()\n\n */\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { getPLPData, getPriceFormatter, market } from '@kissui/plp-data'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../config/experiments'\nimport { MY_RECOMMENDATIONS_ID } from '../config/constants'\n\n// todo cache data if not changes\nconst appData = {\n _productsFlat: undefined,\n sessionId: '',\n\n init: async function (plpType) {\n window.plpDataType = plpType\n window.getPLPData = window.getPLPData || getPLPData\n this.set('sessionId', (Math.random() + 1).toString(36).substring(7))\n this.set('filtersSelected', [])\n this.set('sortCurrent', {})\n this.set('sortOptions', [])\n this.set('options', {})\n\n return window.getPLPData()\n },\n\n async reload() {\n this.set('sessionId', (Math.random() + 1).toString(36).substring(7))\n this.set('products', [])\n this.set('filters', [])\n this.set('filtersSelected', [])\n this.set('options', {})\n\n this._productsFlat = undefined\n\n return window.getPLPData()\n },\n\n // review if this pattern about set & get it's ok (I don't think so, because should be unmutable)\n set: function (key, value) {\n this[key] = value\n },\n get: function (key) {\n return this[key] || null\n },\n initPriceFormatter: function () {\n return getPriceFormatter()\n },\n initCurrency: function () {\n return market()\n },\n filters: [],\n products: [],\n productsList: function () {\n return this.products\n },\n\n getProducts() {\n if (this._productsFlat && this._productsFlat.length) {\n return this._productsFlat\n }\n\n this._productsFlat = this.products.reduce((acc, product) => {\n return acc.concat(product.products)\n }, [])\n\n return this._productsFlat\n },\n\n productsListFiltered: function ({ withSort = true } = {}) {\n const selectedFilters = this.get('filtersSelected')\n const filterPredicate = runningExperiment(EXPLICIT_FILTERS)\n ? filterProductsByFilterType(selectedFilters)\n : filterProductsByAllFilters(selectedFilters)\n const filteredList = this.getProducts().filter(filterPredicate)\n const sortCurrent = this.get('sortCurrent') ?? {}\n\n return withSort ? sortProducts(filteredList, sortCurrent) : filteredList\n },\n productsFilteredCount: function () {\n return this.productsListFiltered({ withSort: false }).length\n },\n /*\n * todo: refactor this function\n * fireAll should be true always, it's only true to performance improvement\n * the solution should be in the subscription site, right now we are subscribe to all changes,\n * but this is wrong should be subscribed only to some changes of the store using a seed/key\n * */\n filtersUpdate: function (filterSelection, fireAll = true) {\n const filter = this.get('filters').find(f => f.key === filterSelection.key)\n\n if (!filter) {\n return\n }\n\n setFilterValue(\n this.get('filtersSelected'),\n filter,\n filterSelection.value,\n filterSelection.selected\n )\n\n if (runningExperiment(EXPLICIT_FILTERS)) {\n this.filterChipsUpdate()\n }\n\n fireAll && this.fire()\n },\n filtersUpdateMultiple(key, valueSelections = Map()) {\n const filter = this.get('filters').find(f => f.key === key)\n const filtersSelected = this.get('filtersSelected')\n\n valueSelections.forEach((selected, value) => {\n const selectedCurrently = filtersSelected.find(\n f => f.key === filter.key && filterValueIsEqual(f, value)\n )\n\n if (selectedCurrently && selected) return\n setFilterValue(filtersSelected, filter, value, selected)\n })\n\n this.filterChipsUpdate()\n this.fire()\n },\n filtersSelectedWithLabel: function () {\n return this.get('filtersSelected').map(filter => {\n const { key: filterKey, value: filterValue } = filter\n const foundFilter = this.get('filters').find(f => f.key === filterKey)\n const filterLabel = foundFilter?.values.find(v => v.value === filterValue)?.label\n return {\n categoryTitle: foundFilter?.title,\n label: filterLabel,\n key: filterKey,\n value: filterValue\n }\n })\n },\n filtersSelectedCount: function () {\n return this.get('filtersSelected')?.length ?? 0\n },\n // todo modify this flow because the serilized attributes shouldn't be necessary\n filtersSelectedSerialized: function () {\n const filters = [this.get('sortCurrent'), ...this.get('filtersSelected')]\n return stringifyForAttribute(filters)\n },\n filtersReset: function () {\n this.set('filtersSelected', [])\n this.get('filters').forEach(filter => {\n filter.values.forEach(value => {\n value.selected = false\n value.disabled = false\n })\n })\n const sortCurrent = this.get('sortOptions')\n sortCurrent?.length && this.set('sortCurrent', sortCurrent[0])\n\n if (runningExperiment(EXPLICIT_FILTERS)) {\n this.filterChipsUpdate()\n }\n\n this.fire()\n },\n filterChipsUpdate() {\n const selectedFilters = this.get('filtersSelected')\n const productsList = this.getProducts()\n this.get('filters').forEach(filter => {\n filter.values.forEach(filterChip => {\n // hide product counts\n filterChip.productCount = null\n\n // maintain filter's presence when other filters in same group are selected\n const withoutGroup = selectedFilters.filter(\n selected => selected.key !== filterChip.filterKey\n )\n const onlyFilterInGroup = [...withoutGroup, filterChip]\n const predicate = filterProductsByFilterType(onlyFilterInGroup)\n filterChip.disabled = !productsList.find(predicate)\n })\n })\n },\n\n observers: [],\n subscribe: function (fn) {\n this.observers.push(fn)\n },\n unsubscribe: function (fnToRemove) {\n this.observers = this.observers.filter(fn => {\n if (fn !== fnToRemove) {\n return fn\n }\n })\n },\n fire: function () {\n this.observers.forEach(fn => {\n fn.call()\n })\n }\n}\n\nexport default appData\n\nfunction doesProductMatchFilter(product, filter) {\n const filterValue = filter.value\n const productPropValue = product[filter.filterKey || filter.key]\n switch (typeof productPropValue) {\n case 'string':\n return productPropValue === filterValue\n case 'number':\n return JSON.parse(`[${filterValue}]`).includes(productPropValue)\n default: {\n if (filterValue === MY_RECOMMENDATIONS_ID) {\n const recommendationProducts = appData.get('recommendation')?.products ?? []\n return recommendationProducts.some(p => p.id === product.id)\n }\n\n // check array values or\n // default to false for nullish values\n return productPropValue?.includes(filterValue) || false\n }\n }\n}\n\nfunction groupFiltersByType(filters = []) {\n /*\n group selected filters by key, e.g.\n {\n intensity: [1, 2, 3],\n collection: [a, b, c],\n }\n */\n return filters.reduce((all, filter) => {\n const filterKey = filter.key\n const current = all[filterKey] || []\n return {\n ...all,\n [filterKey]: [...current, filter]\n }\n }, {})\n}\n\nfunction filterProductsByFilterType(filters) {\n const groups = groupFiltersByType(filters)\n const types = Object.keys(groups)\n return (product, index, products) => {\n /*\n does product match at least one filter in each group, e.g.\n {\n intensity: [1, 2, 3],\n collection: [a, b, c],\n }\n matches\n {\n product: { intensity: 1 },\n product: { collection: a },\n }\n */\n return types.every(type => {\n return !!groups[type].find(filter => {\n return (\n doesProductMatchFilter(product, filter) &&\n products.findIndex(p => p.id === product.id) === index // Deduplicates\n )\n })\n })\n }\n}\n\nfunction filterProductsByAllFilters(filters = []) {\n return (product, index, products) => {\n return (\n // check that the product matches every filter selected\n filters.every(filter => {\n return doesProductMatchFilter(product, filter)\n }) && products.findIndex(p => p.id === product.id) === index // Deduplicates\n )\n }\n}\n\nfunction filterValueIsEqual(filterValue, value) {\n return Array.isArray(filterValue.value)\n ? filterValue.value.join(',') === value\n : filterValue.value === value\n}\n\nfunction setFilterValue(filtersSelected, filter, value, selected) {\n filter.values.forEach(filterValue => {\n // todo refactor this function\n let valueIsEqual = filterValueIsEqual(filterValue, value)\n if (!valueIsEqual) {\n return\n }\n\n filterValue.selected = selected\n if (selected) {\n filtersSelected.push({\n key: filter.key,\n value: value,\n color: filterValue.color || null\n })\n } else {\n filtersSelected.splice(\n 0,\n filtersSelected.length,\n ...filtersSelected.filter(\n fSelected => !(fSelected.key === filter.key && fSelected.value === value)\n )\n )\n }\n })\n}\n\nfunction createSorter({ key, order }) {\n const isAscending = order === 'asc'\n\n return (a, b) => {\n if (a[key] < b[key]) {\n return isAscending ? -1 : 1\n }\n if (a[key] > b[key]) {\n return isAscending ? 1 : -1\n }\n return 0\n }\n}\n\nfunction sortProducts(products, { key, order }) {\n const sorter = createSorter({ key, order })\n return [\n ...products.filter(p => p.inStock).sort(sorter),\n ...products.filter(p => !p.inStock).sort(sorter)\n ]\n}\n","import { customEvent } from '@kissui/helpers/src/gtmEvents'\nimport zoneTracking from '@kissui/helpers/src/assets/js/zoneTracking'\nimport { FILTER_MAIN_BLOCK_ID } from '../config/constants'\nimport appData from './plp.data'\n\nconst updateQueryStringParameter = (uri, key, value) => {\n const re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i')\n const separator = uri.indexOf('?') !== -1 ? '&' : '?'\n return uri.match(re)\n ? uri.replace(re, '$1' + key + '=' + value + '$2')\n : uri + separator + key + '=' + value\n}\n\nexport const updateUrlVariable = (variable, queryArray) => {\n // we are removing the hash from the url\n const [path] = window.location.href.split('#')\n const value = encodeURIComponent(JSON.stringify(queryArray))\n const url = updateQueryStringParameter(path, variable, value)\n history.pushState(null, null, url)\n}\n\nexport const getUrlVariable = key => {\n const queryString = window.location.search\n const param = new URLSearchParams(queryString).get(key)\n\n if (!param) {\n return null\n }\n\n try {\n return JSON.parse(decodeURIComponent(param))\n } catch (err) {\n console.error('plp.actions-getUrlVariable: url parsing failed')\n return null\n }\n}\n\nconst defaultTracking = 'none selected'\n\nconst getSortTracking = data => {\n const { isSorted, sortKey, sortOrder } = data\n return `sort:${isSorted ? `${sortOrder}|${sortKey}` : defaultTracking}`\n}\n\nconst getFilterTracking = data => {\n const { isFiltered, filtersSelected } = data\n return `characteristics:${\n isFiltered\n ? // unique array of filter keys\n [...new Set(filtersSelected.map(filter => filter.key))].join(',')\n : defaultTracking\n }`\n}\n\nexport const trackInteraction = (data = {}) => {\n const { isSorted, isFiltered } = data\n const eventAction = 'PLP Filter click'\n\n if (!isSorted && !isFiltered) {\n customEvent({\n eventAction,\n eventLabel: defaultTracking\n })\n return\n }\n\n customEvent({\n eventAction,\n eventLabel: [getSortTracking(data), getFilterTracking(data)].join('|')\n })\n}\n\nexport const trackLoad = () => {\n const campaign = appData.get('campaign')\n const node = window.document.getElementById(FILTER_MAIN_BLOCK_ID)\n if (campaign) {\n zoneTracking(node, campaign)\n }\n}\n\nexport const cleanFilterDataXSS = (source, data) => {\n const cleanData = []\n data.forEach(item => {\n source.forEach(sourceItem => {\n if (sourceItem.key === item.key) {\n sourceItem.values.forEach(value => {\n if (item.value === value.value) {\n cleanData.push({\n key: sourceItem.key,\n value: value.value,\n selected: true\n })\n }\n })\n }\n })\n })\n\n return cleanData\n}\nexport const cleanSortDataXSS = (source, data) => {\n return [...source].filter(item => item.key === data.key && item.order === data.order)\n}\n","import { signal } from '@preact/signals'\nimport type { ModuleData } from './CremaService'\n\ntype ModuleName = 'ProductsList' | 'ProductDetails' | 'HeaderNavigation'\n\ntype PageStore = {\n [key: string]: string | undefined\n pageHtml?: string\n}\n\ntype SignalStore = {\n ProductsList: ModuleData\n ProductDetails: ModuleData\n HeaderNavigation: ModuleData\n}\n\ntype WindowCreamService = {\n pageStores: Map<string, PageStore>\n signalStore: SignalStore\n}\n\ndeclare global {\n interface Window {\n __crema_service__: WindowCreamService\n }\n}\n\n// Stored on window to allow sharing between page builder sections\n// Ideally this would be replaced by loading this service as a shared bundle in future\nwindow.__crema_service__ = window.__crema_service__ || {\n pageStores: new Map<string, PageStore>(),\n signalStore: {\n ProductsList: signal(undefined),\n ProductDetails: signal(undefined),\n HeaderNavigation: signal(undefined)\n }\n}\n\nconst pageStores = window.__crema_service__.pageStores\nconst signalStore = window.__crema_service__.signalStore\n\nexport function clear() {\n pageStores.clear()\n signalStore.ProductsList.value = undefined\n signalStore.ProductDetails.value = undefined\n signalStore.HeaderNavigation.value = undefined\n}\n\nexport function getPageHtml(url: string): string | undefined {\n const store = getStore(url)\n return store.pageHtml\n}\n\nexport function setPageHtml(url: string, html: string): void {\n const store = getStore(url)\n store.pageHtml = html\n}\n\nexport function getModuleData(moduleName: ModuleName): ModuleData {\n return signalStore[moduleName]\n}\n\nexport function setModuleData(moduleName: ModuleName, data: object | undefined): void {\n signalStore[moduleName].value = data\n}\n\nfunction getStore(url: string): PageStore {\n if (!pageStores.has(url)) {\n pageStores.set(url, {})\n }\n\n return pageStores.get(url) as PageStore\n}\n","import { Signal, batch } from '@preact/signals'\n\nimport * as store from './Store'\n\nconst parser = new DOMParser()\n\nexport type ModuleData<T = any> = Signal<Record<PropertyKey, T> | undefined>\n\nexport type HeaderNavigationMenuItem = {\n title: string,\n link: {\n url: string\n }\n}\n\nexport async function loadFromUrl(url: string, cacheOnly: boolean = false): Promise<void> {\n return batch(async () => {\n let html = store.getPageHtml(url)\n\n if (!html) {\n try {\n html = await fetchHtml(url)\n store.setPageHtml(url, html)\n } catch (error) {\n console.debug('Failed to load HTML', error)\n return\n }\n }\n\n if (!cacheOnly) {\n store.setModuleData('HeaderNavigation', parseModuleData(html, 'HeaderNavigationBar'))\n store.setModuleData('ProductsList', parseModuleData(html, 'ProductList'))\n store.setModuleData('ProductDetails', parseModuleData(html, 'ProductDetails'))\n }\n })\n}\n\nexport function loadFromPage(window: Window): void {\n batch(() => {\n const html = window.document.documentElement.innerHTML\n\n store.setModuleData('HeaderNavigation', parseModuleData(html, 'HeaderNavigationBar'))\n store.setModuleData('ProductsList', parseModuleData(html, 'ProductList'))\n store.setModuleData('ProductDetails', parseModuleData(html, 'ProductDetails'))\n\n // Only cache if we found either the PLP data or the PDP data\n if (\n store.getModuleData('HeaderNavigation').value &&\n (store.getModuleData('ProductsList').value ||\n store.getModuleData('ProductDetails').value)\n ) {\n store.setPageHtml(window.location.href, html)\n }\n })\n}\n\nexport function getProductsList(): ModuleData {\n return store.getModuleData('ProductsList')\n}\n\nexport function getProductDetails(): ModuleData {\n return store.getModuleData('ProductDetails')\n}\n\nexport function getHeaderNavigation(): ModuleData {\n return store.getModuleData('HeaderNavigation')\n}\n\nfunction parseModuleData(html: string, moduleName: string): ModuleData | undefined {\n try {\n const moduleScript = parseHtml(html, moduleName)\n return parseProductScript(moduleScript) as ModuleData\n } catch (error) {\n // Failed to parse module, but this could be expected if the module is not present\n return undefined\n }\n}\n\nasync function fetchHtml(url: string): Promise<string> {\n console.debug('Fetching HTML from', url)\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(`Failed to fetch from \"${url}\" - ${response.status}:${response.statusText}`)\n }\n\n const html = await response.text()\n\n return html\n}\n\nfunction parseHtml(html: string, moduleName: string): string {\n const document = parser.parseFromString(html, 'text/html')\n\n const scripts = document.querySelectorAll('script')\n for (const script of scripts) {\n const content = script.textContent ?? ''\n if (content.includes(`\"module\":\"${moduleName}\"`)) return content\n }\n\n throw new Error(`Failed to find module \"${moduleName}\"`)\n}\n\nfunction parseProductScript(script: string): object {\n const lines = script.split('\\n')\n for (const line of lines) {\n const trimmed = line.trim()\n if (trimmed.startsWith('window.ui.push(')) {\n const jsonString = trimmed.replace('window.ui.push(', '').slice(0, -2)\n return JSON.parse(jsonString)\n }\n }\n\n throw new Error('Failed to find UI data in script')\n}\n","import appData from './plp.data'\nimport {\n updateUrlVariable,\n getUrlVariable,\n trackInteraction,\n cleanFilterDataXSS,\n cleanSortDataXSS,\n trackLoad\n} from './plp.actions'\nimport { QUERY_URL_PARAMETER_FILTERS, QUERY_URL_PARAMETER_SORT } from '../config/constants'\nimport { getTrackingData } from '../helpers/tracking'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../config/experiments'\nimport { loadFromUrl, getProductsList, loadFromPage } from '@kissui/crema-service'\nimport { filterActionEvent, filterTrackingFromPlpFilters } from '@kissui/helpers/src/gtmEvents'\n\n// todo find a better way to do this\nlet plpData = {}\nlet appStates = {}\n// one solution is make promise inside of promise\nconst isSorted = data => {\n return (\n data.get('sortCurrent').key !== data.get('sortOptions')[0].key ||\n data.get('sortCurrent').order !== data.get('sortOptions')[0].order\n )\n}\n\nconst isFiltered = data => data.filtersSelectedCount() !== 0\n\nexport default {\n onload: {\n process: function (e, handlePostEvent) {\n const { plpType, appStatesHandler } = e.detail.value\n\n appStates = appStatesHandler\n\n // initialize the store\n const init = appData.init(plpType)\n appData.set('plpType', plpType || null)\n appData.set('innerWidth', window.innerWidth)\n appData.set('innerHeight', window.innerHeight)\n\n // get market data\n const currency = appData.initCurrency()\n const priceFormatter = appData.initPriceFormatter()\n\n Promise.all([init, currency, priceFormatter])\n .then(values => {\n plpData = values[0]\n appData.set('currency', values[1].currency)\n appData.set('priceFormatter', values[2])\n handlePostEvent(new CustomEvent('onloadSuccess'))\n })\n .catch(err => {\n console.error(err)\n handlePostEvent(new CustomEvent('onloadError', { detail: { err } }))\n })\n\n if (runningExperiment(EXPLICIT_FILTERS)) {\n loadFromPage(window)\n }\n }\n },\n onReload: {\n async process(e, handlePostEvent) {\n const { plpType, url } = e.detail.value\n\n let data\n try {\n await loadFromUrl(url)\n data = getProductsList().value\n } catch (err) {\n console.error(err)\n return handlePostEvent(new CustomEvent('onloadError', { detail: { err } }))\n }\n\n window.plpData = Promise.resolve({\n techno: 'unknown', // Only used by mocks?\n data\n })\n\n simulatePageChange(url)\n\n try {\n // Reinitialize the store\n const [_data, currency, priceFormatter] = await Promise.all([\n appData.reload(plpType),\n appData.initCurrency(),\n appData.initPriceFormatter()\n ])\n plpData = _data // NOTE: Getting this from the appData is rather redundant\n appData.set('plpType', plpType || null)\n appData.set('innerWidth', window.innerWidth)\n appData.set('innerHeight', window.innerHeight)\n appData.set('currency', currency.currency)\n appData.set('priceFormatter', priceFormatter)\n handlePostEvent(new CustomEvent('onloadSuccess'))\n appData.fire()\n } catch (error) {\n console.error(error)\n handlePostEvent(new CustomEvent('onloadError', { detail: { error } }))\n }\n }\n },\n onloadSuccess: {\n nextState: function (e) {\n return appStates.onloadSuccess(e)\n }\n },\n onloadError: {\n nextState: function (e) {\n return appStates.showError(e)\n }\n },\n onMergeData: {\n // triggered from plp.app.js\n async process(e, handlePostEvent) {\n const {\n filtersService,\n productService,\n dataSortService,\n pageBuilderProps,\n recommendationService\n } = e.detail.value\n\n const recommendationInstance = recommendationService(pageBuilderProps)\n const dataToMerge = productService(\n plpData,\n pageBuilderProps,\n recommendationInstance?.recommendation\n )\n\n mergeData(dataToMerge)\n\n // Here we merge the data in a lazy way, the first interation is the\n // half-recommended data, missing the loading of products, which, since\n // it comes from Martech, may take longer than the rest. Then, in order\n // not to block the rest, while the spinner is displayed, the mergeData\n // is loaded and processed again.\n if (recommendationInstance?.readyToLoadProducts?.()) {\n await recommendationInstance.loadProducts()\n const newData = productService(\n plpData,\n pageBuilderProps,\n recommendationInstance?.recommendation\n )\n appData.set('recommendation', recommendationInstance.recommendation)\n mergeData(newData)\n appData.fire()\n }\n\n function mergeData(data = {}) {\n mergeProductData(data, pageBuilderProps)\n mergeFilters(data, { pageBuilderProps, dataSortService, filtersService })\n setUrlOverrides()\n handleExperiments()\n trackLoad(pageBuilderProps)\n handlePostEvent(new CustomEvent('switchProductsPage'))\n }\n }\n },\n switchProductsPage: {\n nextState: function (e) {\n if (isSorted(appData) || isFiltered(appData)) {\n return appStates.readyForShowResults(e)\n } else {\n return appStates.readyForPlay(e)\n }\n }\n },\n onMergeDataError: {\n nextState: function (e) {\n return appStates.showError(e)\n }\n },\n onFilter: {\n process: (e, handlePostEvent) => {\n const filtersSelected = appData.get('filtersSelected')\n\n updateUrlVariable(QUERY_URL_PARAMETER_FILTERS, appData.get('filtersSelected'))\n updateUrlVariable(QUERY_URL_PARAMETER_SORT, {\n key: appData.get('sortCurrent').key,\n order: appData.get('sortCurrent').order\n })\n\n handlePostEvent(new CustomEvent('switchProductsPage'))\n\n // condition check to not send empty filter list, clear event is handled in different place\n if (runningExperiment(EXPLICIT_FILTERS) && filtersSelected.length) {\n filterActionEvent(\n 'filter apply',\n ...filterTrackingFromPlpFilters(filtersSelected),\n null,\n e.detail.value\n )\n }\n }\n },\n onSort: {\n process: (e, handlePostEvent) => {\n updateUrlVariable(QUERY_URL_PARAMETER_FILTERS, appData.get('filtersSelected'))\n updateUrlVariable(QUERY_URL_PARAMETER_SORT, {\n key: appData.get('sortCurrent').key,\n order: appData.get('sortCurrent').order\n })\n\n handlePostEvent(new CustomEvent('switchProductsPage'))\n\n trackInteraction({\n isSorted: isSorted(appData),\n isFiltered: isFiltered(appData),\n sortKey: appData.get('sortCurrent').key,\n sortOrder: appData.get('sortCurrent').order,\n filtersSelected: appData.get('filtersSelected')\n })\n }\n },\n onloadFilter: {\n process: function (e, handlePostEvent) {\n handlePostEvent(new CustomEvent('onloadFilterSuccess', { detail: { e } }))\n // handlePostEvent(new CustomEvent('onloadFilterError'))\n }\n },\n onloadFilterSuccess: {\n nextState: function (e) {\n return appStates.readyForFilter(e)\n }\n },\n onloadFilterError: {\n nextState: function (e) {\n return appStates.showError(e)\n }\n }\n}\n\nfunction simulatePageChange(url) {\n try {\n const urlObj = new URL(window.location)\n urlObj.pathname = url\n window.history.pushState({}, '', urlObj)\n // TODO: Most likely need to trigger the matching tracking call for a page load\n } catch (error) {\n console.error('Failed to simulate page change', error)\n }\n}\n\nfunction mergeProductData(data, pageBuilderProps) {\n appData.set('enabledTechnologies', data.enabledTechnologies)\n appData.set(\n 'currentTechnology',\n data.enabledTechnologies\n ?.filter(tech => tech.isSelected)[0]\n ?.id?.split('/')\n .at(-1) ?? null\n )\n\n appData.set('products', data.categories)\n appData.set('translations', data.translations)\n appData.set('nav_links', data.nav_links)\n appData.set('bubbles', data.bubbles)\n appData.set('hide_sort_and_filter', pageBuilderProps.options?.hide_sort_and_filter)\n appData.set('options', pageBuilderProps.options)\n appData.set('maxIntensity', data.maxIntensity)\n appData.set('campaign', getTrackingData(pageBuilderProps))\n}\n\nfunction mergeFilters(data, { pageBuilderProps, dataSortService, filtersService }) {\n const sort = dataSortService(pageBuilderProps)\n const filters = filtersService(\n appData.get('products'),\n pageBuilderProps,\n data.categoriesExtraData,\n data.translations,\n {\n priceFormatter: appData.get('priceFormatter'),\n currency: appData.get('currency')\n }\n )\n\n appData.set('filters', filters)\n appData.set('sortOptions', sort)\n appData.set('sortCurrent', sort[0])\n}\n\nfunction setUrlOverrides() {\n const urlFilters = getUrlVariable(QUERY_URL_PARAMETER_FILTERS)\n if (urlFilters && urlFilters.length > 0) {\n const filterData = cleanFilterDataXSS(appData.get('filters'), urlFilters)\n if (filterData.length > 0) {\n filterData.forEach((filter, index) => {\n const isLast = index === filterData.length - 1\n appData.filtersUpdate(filter, isLast)\n })\n }\n }\n\n const urlSort = getUrlVariable(QUERY_URL_PARAMETER_SORT)\n if (urlSort) {\n const sortData = cleanSortDataXSS(appData.get('sortOptions'), urlSort)\n if (sortData.length > 0) {\n appData.set('sortCurrent', sortData[0])\n }\n }\n}\n\nfunction handleExperiments() {\n if (runningExperiment(EXPLICIT_FILTERS)) {\n appData.filterChipsUpdate()\n\n const notCurrentTech = appData\n .get('enabledTechnologies')\n .find(tech => tech.url !== window.location.pathname)\n if (notCurrentTech) {\n loadFromUrl(notCurrentTech.url, true)\n }\n }\n}\n","export function getTrackingData(pageBuilderProps) {\n // Backward compatibility for when data was at root of object\n const {\n campaign_id,\n campaign_name,\n campaign_creative = null,\n campaign_position\n } = pageBuilderProps\n\n if (!campaign_creative) {\n const { campaign = null } = pageBuilderProps\n return campaign\n }\n\n return {\n id: campaign_id,\n name: campaign_name,\n position: campaign_position,\n creative: campaign_creative\n }\n}\n","import appEvents from './plp.events'\n\nexport default (customEventName, eventData, eventFn = null) => {\n stateTransitionsManager(\n new CustomEvent(customEventName, {\n detail: {\n value: eventData,\n fn: eventFn\n }\n })\n )\n}\n\nconst stateTransitionsManager = event => {\n appEvents[event.type]?.process(event, handlePostEvent)\n}\n\nconst handlePostEvent = e => {\n appEvents[e.type]?.nextState(e)\n}\n","import { EVENT_SORT_BY_CHANGE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.mobileDropDown.scss'\nimport appData from '../../../store/plp.data'\nimport { SORT_MENU_MOBILE_ID, SORT_MENU_ID } from '../../../config/constants'\nimport { escapeHtml } from '@kissui/helpers/src/utils'\n\nclass PlpFilterPopinMobileDropdown extends NespressoElement {\n #SORT_MENU_ID = SORT_MENU_MOBILE_ID\n\n constructor() {\n super()\n this.formatSortSeparator = '::'\n appData.subscribe(this.componentUpdated.bind(this))\n this.boundOnSortChange = this.onSortChange.bind(this)\n }\n\n onStart() {\n const data = document.getElementById(SORT_MENU_ID)?.getAttribute('data')\n if (data) {\n this.template = `\n <nb-dropdown\n id=\"${this.#SORT_MENU_ID}\"\n data-testId=\"plp-sort-menu-mobile\"\n data=\"${escapeHtml(data)}\"></nb-dropdown>`\n }\n }\n\n onReady() {\n this.sortButton = document.getElementById(this.#SORT_MENU_ID)\n this.sortButton?.addEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n }\n\n componentUpdated() {\n const { key, order } = appData.get('sortCurrent')\n this.sortButton?.setSelected(`${key}${this.formatSortSeparator}${order}`)\n }\n\n onSortChange(e) {\n const [key, order] = e.detail.selected.value.split(this.formatSortSeparator)\n appData.set('sortCurrent', { key, order })\n }\n\n onDestroy() {\n this.sortButton?.removeEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n appData.unsubscribe(this.componentUpdated)\n }\n}\n\ncustomElements.get('plp-filter-sort-mobile') ||\n customElements.define('plp-filter-sort-mobile', PlpFilterPopinMobileDropdown)\n\nexport default PlpFilterPopinMobileDropdown\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.content.scss'\nimport '../plp.filterImports'\nimport appData from '../../../store/plp.data'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../../../config/experiments'\n\nclass PlpFilterPopinContent extends NespressoElement {\n #filters = []\n\n constructor() {\n super()\n appData.subscribe(this.onStoreChanges.bind(this))\n }\n\n onStoreChanges() {\n if (runningExperiment(EXPLICIT_FILTERS)) {\n // Force re-init if the filters have changed\n if (this.#filters !== appData.get('filters')) {\n this.onStart()\n this.render(true)\n this.onReady()\n }\n }\n\n this.querySelectorAll('nb-chip').forEach(chip => {\n chip.setAttribute(\n 'disabled',\n '' + this.isDisabled(chip.dataset.filterKey, chip.dataset.filterValue)\n )\n chip.setAttribute(\n 'checked',\n '' + this.isChecked(chip.dataset.filterKey, chip.dataset.filterValue)\n )\n\n if (runningExperiment(EXPLICIT_FILTERS)) {\n const labelEl = chip.querySelector('label span')\n const label = this.getLabel(chip.dataset.filterKey, chip.dataset.filterValue)\n labelEl.textContent = label\n labelEl.setAttribute('phantom', label)\n }\n })\n }\n\n onStart() {\n this.#filters = appData.get('filters')\n\n this.template =\n this.#filters\n ?.map(filter => {\n return `${filter.renderBefore()}\n ${filter.values\n .map(value => {\n value.disabled = this.isDisabled(filter.key, value.value)\n return value.render()\n })\n .join('')}\n ${filter.renderAfter()}`\n })\n .join('') ?? ''\n }\n\n onReady() {\n this.querySelectorAll('nb-chip').forEach(chip => {\n chip.addEventListener('change', this.handleChipEvent)\n })\n }\n\n isDisabled = (type, value) =>\n appData.productsListFiltered({ withSort: false }).filter(product => {\n if (!product[type]) {\n return false\n }\n if (typeof product[type] === 'string') {\n return product[type] === value\n } else if (typeof product[type] === 'number' && typeof value === 'number') {\n return value === product[type]\n } else if (typeof product[type] === 'number') {\n return JSON.parse('[' + value + ']').includes(product[type])\n } else {\n return !!product[type].includes(value)\n }\n }).length === 0\n\n isChecked = (key, value) =>\n appData\n .get('filtersSelected')\n .filter(fSelected => fSelected.key === key && fSelected.value === value).length > 0\n\n getLabel(key, value) {\n let filterValue\n appData.get('filters').some(item => {\n if (item.key !== key) {\n return false\n }\n filterValue = item.values.find(itemValue => {\n if (typeof itemValue.value === 'string') {\n return itemValue.value === value\n } else if (typeof itemValue.value === 'number' && typeof value === 'number') {\n return value === itemValue.value\n } else if (typeof itemValue.value === 'number') {\n return JSON.parse('[' + value + ']').includes(itemValue.value)\n } else {\n return !!itemValue.value.includes(value)\n }\n })\n if (filterValue) {\n return true\n }\n })\n\n const count = filterValue?.productCount ? ` (${filterValue.productCount})` : ''\n return `${filterValue.label}${count}`\n }\n\n onDestroy() {\n appData.unsubscribe(this.onStoreChanges)\n\n this.querySelectorAll('nb-chip').forEach(chip => {\n chip.removeEventListener('change', this.handleChipEvent)\n })\n }\n\n handleChipEvent(e) {\n e.stopPropagation()\n\n const filter = {\n key: e.target.parentNode.dataset.filterKey,\n value: e.target.parentNode.dataset.filterValue,\n selected: e.target.checked, // todo only works for checkbox\n label: e.target.parentNode.dataset.filterLabel\n }\n\n appData.filtersUpdate(filter)\n }\n}\n\ncustomElements.get('plp-filter-popin-content') ||\n customElements.define('plp-filter-popin-content', PlpFilterPopinContent)\n\nexport default PlpFilterPopinContent\n","import { EVENT_POPIN_CLOSE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.footer.scss'\nimport appData from '../../../store/plp.data'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nconst CATEGORY_IDENTIFIER = '/cat/'\n\nclass PlpFilterPopinFooter extends NespressoElement {\n constructor() {\n super()\n appData.subscribe(this.componentUpdated.bind(this))\n }\n\n onStart() {\n const translations = appData.translations\n const { a11y_see_result_number_label } = this.props\n this.template = `\n <nb-link\n class=\"nb-filter-popin-reset-all\"\n size=\"large\"\n color=\"black\"\n style=\"visibility: hidden\"\n >\n ${translations['productlistrespblock.resetfilters.label']}\n </nb-link>\n <nb-cta\n class=\"nb-filter-popin-see-results\"\n variation=\"secondary\"\n style=\"visibility: hidden\"\n aria_label_after=\"${a11y_see_result_number_label}\"\n >\n </nb-cta>\n `\n }\n\n getA11ySeeResultsText() {\n const { see_result_number_label, see_result_number_label_one } = this.props\n const productsFilteredCount = appData.productsFilteredCount()\n const label =\n productsFilteredCount === 1 ? see_result_number_label_one : see_result_number_label\n return label?.replace('{resultsLength}', '' + productsFilteredCount)\n }\n\n onReady() {\n this.componentUpdated()\n this.querySelector('.nb-filter-popin-reset-all')?.addEventListener('click', () => {\n const filtersTracking = this.filtersTracking()\n customEvent({\n event_GA4: true,\n event: 'plp_filter',\n action_type: 'filter clear',\n filter_type: filtersTracking.types,\n filter_values: filtersTracking.values\n })\n appData.filtersReset()\n this.setAttribute('data-refresh', 'true')\n })\n this.querySelector('.nb-filter-popin-see-results')?.addEventListener('click', () => {\n window.dispatchEvent(new CustomEvent(EVENT_POPIN_CLOSE))\n const filtersTracking = this.filtersTracking()\n customEvent({\n event_GA4: true,\n event: 'plp_filter',\n action_type: 'filter apply',\n filter_type: filtersTracking.types,\n filter_values: filtersTracking.values\n })\n })\n }\n\n filtersTracking() {\n let types = []\n let values = []\n const filtersSelected = appData.get('filtersSelected')\n if (filtersSelected && filtersSelected.length) {\n for (let i = 0; i < filtersSelected.length; i++) {\n const filter = filtersSelected[i]\n const value =\n filter.value.indexOf(CATEGORY_IDENTIFIER) > -1\n ? filter.value.substring(\n filter.value.indexOf(CATEGORY_IDENTIFIER) + CATEGORY_IDENTIFIER.length\n )\n : filter.value\n if (types.indexOf(filter.key) > -1) {\n values[types.indexOf(filter.key)] += ',' + value\n } else {\n types.push(filter.key)\n values.push(value)\n }\n }\n }\n\n return {\n types: types.join('|'),\n values: values.join('|')\n }\n }\n\n componentUpdated() {\n const productsFilteredCount = appData.productsFilteredCount()\n const filtersSelectedCount = appData.filtersSelectedCount()\n\n const btnReset = this.querySelector('.nb-filter-popin-reset-all')\n const btnResult = this.querySelector('.nb-filter-popin-see-results')\n\n btnReset.style.visibility =\n filtersSelectedCount && filtersSelectedCount > 0 ? 'visible' : 'hidden'\n btnResult.style.visibility =\n productsFilteredCount && productsFilteredCount > 0 ? 'visible' : 'hidden'\n\n btnResult.querySelector('span').textContent = this.getA11ySeeResultsText()\n btnResult.querySelector('button').setAttribute('aria-label', this.getA11ySeeResultsText())\n }\n\n onDestroy() {\n appData.unsubscribe(this.onStoreChanges)\n }\n}\n\ncustomElements.get('plp-filter-popin-footer') ||\n customElements.define('plp-filter-popin-footer', PlpFilterPopinFooter)\n\nexport default PlpFilterPopinFooter\n","import { BREAKPOINT_M, EVENT_POPIN_CLOSED } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport handleAppEvent from '../../store'\nimport { FILTER_MAIN_BLOCK_ID, POPIN_ID } from '../../config/constants'\nimport appData from '../../store/plp.data'\nimport './plp.filter-popin.scss'\nimport './popin/plp.filter-popin.mobileDropDown'\nimport './popin/plp.filter-popin.content'\nimport './popin/plp.filter-popin.footer'\n\nclass PlpFilterPopin extends NespressoElement {\n onStart() {\n this.props = this._createProps(\n document.getElementById(FILTER_MAIN_BLOCK_ID).parentElement.attributes\n )\n\n const {\n see_result_number_label = 'See {resultsLength} Results',\n see_result_number_label_zero = 'No Result',\n see_result_number_label_one = 'See One Result',\n a11y_see_result_number_label = 'Close and validate filters'\n } = this.props.copywriting || this.props\n // todo: line above is backward compatibility fallback for coffee PLP projects without \"copywriting\"\n // Consider moving the backward compatibility into Coffee PLP DTO to avoid this in the code\n\n const isMobile =\n appData.innerWidth < BREAKPOINT_M\n ? '<plp-filter-sort-mobile></plp-filter-sort-mobile>'\n : ''\n\n this.template = `\n ${isMobile}\n <div class=\"mobileShadow\">\n <header>\n <h2 class=\"t-sm-700-sl\">${appData.translations['productlistrespblock.filter.label']}</h2>\n </header>\n <section>\n <plp-filter-popin-content\n ></plp-filter-popin-content>\n </section>\n <footer>\n <plp-filter-popin-footer\n see_result_number_label=\"${see_result_number_label}\"\n see_result_number_label_zero=\"${see_result_number_label_zero}\"\n see_result_number_label_one=\"${see_result_number_label_one}\"\n a11y_see_result_number_label=\"${a11y_see_result_number_label}\"\n ></plp-filter-popin-footer>\n </footer>\n </div>`\n }\n\n onReady() {\n window.addEventListener(EVENT_POPIN_CLOSED, this.eventPopinClsed)\n }\n\n onDestroy() {\n window.removeEventListener(EVENT_POPIN_CLOSED, this.eventPopinClsed)\n }\n\n eventPopinClsed(e) {\n e.stopPropagation()\n if (e.detail.id === POPIN_ID) {\n handleAppEvent('onFilter')\n }\n }\n}\n\ncustomElements.get('plp-filter-popin') || customElements.define('plp-filter-popin', PlpFilterPopin)\n\nexport default PlpFilterPopin\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport handleAppEvent from '../../store'\nimport './plp.filter-cta.scss'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nclass PlpFilterCta extends NespressoElement {\n bubbleElement = null\n\n static get observedAttributes() {\n return ['data-filter-counter']\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (newVal != null && newVal.length > 0 && newVal !== oldVal) {\n if (name === 'data-filter-counter') {\n this.updateBubbleCounter(newVal)\n }\n }\n }\n\n onStart() {\n this.template = `<nb-cta id='plp-filter' size='40' variation='plpFilter' icon_right='24/symbol/filter'>${this.props.cta_filter_label}</nb-cta>`\n }\n\n onReady() {\n document.getElementById('plp-filter').addEventListener('click', () => {\n handleAppEvent('onloadFilter', {})\n customEvent({\n event_GA4: true,\n event: 'plp_filter',\n action_type: 'filter open'\n })\n })\n\n this.buttonElement = this.querySelector('nb-cta button')\n this.bubbleElement = document.createElement('div')\n this.bubbleElement.classList.add('t-2xs-700-sl')\n this.bubbleElement.classList.add('bubbleCounter')\n this.bubbleElement.innerHTML = '0'\n this.firstChild.firstChild.appendChild(this.bubbleElement)\n }\n\n updateBubbleCounter(counter) {\n if (!this.bubbleElement) {\n return null\n }\n\n this.bubbleElement.innerHTML = counter\n counter === '0'\n ? this.buttonElement.classList.remove('bubbleActive')\n : this.buttonElement.classList.add('bubbleActive')\n }\n}\n\ncustomElements.get('plp-filter-cta') || customElements.define('plp-filter-cta', PlpFilterCta)\n\nexport default PlpFilterCta\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport './plp.filter-links.scss'\nimport './plp.filter-links-slider.scss'\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_SLIDER_READY } from '@kissui/components'\n\nconst SLIDER_NAV_LINKS_ID = 'slider_natural_nav_links'\n\nclass PlpFilterLinks extends NespressoElement {\n constructor() {\n super()\n this.boundReinitSlider = this.reinitSlider.bind(this)\n }\n\n onStart() {\n this.addEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n\n const sliderData = {\n options: {\n mobile: {\n items_per_slide: 'auto',\n item_width: 'auto',\n slide_min_height: '40',\n slider_gap: '0',\n display_buttons: 'false',\n display_nav: 'false',\n overflow: 'false',\n flex_auto: 'true',\n display_gradients: 'true',\n gradients_color: '#FFFFFF',\n gradients_width: '8',\n placeholder_background: 'transparent'\n },\n tablet: {\n items_per_slide: 'auto',\n item_width: 'auto',\n slide_min_height: '80',\n slider_gap: '0',\n display_buttons: 'true',\n display_nav: 'false',\n overflow: 'false',\n flex_auto: 'true',\n display_gradients: 'true',\n gradients_color: '#FFFFFF',\n placeholder_background: 'transparent'\n },\n desktop: {\n items_per_slide: 'auto',\n item_width: 'auto',\n slide_min_height: '80',\n slider_gap: '0',\n display_buttons: 'true',\n display_nav: 'false',\n overflow: 'false',\n flex_auto: 'true',\n display_gradients: 'true',\n gradients_color: '#FFFFFF',\n placeholder_background: 'transparent'\n }\n },\n a11y_labels: {\n prev: this.props.a11y_slider_previous_button,\n next: this.props.a11y_slider_next_button,\n nav: 'Go to slide'\n }\n }\n\n this.template = `<nb-slider-natural\n id='${SLIDER_NAV_LINKS_ID}'\n data=\"${stringifyForAttribute(sliderData)}\">\n ${this.renderLinksList()}\n </nb-slider-menu>`\n }\n\n renderLinksList() {\n const { navigation = [] } = this.props\n\n return navigation\n .map(\n ({\n link = '',\n icon_left = '',\n seo_label = '',\n tracking_label = '',\n label = '',\n selected = false\n }) =>\n `<li><nb-link\n link='${link}'\n size='large'\n phantom='true'\n color='black'\n selected=${selected}\n ${seo_label && `seo_label='${seo_label}'`}\n ${tracking_label && `tracking_label='${tracking_label}'`}\n ${icon_left && `icon_left='${icon_left}'`}\n >${label}</nb-link></li>`\n )\n .join('')\n }\n\n reinitSlider(e) {\n const { id } = readEvent(e)\n if (id !== SLIDER_NAV_LINKS_ID) {\n return\n }\n e.target.initSlider()\n }\n\n /*bindEvents() {\n this.unbindEvents()\n this.link.addEventListener('click', this.boundHandleClick)\n }\n\n unbindEvents() {\n this.link.removeEventListener('click', this.boundHandleClick)\n }*/\n\n disconnectedCallback() {\n this.removeEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n }\n}\n\ncustomElements.get('plp-filter-links') || customElements.define('plp-filter-links', PlpFilterLinks)\n\nexport default PlpFilterLinks\n","import { EVENT_SORT_BY_CHANGE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\n\nimport handleAppEvent from '../../store'\nimport appData from '../../store/plp.data'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { SORT_MENU_ID } from '../../config/constants'\nimport { FILTER_MAIN_BLOCK_ID } from '../../config/constants'\n\nclass PlpFilterSort extends NespressoElement {\n #SORT_MENU_ID = SORT_MENU_ID\n\n constructor() {\n super()\n this.formatSortSeparator = '::'\n appData.subscribe(this.componentUpdated.bind(this))\n this.boundOnSortChange = this.onSortChange.bind(this)\n }\n\n onStart() {\n this.props = this._createProps(\n document.getElementById(FILTER_MAIN_BLOCK_ID).parentElement.attributes\n )\n\n const {\n label_sort_by = 'Sort by',\n aa_description_sort_by = 'You can select different sorting values from this listbox. To interact with this listbox press SPACE or ENTER key.',\n aa_listbox_description_sort_by = 'You can navigate through the options using UP or DOWN arrows keys. To exit this listbox press ESCAPE key.',\n aa_select_description_sort_by = 'To select this option press SPACE or ENTER key.',\n label_close_sort_by = 'Close'\n } = this.props\n\n const options = appData.get('sortOptions').map(option => ({\n label: option.label,\n value: this._formatSortValue(option.key, option.order),\n checked: option.checked\n }))\n\n if (appData.get('sortCurrent').key !== appData.get('sortOptions')[0].key) {\n options.forEach(option => {\n option.checked =\n option.value ===\n this._formatSortValue(\n appData.get('sortCurrent').key,\n appData.get('sortCurrent').order\n )\n })\n }\n\n const data = {\n label: label_sort_by,\n aa_description: aa_description_sort_by,\n aa_listbox_description: aa_listbox_description_sort_by,\n aa_select_description: aa_select_description_sort_by,\n icon_option: '16/symbol/check',\n label_close: label_close_sort_by,\n options: options\n }\n\n this.template = `<nb-dropdown id=\"${this.#SORT_MENU_ID}\" data='${stringifyForAttribute(\n data\n )}'/>`\n }\n\n onReady() {\n this.sortButton = document.getElementById(this.#SORT_MENU_ID)\n this.sortButton?.addEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n }\n\n componentUpdated() {\n const { key, order } = appData.get('sortCurrent')\n this.sortButton?.setSelected(this._formatSortValue(key, order))\n }\n\n onSortChange(e) {\n const [key, order] = e.detail.selected.value.split(this.formatSortSeparator)\n appData.set('sortCurrent', { key, order })\n handleAppEvent('onSort')\n }\n\n onDestroy() {\n this.sortButton?.removeEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n appData.unsubscribe(this.componentUpdated)\n }\n\n _formatSortValue(key, order) {\n return `${key}${this.formatSortSeparator}${order}`\n }\n}\n\ncustomElements.get('plp-filter-sort') || customElements.define('plp-filter-sort', PlpFilterSort)\n\nexport default PlpFilterSort\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nimport './_plp.filter.main.scss'\nimport './plp.filter-cta'\nimport './plp.filter-links'\nimport './plp.filter-sort'\nimport appData from '../../store/plp.data'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nclass PlpFilter extends NespressoElement {\n static get observedAttributes() {\n return ['data-request', 'data-filter-counter']\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (newVal != null && newVal !== oldVal && newVal.length > 0) {\n if (name === 'data-request') {\n this.updateComponent()\n } else if (name === 'data-filter-counter') {\n document\n .getElementById('plp-filter-cta')\n .setAttribute('data-filter-counter', newVal)\n }\n }\n }\n\n onStart() {\n this.props = this._createProps(this.parentElement.attributes)\n this.classList.add('plp-filter')\n }\n\n updateComponent() {\n const nav_links = appData.get('nav_links')\n /* Some markets still using PB old PB export which has 4 campaign param instead of one campaign object.\n This change adds a fallback to work with both the cases. */\n const campaign = {\n id: this.props.campaign_id,\n creative: this.props.campaign_creative,\n name: this.props.campaign_name,\n position: this.props.campaign_position\n }\n\n const HTML = `\n <div class='plp-filter-restrict'>\n <plp-filter-cta\n id=\"plp-filter-cta\"\n cta_filter_label=\"${\n this.props.copywriting?.cta_filter_label || this.props.cta_filter_label\n }\"\n data-filter-counter=\"0\"\n ></plp-filter-cta>\n <plp-filter-links\n data = '${stringifyForAttribute({\n navigation: nav_links,\n a11y_slider_previous_button: this.props.a11y_slider_previous_button,\n a11y_slider_next_button: this.props.a11y_slider_next_button,\n campaign: this.props.campaign || campaign\n })}'\n ></plp-filter-links>\n <plp-filter-sort></plp-filter-sort>\n </div>`\n this.loadTemplate(HTML)\n this.filterLinks = this.querySelectorAll('nb-slider-natural nb-link a')\n this.bindEvents()\n }\n\n linkClick({ textContent }) {\n customEvent({\n eventAction: 'PLP Content Tab',\n eventLabel: textContent\n })\n }\n\n bindEvents() {\n this.unbindEvents()\n if (this.filterLinks?.length) {\n this.filterLinks.forEach(element => {\n const textContent = element.querySelector('span').textContent\n element.boundLinkClick = this.linkClick.bind(this, { textContent })\n element.addEventListener('click', element.boundLinkClick)\n })\n }\n }\n\n unbindEvents() {\n if (this.filterLinks?.length) {\n this.filterLinks.forEach(element => {\n element.removeEventListener('click', element.boundLinkClick)\n })\n }\n }\n}\n\ncustomElements.get('plp-filter') || customElements.define('plp-filter', PlpFilter)\n\nexport default PlpFilter\n","/* eslint-disable */\n\nconst stickyService = () => {\n let element = null\n let elementHeight = 0\n let stickyElementSelector = ''\n let magicIndex = 2 // FFS\n\n const initialize = (\n $element,\n $elementHeight = elementHeight,\n $stickyElementSelector = stickyElementSelector,\n $magicIndex = magicIndex\n ) => {\n element = $element\n elementHeight = $elementHeight\n stickyElementSelector = $stickyElementSelector\n magicIndex = $magicIndex\n element.setAttribute('sticky', 'false')\n element.classList.add('nb-sticky-container')\n updateSticky()\n bindEvent()\n }\n\n const updateSticky = () => {\n const sticky = element.getAttribute('sticky') || 'false'\n let offsetElement = 0\n let isReady = false\n let parent = {}\n for (var i = 0; i < element.parentElement.childNodes.length; i++) {\n if (\n element.parentElement.childNodes[i].tagName &&\n element.parentElement.childNodes[i].tagName === element.tagName\n ) {\n parent = element.parentElement.childNodes[i + magicIndex]\n if (parent) {\n // todo : why 80px here ? if it's header height it should take other banners in consideration ?\n offsetElement = parent.offsetTop - 80\n isReady = true\n }\n }\n if (isReady) {\n break\n }\n }\n // todo review this flow, it's when the sticky element is the first of the list of childrens\n if (isReady && offsetElement === 0) {\n offsetElement = element.parentElement.offsetTop + element.parentElement.offsetHeight\n }\n const boundary = window.scrollY - offsetElement\n const isSticky = boundary > 0\n\n if ((sticky === 'true') !== isSticky) {\n element.setAttribute('sticky', isSticky)\n if (elementHeight > 0) {\n document.body.style.paddingTop = isSticky ? elementHeight + 'px' : '0px'\n }\n }\n }\n\n const destroy = () => {\n unbindEvent()\n }\n\n const bindEvent = () => {\n window.addEventListener('scroll', updateSticky)\n }\n\n const unbindEvent = () => {\n window.removeEventListener('scroll', updateSticky)\n }\n\n const updatePosition = (offset = 0) => {\n let el = element\n if (stickyElementSelector !== '') {\n el = element.querySelector(stickyElementSelector)\n }\n if (!el) {\n return\n }\n\n const $header = document.querySelector('.Header__top')\n const headerRect = $header?.getBoundingClientRect() || { height: 0, y: 0 }\n const header = { height: headerRect.height, top: headerRect.y }\n\n const top = `${header.top + header.height + offset}px`\n el.style.top = top\n\n return 0\n }\n\n return { initialize, destroy, updatePosition }\n}\n\nconst service = stickyService()\n\nexport default service\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport appData from '../../store/plp.data'\n\nconst dataTransformNavLinks = navLinks => {\n return navLinks ? stringifyForAttribute({ navigation: navLinks }) : ''\n}\n\nconst dataTransformNavigationBubbles = ({\n bubbles,\n // todo remove ity\n // navigation_bubbles,\n a11y_slider_previous_button,\n a11y_slider_next_button,\n campaign,\n selected_nav_link_label\n}) => {\n return bubbles\n ? stringifyForAttribute({\n a11y_slider_previous_button,\n a11y_slider_next_button,\n bubbles: bubbles,\n customEventAction: 'PLP Content Tab',\n campaign,\n selected_nav_link_label\n })\n : ''\n}\n\nexport const render = (props, campaign) => {\n const { a11y_slider_previous_button, a11y_slider_next_button } = props\n const nav_links = appData.get('nav_links') || []\n const bubbles = appData.get('bubbles') || []\n const selected_nav_link = nav_links.find(nav_link => nav_link.selected)\n const selected_nav_link_label = selected_nav_link?.label\n\n const data_navigation_bubbles = dataTransformNavigationBubbles({\n bubbles,\n ...props,\n campaign,\n selected_nav_link_label\n })\n\n return `\n <nb-navigation-bubbles data='${data_navigation_bubbles}'></nb-navigation-bubbles>\n <nb-plp-sticky-bar\n data=\"${dataTransformNavLinks(nav_links)}\"\n a11y_slider_previous_button=\"${a11y_slider_previous_button}\"\n a11y_slider_next_button=\"${a11y_slider_next_button}\"\n navigation_bubbles=\"${data_navigation_bubbles}\"\n selected_nav_link_label=\"${selected_nav_link_label}\"\n ></nb-plp-sticky-bar>\n `\n}\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport stickyService from '@kissui/components/src/sticky/sticky.service'\nimport * as navigationBar from './plp.bar'\nimport './_plp.navigation.main.scss'\n\n/*\nSpecs:\n- [✓] Add sticky bar height 180\n- [✓] Add sticky bar on mobile, height 132px\n- [✓] If there is products filtered, remove the sticky bar\n */\n\nclass PlpNavigation extends NespressoElement {\n #isSticky = true\n\n onStart() {\n this.props = this._createProps(this.parentElement.attributes)\n\n // attribute magic-index is used in the sticky service to override the element picked as the \"below the fold\" point :-(\n const magicIndex = this.attributes.getNamedItem('magic-index')\n ? Number(this.attributes.getNamedItem('magic-index').value)\n : undefined\n\n this.#isSticky && stickyService.initialize(this, 0, 'nb-plp-sticky-bar', magicIndex)\n }\n\n static get observedAttributes() {\n return ['sticky', 'data-request']\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (newVal !== null && newVal !== oldVal && newVal.length) {\n if (name === 'sticky') {\n this.#isSticky && stickyService.updatePosition()\n }\n if (name === 'data-request') {\n this.updateComponent()\n }\n }\n }\n\n updateComponent() {\n /* Some markets still using PB old PB export which has 4 campaign param instead of one campaign object.\n This change adds a fallback to work with both the cases. */\n const campaign = {\n id: this.props.campaign_id,\n creative: this.props.campaign_creative,\n name: this.props.campaign_name,\n position: this.props.campaign_position\n }\n const HTML = navigationBar.render(\n this.props.copywriting ? this.props.copywriting : this.props,\n this.props.campaign || campaign,\n true\n )\n this.loadTemplate(HTML)\n }\n\n onDestroy() {\n this.#isSticky && stickyService.destroy()\n }\n}\n\ncustomElements.get('plp-navigation') || customElements.define('plp-navigation', PlpNavigation)\n\nexport default PlpNavigation\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport appData from '../../store/plp.data'\nimport handleAppEvent from '../../store'\n\nclass PlpResultsChip extends NespressoElement {\n onStart() {\n const { a11y_label, color, icon_right, label, variation } = this.props\n\n const colorHtml = color ? `<div class=\"chip-color\" style=\"background:${color}\"></div>` : ''\n\n this.template = `\n <nb-cta\n icon_right=\"${icon_right}\"\n variation=\"${variation}\"\n size=\"32\"\n aria_label=\"${a11y_label} ${label}\"\n >\n ${colorHtml}${label}\n </nb-cta>\n `\n }\n onReady() {\n const { value, type, label } = this.props\n this.addEventListener('click', () => {\n appData.filtersUpdate({\n key: type,\n label: label,\n selected: false,\n value: value\n })\n this.remove()\n handleAppEvent('onFilter')\n })\n }\n}\n\ncustomElements.get('plp-results-chip') || customElements.define('plp-results-chip', PlpResultsChip)\n\nexport default PlpResultsChip\n","import appData from '../../store/plp.data'\nimport './plp.results-chip'\nimport './plp.results-header.scss'\nimport { CB_RESULTS_TOTAL_ID } from '@kissui/apps/src/plp-core/config/constants'\n\nexport default (copywritingProps = {}) => {\n const {\n a11y_header_result_label_button = 'Reset filter',\n a11y_header_result_label_reset = 'Filters',\n a11y_header_result_label_results = 'With your filters activated, you have currently',\n header_result_label = 'Currently shopping by',\n header_result_label_reset = 'Reset all',\n header_result_label_results = 'Results',\n header_result_label_results_one = 'Result',\n header_result_label_results_zero = 'Results'\n } = copywritingProps\n\n const total = appData.productsFilteredCount()\n const filterLabels = appData.filtersSelectedCount() && appData.filtersSelectedWithLabel()\n const getResultLabel = () => {\n switch (total) {\n case 0:\n return header_result_label_results_zero\n case 1:\n return header_result_label_results_one\n default:\n return header_result_label_results\n }\n }\n\n return `\n <nb-container\n element_class=\"plp-results-header\"\n contrast=\"light\">\n ${\n filterLabels\n ? `<p class=\"t-sm-400-sl cb-title\">${header_result_label}\n <span class='sr-only'> ${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> \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 CoffeeCategory 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'\nimport { getSleeveNumber } from '@kissui/helpers/src/catalog'\n\nexport default class CoffeeProduct extends Product {\n cupSizes = []\n cupSizesDetails = []\n flavors = []\n in_stock = true\n sales_multiple = 0\n bundled = false\n logos = []\n is_headline_hidden = ''\n a11y_price = ''\n a11y_product_card = ''\n shop_similar = ''\n label_sleeve = ''\n label_sleeves = ''\n label_capsules = ''\n intensity = null\n a11y_intensity_max = ''\n label_decaffeinato = ''\n show_sleeve_price = false\n show_sleeve = false\n price_per_capsule = null\n final_price = null\n capsule_price_label = ''\n capsule_price_syntax = '{capsule_price_label}: {price_per_capsule}'\n sleeve_syntax = '{numberOfSleeves} {sleeveLabel} ({quantity} {label_capsules})'\n perSleeveLabel = ''\n number_of_sleeves = ''\n number_of_capsules = ''\n show_capsule_price = false\n sort_price = null\n bundle_details = {}\n\n constructor(product, PageBuilderData) {\n super(product)\n this.initializeCopywritingData(PageBuilderData)\n this.initializeOptionsData(PageBuilderData)\n this.initializeProductData(product)\n this.finalizeInitialization(product)\n }\n\n initializeCopywritingData(PageBuilderData) {\n const {\n a11y_price = '',\n a11y_product_card = '',\n shop_similar,\n quick_view_plp = {},\n alt_fair_trade = '',\n alt_vertuo_next = '',\n alt_organic = '',\n alt_rainforest = '',\n alt_sustainability = '',\n alt_q_certification_arabica = ''\n } = PageBuilderData.copywriting || PageBuilderData\n\n this.a11y_price = a11y_price\n this.a11y_product_card = a11y_product_card\n this.shop_similar = shop_similar\n this.quick_view_plp = quick_view_plp\n\n this.altTexts = {\n fair_trade: alt_fair_trade,\n vertuo_next: alt_vertuo_next,\n organic: alt_organic,\n rainforest: alt_rainforest,\n sustainability: alt_sustainability,\n q_certification_arabica: alt_q_certification_arabica\n }\n }\n\n initializeOptionsData(PageBuilderData) {\n const {\n show_sleeve = false,\n label_sleeve = '',\n label_sleeves = '',\n label_capsules = '',\n show_sleeve_price = false,\n capsule_price_label,\n capsule_price_syntax,\n is_headline_hidden = false,\n sleeve_syntax = '{numberOfSleeves} {sleeveLabel} ({quantity} {label_capsules})',\n label_decaffeinato = '',\n a11y_intensity_max = '',\n perSleeveLabel = ''\n } = PageBuilderData.options || PageBuilderData\n\n this.show_sleeve = show_sleeve\n this.label_sleeve = label_sleeve\n this.label_sleeves = label_sleeves\n this.label_capsules = label_capsules\n this.show_sleeve_price = show_sleeve_price\n this.capsule_price_label = capsule_price_label || this.capsule_price_label\n this.capsule_price_syntax = capsule_price_syntax || this.capsule_price_syntax\n this.is_headline_hidden = is_headline_hidden\n this.sleeve_syntax = sleeve_syntax\n this.label_decaffeinato = label_decaffeinato\n this.a11y_intensity_max = a11y_intensity_max\n this.perSleeveLabel = perSleeveLabel || this.perSleeveLabel\n }\n\n initializeProductData(product) {\n this.cupSizes = product.cupSizes || this.cupSizes\n this.cupSizesDetails = product.cupSizesDetails || this.cupSizesDetails\n this.flavors = product.flavors || this.flavors\n this.in_stock = product.inStock !== undefined ? product.inStock : this.in_stock\n this.intensity = product.intensity || this.intensity\n this.min_intensity = product.min_intensity\n this.max_intensity = product.max_intensity\n this.sales_multiple = product.salesMultiple\n this.price_per_capsule = product.price_per_capsule || this.price_per_capsule\n this.price = this.getPrice(product)\n this.number_of_sleeves = product.number_of_sleeves || this.number_of_sleeves\n this.number_of_capsules = product.number_of_capsules || this.number_of_capsules\n this.show_capsule_price = product.show_capsule_price || this.show_capsule_price\n this.sort_price = this.getSortPrice(product)\n this.bundle_details = product.bundle_details || this.bundle_details\n this.images = product.images || {}\n this.initializeLogos(product)\n }\n\n initializeLogos(product) {\n const logosConfig = [\n { condition: product.onlyVertuoNext, name: 'only_vertuo_next', altKey: 'vertuo_next' },\n { condition: product.fairTrade, name: 'fair_trade', altKey: 'fair_trade' },\n { condition: product.organicEu, name: 'is_organic', altKey: 'organic' },\n { condition: product.rainforest, name: 'is_rainforest', altKey: 'rainforest' },\n { condition: product.sustainability, name: 'is_sustainable', altKey: 'sustainability' },\n {\n condition: product.arabica,\n name: 'is_q_certified_arabica',\n altKey: 'q_certification_arabica'\n }\n ]\n this.logos = logosConfig\n .filter(logo => logo.condition != null)\n .map(({ name, altKey }) => ({\n name,\n alt: this.altTexts[altKey]\n }))\n }\n\n finalizeInitialization(product) {\n const sleeveNumber = this.number_of_sleeves || getSleeveNumber(product)\n const { hasPricePerSleeve, sleevePrice } = this.getSleevePrice({\n show_sleeve_price: this.show_sleeve_price,\n number_of_sleeves: sleeveNumber,\n salesMultiple: this.sales_multiple,\n price: this.price,\n bundled: this.bundled\n })\n this.hasPricePerSleeve = hasPricePerSleeve\n this.sleevePrice = sleevePrice\n this.bundled = this.isBundled()\n }\n\n getPrice(product) {\n return product.final_price ?? product.price ?? this.final_price\n }\n\n getSortPrice(product) {\n return this.show_sleeve_price || product.price_per_capsule == null\n ? this.getPrice(product)\n : product.price_per_capsule\n }\n\n getSleevePrice({ show_sleeve_price, number_of_sleeves, salesMultiple, price, bundled }) {\n let hasPricePerSleeve = true\n let sleevePrice = null\n if (!bundled && number_of_sleeves === 1) {\n sleevePrice = price * (show_sleeve_price ? 1 : salesMultiple)\n } else {\n hasPricePerSleeve = false\n }\n return { hasPricePerSleeve, sleevePrice }\n }\n\n isBundled() {\n return this.sales_multiple > 1 && this.unitQuantity === 1\n ? false\n : this.sales_multiple === 1 && this.unitQuantity > 1\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","export default (categories = []) => {\n const intensities = categories\n .flatMap(category => category.products)\n .map(p => p?.intensity)\n .filter(p => p !== undefined)\n return !intensities.length\n ? { min: 100, max: null }\n : {\n min: Math.min(...intensities),\n max: Math.max(...intensities)\n }\n}\n","export const CUPSIZE_ICON_DEFAULT = '24/cupsize/cupsize-espresso-ol'\n\nconst cupSizeLookup = {\n ristretto: '24/cupsize/cupsize-ristretto-ol',\n espresso: '24/cupsize/cupsize-espresso-ol',\n lungo: '24/cupsize/cupsize-lungo-ol',\n 'lungo-plus': '24/cupsize/cupsize-lungo-plus-ol',\n 'ristretto-vertuo': '24/cupsize/cupsize-ristretto-vl',\n 'espresso-vertuo': '24/cupsize/cupsize-espresso-vl',\n 'double-espresso-vertuo': '24/cupsize/cupsize-lungo-vl',\n 'lungo-vertuo': '24/cupsize/cupsize-lungo-vl',\n 'gran-lungo': '24/cupsize/cupsize-gran-lungo-vl',\n coffee: '24/cupsize/cupsize-mug-small-vl',\n 'mug-medium': '24/cupsize/cupsize-mug-medium-vl',\n 'mug-large': '24/cupsize/cupsize-mug-large-vl',\n 'paper-cup-extra-small-alt': '24/cupsize/paper-cup-extra-small-alt',\n 'paper-cup-extra-small': '24/cupsize/paper-cup-extra-small',\n 'paper-cup-large-alt': '24/cupsize/paper-cup-large-alt',\n 'paper-cup-large': '24/cupsize/paper-cup-large',\n 'paper-cup-medium-alt': '24/cupsize/paper-cup-medium-alt',\n 'paper-cup-medium': '24/cupsize/paper-cup-medium',\n 'paper-cup-small-alt': '24/cupsize/paper-cup-small-alt',\n 'paper-cup-small': '24/cupsize/paper-cup-small',\n xl: '24/accessory/travel-mug-vl',\n 'cold-brew': '24/coffee/cold-brew',\n 'carafe-vertuo': '24/cupsize/cupsize-carafe-vl',\n alto: '24/cupsize/cupsize-alto-vl',\n americano: '24/cupsize/cupsize-americano-ol',\n icedrecipe: '24/recipe/iced-coffee',\n 'icedrecipe-vertuo': '24/recipe/iced-vl',\n milk: '24/coffeenote/milky',\n 'cappuccino-and-latte-macchiato': '24/recipe/cappuccino-ol',\n 'double-cappuccino': '24/recipe/double-cappuccino-vl',\n reverso: '24/recipe/reverso-vl',\n 'cortado-cappuccino': '24/recipe/cortado-ol',\n 'ristretto-b2b': '',\n 'espresso-b2b': '',\n 'lungo-b2b': '',\n 'icedRecipe-b2b': ''\n}\n\n/**\n * @function\n * @description Returns the icon for a given cup size, or a default icon.\n * @param {string} cupSize\n * @param {boolean} returnDefaultIcon If true, an icon will always be returned, else `''`\n * @returns {string}\n */\nexport const getCupSizeIcon = (cupSize, returnDefaultIcon = true) => {\n const cupSizeStr = cupSize ? cupSize.split('/')?.pop() : ''\n\n const cupSizeKey = cupSizeStr\n .toLowerCase()\n .replace('capsule-cupsize-', '')\n .replace('machine-cupsize.', '') // This seems incorrect, but is the information we currenrtly have about this cup size\n\n return cupSizeLookup[cupSizeKey] || (returnDefaultIcon ? CUPSIZE_ICON_DEFAULT : '')\n}\n\n/**\n * @function\n * @description Returns the type of icon for a given cupsize, so to distinguish between\n * coffees for recipes or normal coffees\n * @param {string} cupSize\n * @returns {'recipe' | 'coffee'}\n */\nexport const getCupType = cupSize => {\n const cupSizeIcon = getCupSizeIcon(cupSize)\n if (cupSizeIcon.includes('recipe')) return 'recipe'\n if (cupSizeIcon.includes('cupsize')) return 'coffee'\n}\n","import { getCupSizeIcon } from '@kissui/helpers/src/cupSizeIcons'\n\nconst format = category => ({\n icon: getCupSizeIcon(category.id),\n label: category.name,\n size: category.name.toLowerCase(),\n capacityLabel: category.capacityLabel,\n category\n})\n\nexport default (cupSizes, categories) => {\n return cupSizes.reduce((all, current) => {\n const category = categories.find(c => c.id === current)\n return category ? [...all, format(category)] : all\n }, [])\n}\n","import { getFinalPrice } from '@kissui/plp/services'\nimport { isBundled } from '@kissui/helpers/src/catalog'\nimport CoffeeCategory from '../models/coffee.category'\nimport CoffeeProduct from '../models/coffee.product'\nimport MainDTO from '../../plp-core/models/MainDTO'\nimport {\n getArabica,\n getFairTrade,\n getOrganicEu,\n getProductHighlight,\n getRainforest,\n getSustainability,\n getVertuoNext\n} from '@kissui/helpers/src/cremaDataHelper'\nimport getMinMaxIntensity from '../../plp-core/helpers/getMinMaxIntensity'\nimport getCupSizesDetails from '../../plp-core/helpers/getCupSizesDetails'\n\nconst getPageBuilderData = (PageBuilderData, field) =>\n PageBuilderData.options ? PageBuilderData.options[field] : PageBuilderData[field]\n\n// AKA productService\nexport default (plpData, PageBuilderData, recommendation) => {\n /**\n * WIP Improve this loops\n * adds a property to products containing the given category assigned to it\n * The category is recognized by ID\n * to apply a 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 */\n const addProductAttribute = (\n { categories, productGroups, products },\n categoryFetcher,\n assignHandler\n ) => {\n const category = categoryFetcher(categories)\n if (!category) {\n return\n }\n const categoryGroup = productGroups.find(group => category.id === group.categoryId)\n if (!categoryGroup) {\n return\n }\n categoryGroup.productIds.forEach(productId => {\n const prod = products.find(product => product.id === productId)\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 addProductAttribute(\n plpData.data.configuration.eCommerceData,\n getFairTrade,\n (prod, category) => (prod.fairTrade = category.name)\n )\n addProductAttribute(\n plpData.data.configuration.eCommerceData,\n getProductHighlight,\n prod => (prod.highlighted = true)\n )\n addProductAttribute(\n plpData.data.configuration.eCommerceData,\n getVertuoNext,\n prod => (prod.onlyVertuoNext = true)\n )\n addProductAttribute(\n plpData.data.configuration.eCommerceData,\n getOrganicEu,\n prod => (prod.organicEu = true)\n )\n addProductAttribute(\n plpData.data.configuration.eCommerceData,\n getRainforest,\n prod => (prod.rainforest = true)\n )\n addProductAttribute(\n plpData.data.configuration.eCommerceData,\n getSustainability,\n prod => (prod.sustainability = true)\n )\n addProductAttribute(\n plpData.data.configuration.eCommerceData,\n getArabica,\n prod => (prod.arabica = true)\n )\n\n const { min, max } = getMinMaxIntensity(plpData.data.configuration.eCommerceData.categories)\n\n PageBuilderData.min_intensity = min\n PageBuilderData.max_intensity = max\n\n plpData.data.configuration.eCommerceData.products.forEach(plpProduct => {\n const show_sleeve_price = PageBuilderData.options\n ? PageBuilderData.options.show_sleeve_price\n : PageBuilderData.show_sleeve_price\n\n const { showCapsulePrice, price_per_capsule, final_price } = getFinalPrice(\n show_sleeve_price,\n plpProduct,\n isBundled\n )\n\n plpProduct.sort_price = show_sleeve_price ? plpProduct.price : plpProduct.price_per_capsule\n plpProduct.show_sleeve_price = show_sleeve_price\n plpProduct.label_sleeve = getPageBuilderData(PageBuilderData, 'label_sleeve')\n plpProduct.label_sleeves = getPageBuilderData(PageBuilderData, 'label_sleeves')\n plpProduct.label_capsules = getPageBuilderData(PageBuilderData, 'label_capsules')\n plpProduct.show_sleeve = getPageBuilderData(PageBuilderData, 'show_sleeve')\n plpProduct.capsule_price_label = getPageBuilderData(PageBuilderData, 'capsule_price_label')\n plpProduct.capsule_price_syntax = getPageBuilderData(\n PageBuilderData,\n 'capsule_price_syntax'\n )\n plpProduct.price_per_capsule = price_per_capsule\n plpProduct.final_price = final_price\n\n plpProduct.show_capsule_price = showCapsulePrice\n\n if (plpProduct.cupSizes) {\n plpProduct.cupSizesDetails = getCupSizesDetails(\n plpProduct.cupSizes,\n plpData.data.configuration.eCommerceData.categories\n )\n }\n\n if (PageBuilderData.products && PageBuilderData.products.length) {\n PageBuilderData.products.forEach(pbProduct => {\n if (pbProduct.sku && pbProduct.sku === plpProduct.legacyId) {\n plpProduct.number_of_sleeves = pbProduct.number_of_sleeves\n plpProduct.number_of_capsules = pbProduct.number_of_capsules\n\n if (pbProduct.bundle_details) {\n plpProduct.bundle_details = pbProduct.bundle_details || {}\n }\n }\n })\n }\n })\n\n return MainDTO(\n plpData,\n PageBuilderData,\n CoffeeCategory,\n CoffeeProduct,\n undefined,\n recommendation\n )\n}\n","export const NOTES_ICON_DEFAULT = '24/coffee/coffee-aroma'\n\n/**\n * Normalize aromatic note\n * E.g. veryRoasted become roasted\n * For notes with hyphen, it's not necessary\n * E.g. nutty-and-balanced will be considered has nutty\n * @param {string} note\n * @returns {string}\n */\nconst harmonizeNoteName = _note => {\n const sanityNote = _note.split('/')\n let note = sanityNote.pop()\n note = note.replace('capsule-aromatic-', '').replace('recipe-', '')\n\n if (['peppery', 'spicy', 'peppery-note'].includes(note)) {\n return '24/coffeenote/spicy'\n } else if (['woody', 'wood', 'oak-wood', 'smoky-wood'].includes(note)) {\n return '24/coffeenote/oak-wood'\n } else if (\n [\n 'sugar',\n 'brown-sugar-and-roasted-notes',\n 'candy-sweet',\n 'delicate-toasted-biscuit-notes'\n ].includes(note)\n ) {\n return '24/coffeenote/sugar'\n } else if (['sweet'].includes(note)) {\n return '24/coffeenote/sweet'\n } else if (['berry'].includes(note)) {\n return '24/coffeenote/berry'\n } else if (['baked-apple', 'apple', 'baked-apple-flavors'].includes(note)) {\n return '24/coffeenote/baked-apple'\n } else if (['bergamot'].includes(note)) {\n return '24/coffeenote/bergamot'\n } else if (['bitterness', 'bitter'].includes(note)) {\n return '24/coffeenote/bitterness'\n } else if (['blueberry'].includes(note)) {\n return '24/coffeenote/blueberry'\n } else if (['bread-aroma', 'bread'].includes(note)) {\n return '24/coffeenote/bread-aroma'\n } else if (['candied-fruit'].includes(note)) {\n return '24/coffeenote/candied-fruit'\n } else if (['caramel'].includes(note)) {\n return '24/coffeenote/caramel'\n } else if (['cereal', 'cerealFruity', 'mild-cereal', 'sweetCereal'].includes(note)) {\n return '24/coffeenote/cereal'\n } else if (\n [\n 'maltedCereal',\n 'malted',\n 'toasted-cereal',\n 'malty-faintly-green-notes',\n 'maltyToasted'\n ].includes(note)\n ) {\n return '24/coffeenote/malted'\n } else if (\n ['roastedCereal', 'veryRoasted', 'roasted', 'longRoasted', 'roastedCocoa'].includes(note)\n ) {\n return '24/coffeenote/roasted'\n } else if (\n [\n 'hintOfFruity',\n 'fruityWiney',\n 'fruity',\n 'fruity-exotic',\n 'juicy-fruity',\n 'ripe-fruits'\n ].includes(note)\n ) {\n return '24/coffeenote/fruity'\n } else if (['citric', 'lemon', 'citrus'].includes(note)) {\n return '24/coffeenote/citrus'\n } else if (['cocoa', 'hintsOfBitterCocoaPowderAndCereals'].includes(note)) {\n return '24/coffeenote/cocoa'\n } else if (['chocolate', 'dark-chocolate', 'white-chocolate'].includes(note)) {\n return '24/coffeenote/chocolate'\n } else if (['cardamom'].includes(note)) {\n return '24/coffeenote/cardamom'\n } else if (['ginger', 'cocoaGinger'].includes(note)) {\n return '24/coffeenote/ginger'\n } else if (['ginseng'].includes(note)) {\n return '24/coffeenote/ginseng'\n } else if (['nutty', 'nut', 'hazelnut', 'hazelnut-aromas'].includes(note)) {\n return '24/coffeenote/hazelnut'\n } else if (['refreshing-mint', 'peppermint'].includes(note)) {\n return '24/coffeenote/peppermint'\n } else if (['almond', 'almonds'].includes(note)) {\n return '24/coffeenote/almonds'\n } else if (['balance', 'balanced', 'smooth'].includes(note)) {\n return '24/coffeenote/balance'\n } else if (['tropical', 'exotic'].includes(note)) {\n return '24/coffeenote/tropical'\n } else if (['coconut'].includes(note)) {\n return '24/coffeenote/coconut'\n } else if (['cocktail'].includes(note)) {\n return '24/coffeenote/cocktail'\n } else if (['biscuity', 'biscuit', 'reminiscent-shortbread-cookies'].includes(note)) {\n return '24/coffeenote/biscuit'\n } else if (\n ['whiskey', 'Whisky', 'whisky', 'alcohol', 'whiskey-flavor', 'whisky-flavour'].includes(\n note\n )\n ) {\n return '24/coffeenote/alcohol'\n } else if (['watermelon'].includes(note)) {\n return '24/coffeenote/watermelon'\n } else if (['RedFruit', 'redfruit', 'red-fruit', 'strawberry'].includes(note)) {\n return '24/coffeenote/red-fruit'\n } else if (\n [\n 'flowery',\n 'flower',\n 'Floral',\n 'floral',\n 'floralJasmine',\n 'floralandWild',\n 'orange-blossom'\n ].includes(note)\n ) {\n return '24/coffeenote/flowery'\n } else if (['herbal', 'dry-vegetal'].includes(note)) {\n return '24/coffeenote/herbal'\n } else if (['honey'].includes(note)) {\n return '24/coffeenote/honey'\n } else if (['smooth-b2b'].includes(note)) {\n return '24/coffeenote/roasted'\n } else if (\n ['sweetnotes-b2b', 'toffeenotes-b2b', 'caramellynotes-b2b', 'caramelized'].includes(note)\n ) {\n return '24/coffeenote/caramel'\n } else if (\n [\n 'rich-b2b',\n 'veryRoasted',\n 'intense',\n 'intense-selection',\n 'rich',\n 'intense-roasted',\n 'bold-roasted-notes'\n ].includes(note)\n ) {\n return '24/coffeenote/intense-roasted'\n } else if (['leather'].includes(note)) {\n return '24/coffeenote/leather'\n } else if (['powerful-intense', 'powerful'].includes(note)) {\n return '24/coffeenote/powerful-intense'\n } else if (['milky', 'milk', 'milk-selection'].includes(note)) {\n return '24/coffeenote/milky'\n } else if (['pumpkin', 'sweet-pumpkin'].includes(note)) {\n return '24/coffeenote/pumpkin'\n } else if (['vanilla', 'vanillaAlmonds', 'vanillaCardamom'].includes(note)) {\n return '24/coffeenote/vanilla'\n } else if (['vegetal'].includes(note)) {\n return '24/coffeenote/vegetal'\n } else if (['winey', 'wine'].includes(note)) {\n return '24/coffeenote/winey'\n } else if (['pecan-nut', 'pecan', 'praline-notes'].includes(note)) {\n return '24/coffeenote/nut'\n } else if (['maple-syrup', 'syrup'].includes(note)) {\n return '24/coffeenote/syrup'\n } else if (['amaretti'].includes(note)) {\n return '24/coffeenote/amaretti'\n } else if (['dry-fruits'].includes(note)) {\n return '24/coffeenote/dry-fruits'\n } else if (['peanut'].includes(note)) {\n return '24/coffeenote/peanut'\n } else if (['popcorn'].includes(note)) {\n return '24/coffeenote/popcorn'\n } else if (['sesame'].includes(note)) {\n return '24/coffeenote/toasted-sesame'\n }\n return NOTES_ICON_DEFAULT\n}\n\nexport const getNoteIcon = note => {\n return harmonizeNoteName(note)\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\n/**\n * @param {{}} [_filter]\n */\nexport default class Filter {\n #type = ''\n #key = ''\n #iconFn = {}\n #filterFn = {}\n #title = ''\n #values = []\n #after = '</fieldset>'\n #before = `<fieldset aria-labelledby=\"{key}\"><legend id=\"{key}\" aria-hidden=\"true\" class='${\n viewportHelper.is.mobile ? 't-sm-700-sl' : 't-md-700-sl'\n }'>{title}</legend>`\n showalllabel = ''\n\n constructor(_filter = {}) {\n this.#type = _filter.type\n this.#key = _filter.key\n this.#iconFn = _filter.iconFn ? _filter.iconFn : null\n this.#filterFn = _filter.filterFn ? _filter.filterFn : null\n const title = _filter.title ? _filter.title.toLowerCase() : 'Filter'\n this.#title = title.charAt(0).toUpperCase() + title.slice(1)\n this.#before = _filter.before ? _filter.before : this.#before\n this.#after = _filter.after ? _filter.after : this.#after\n this.showalllabel = _filter.showalllabel ?? ''\n }\n\n set values(values) {\n this.#values = values\n }\n\n set after(after) {\n this.#after = after\n }\n\n get after() {\n return this.#after\n }\n\n get values() {\n return this.#values\n }\n\n get type() {\n return this.#type\n }\n\n get filterFn() {\n return this.#filterFn\n }\n\n get iconFn() {\n return this.#iconFn\n }\n\n get key() {\n return this.#key\n }\n\n get title() {\n return this.#title\n }\n\n renderBefore() {\n return this.#before.replace('{title}', this.#title).replaceAll('{key}', this.#key)\n }\n\n renderAfter() {\n return this.#after\n }\n\n pushValues(value) {\n this.#values.findIndex(x => x.value === value.value) === -1 && this.#values.push(value)\n }\n}\n","/**\n * Filter chip type\n */\nexport default class DefaultFilterChipType {\n #value = null\n #label = null\n #filterType = null\n #filterKey = null\n #icon = ''\n #color = ''\n #selected = false\n #disabled = false\n\n constructor({\n value,\n label,\n filterType,\n filterKey,\n icon = '',\n color = '',\n selected = false,\n disabled = false\n }) {\n if (!value) {\n console.error('DefaultFilterChipType: value is required')\n return\n }\n if (!label) {\n console.error('DefaultFilterChipType: label is required')\n return\n }\n if (!filterType) {\n console.error('DefaultFilterChipType: filterType is required')\n return\n }\n if (!filterKey) {\n console.error('DefaultFilterChipType: filterKey is required')\n return\n }\n\n this.#value = value\n this.#label = label\n this.#filterType = filterType\n this.#filterKey = filterKey\n this.#icon = icon\n this.#color = color\n this.#selected = selected\n this.#disabled = disabled\n\n this.productCount = null\n }\n\n set disabled(value) {\n this.#disabled = !!value\n }\n\n get disabled() {\n return this.productCount !== null ? this.productCount === 0 : this.#disabled\n }\n\n set selected(value) {\n this.#selected = !!value\n }\n\n get selected() {\n return this.#selected\n }\n\n get filterKey() {\n return this.#filterKey\n }\n\n get filterType() {\n return this.#filterType\n }\n\n get value() {\n return Array.isArray(this.#value) ? this.#value.join(',') : this.#value\n }\n\n get label() {\n return this.#label\n }\n\n get color() {\n return this.#color\n }\n\n get icon() {\n return this.#icon\n }\n\n // disabled=\"${isDisabled(e.type, v)}\"\n render() {\n const productCountLabel = this.productCount !== null ? ` (${this.productCount})` : ''\n\n return `<nb-chip\n id=\"${this.#filterKey}-${this.#value}\"\n data-filter-value=\"${this.#value}\"\n data-filter-key=\"${this.#filterKey}\"\n data-filter-label=\"${this.#label}\"\n checked=\"${this.#selected}\"\n disabled=\"${this.#disabled}\"\n ${this.#icon ? `icon=\"${this.#icon}\"` : ''}\n ${this.#color ? `color=\"${this.#color}\"` : ''}\n >${this.#label}${productCountLabel}</nb-chip>`\n }\n}\n","import Filter from './filter'\nimport DefaultFilterChipType from './types/DefaultFilterChipType'\n\nconst getCategoryData = (categories, id) => {\n // Restrict filter to NOT use categories containing the word \"label\"\n const findCategory = categories?.find(\n category => category.id === id && !category.id.includes('label')\n )\n return findCategory\n ? {\n // todo this icon should be fixed into the DTO product for all attributes\n icon: findCategory.icon?.icon,\n color: findCategory.cssColorCode ? findCategory.cssColorCode : null,\n label: findCategory.name\n }\n : null\n}\n\nexport default (filterDefinition, categories, categoriesData) => {\n if (!filterDefinition || !categories) {\n console.error('CREATE_FILTER_DEFINITION_CATEGORY_NOT_FOUND')\n return []\n }\n\n const filters = filterDefinition.map(filter => new Filter(filter))\n categories\n .reduce((acc, category) => acc.concat(category.products), [])\n .forEach(product => {\n filters.forEach(filter => {\n const filterKey = filter.key\n const filterType = filter.type\n const fieldValue = product[filterKey]\n typeof fieldValue === 'object'\n ? fieldValue.map(attribute => {\n const data = getCategoryData(categoriesData, attribute)\n if (data) {\n filter.pushValues(\n new DefaultFilterChipType({\n filterKey,\n filterType,\n value: attribute,\n icon: filter.iconFn?.(attribute),\n label: data.label,\n color: data.color ?? null\n })\n )\n }\n })\n : filter.pushValues(\n new DefaultFilterChipType({\n filterKey,\n filterType,\n value: fieldValue,\n icon: filter.iconFn?.(filterKey),\n label:\n typeof filter.filterFn === 'function'\n ? filter.filterFn(fieldValue)\n : fieldValue\n })\n )\n })\n })\n\n return filters\n}\n","import Filter from './filter'\nimport DefaultFilterChipType from './types/DefaultFilterChipType'\nimport navigationBubbles from '../models/NavigationBubbles'\n\n// AKA Bubbles, AKA Collections\nexport default function createCategoriesFilter(\n categories,\n PBprops,\n categoriesExtraData,\n translations\n) {\n const PBBubbles = PBprops.copywriting\n ? PBprops.copywriting.navigation_bubbles.bubbles\n : PBprops.navigation_bubbles.bubbles\n\n const productGroups = categories.map(category => ({\n categoryId: category.id\n }))\n const bubbles = navigationBubbles(PBBubbles, productGroups, categoriesExtraData)\n\n const categoriesFilter = new Filter({\n type: 'default',\n key: 'ranges',\n title: translations['productlistrespblock.filterlabels.collection'],\n showalllabel: PBprops.copywriting?.filter_label_showall_collections ?? ''\n })\n\n bubbles.forEach(bubble => {\n categoriesFilter.pushValues(\n new DefaultFilterChipType({\n value: bubble.link,\n label: bubble.label,\n filterType: categoriesFilter.type,\n filterKey: categoriesFilter.key\n })\n )\n })\n\n return categoriesFilter\n}\n","/**\n * WIP - Intensity filter\n */\nimport Filter from '../../plp-core/filter/filter'\nimport DefaultFilterChipType from '../../plp-core/filter/types/DefaultFilterChipType'\nimport getMinMaxIntensity from '../../plp-core/helpers/getMinMaxIntensity'\n\n// eslint-disable-next-line no-unused-vars\nexport const getIntenistyFilter = (categories, PBprops, translations) => {\n if (!categories) {\n console.error('plp-coffe.filterIntensity.dto.js categories is not defined')\n return null\n }\n /**\n * @description\n * define the filter object data\n */\n const intensityFilter = new Filter({\n type: 'default',\n key: 'intensity',\n title: translations['productlistrespblock.filterlabels.intensity'],\n showalllabel: PBprops.copywriting?.filter_label_showall_intensity ?? ''\n })\n\n const { min: intensityMin, max: intensityMax } = getMinMaxIntensity(categories)\n\n const INTENSITY_RANGES = [\n {\n min: intensityMin,\n max: 5,\n label: PBprops.copywriting\n ? PBprops.copywriting.filter_group_intensity_light\n : PBprops.filter_group_intensity_light,\n value: [1, 2, 3, 4, 5]\n },\n {\n min: 6,\n max: 8,\n label: PBprops.copywriting\n ? PBprops.copywriting.filter_group_intensity_medium\n : PBprops.filter_group_intensity_medium,\n value: [6, 7, 8]\n },\n {\n min: 9,\n max: intensityMax,\n label: PBprops.copywriting\n ? PBprops.copywriting.filter_group_intensity_intense\n : PBprops.filter_group_intensity_intense,\n value: [9, 10, 11, 12, 13, 14, 15]\n }\n ]\n\n INTENSITY_RANGES.forEach(intensity => {\n intensityFilter.pushValues(\n new DefaultFilterChipType({\n value: intensity.value,\n label: intensity.label.replace('{range}', ` ${intensity.min} - ${intensity.max}`),\n filterType: intensityFilter.type,\n filterKey: intensityFilter.key\n })\n )\n })\n\n return intensityFilter\n}\n","import { getNoteIcon } from '@kissui/helpers/src/notesIcons'\nimport { getCupSizeIcon } from '@kissui/helpers/src/cupSizeIcons'\n\nimport createFilter from '../../plp-core/filter/createFilter'\nimport createCategoriesFilter from '../../plp-core/filter/createCategoriesFilter'\nimport { getIntenistyFilter } from './plp-coffee.filterIntensity.dto'\nimport { runningExperiment, EXPLICIT_FILTERS } from '../../plp-core/config/experiments'\n\n// AKA filtersService\nexport const getMergedFilterData = (categories, PBprops, categoriesExtraData, translations) => {\n if (runningExperiment(EXPLICIT_FILTERS)) {\n return [\n ...(runningExperiment(EXPLICIT_FILTERS)\n ? [createCategoriesFilter(categories, PBprops, categoriesExtraData, translations)]\n : []),\n ...createFilter(\n [\n {\n type: 'default',\n key: 'cupSizes',\n title: translations['productlistrespblock.filterlabels.cupsize'],\n showalllabel: PBprops.copywriting?.filter_label_showall_cupsize ?? '',\n /*iconFn: value => value.match(/([^/]*)\\/*$/)[0]*/\n iconFn: getCupSizeIcon\n }\n ],\n categories,\n categoriesExtraData,\n PBprops\n ),\n getIntenistyFilter(categories, PBprops, translations),\n ...createFilter(\n [\n {\n type: 'default',\n key: 'flavors',\n title: translations['productlistrespblock.filterlabels.aromatic'],\n showalllabel: PBprops.copywriting?.filter_label_showall_aromatic ?? '',\n iconFn: getNoteIcon\n }\n ],\n categories,\n categoriesExtraData,\n PBprops\n )\n ]\n }\n\n return [\n getIntenistyFilter(categories, PBprops, translations),\n ...createFilter(\n [\n {\n type: 'default',\n key: 'cupSizes',\n title: translations['productlistrespblock.filterlabels.cupsize'],\n /*iconFn: value => value.match(/([^/]*)\\/*$/)[0]*/\n iconFn: getCupSizeIcon\n },\n {\n type: 'default',\n key: 'flavors',\n title: translations['productlistrespblock.filterlabels.aromatic'],\n iconFn: getNoteIcon\n }\n ],\n categories,\n categoriesExtraData,\n PBprops\n )\n ]\n}\n","/**\n *\n * @param PBprops\n * @returns {[\n * {\n * id: string,\n * checked: boolean,\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:\n PBprops.copywriting?.dropdown_recommended_option_label ||\n PBprops.dropdown_recommended_option_label,\n key: 'recommended',\n order: 'asc',\n checked: true\n },\n {\n id: 'sortPriceAscending',\n label:\n PBprops.copywriting?.dropdown_price_ascending_option_label ||\n PBprops.dropdown_price_ascending_option_label,\n key: 'sort_price',\n order: 'asc',\n checked: false\n },\n {\n id: 'sortPriceDescending',\n label:\n PBprops.copywriting?.dropdown_price_descending_option_label ||\n PBprops.dropdown_price_descending_option_label,\n key: 'sort_price',\n order: 'desc',\n checked: false\n },\n {\n id: 'sortIntensityAscending',\n label:\n PBprops.copywriting?.dropdown_intensity_ascending_option_label ||\n PBprops.dropdown_intensity_ascending_option_label,\n key: 'intensity',\n order: 'asc',\n checked: false\n },\n {\n id: 'sortIntensityDescending',\n label:\n PBprops.copywriting?.dropdown_intensity_descending_option_label ||\n PBprops.dropdown_intensity_descending_option_label,\n key: 'intensity',\n order: 'desc',\n checked: false\n }\n]\n","import appData from './plp.data'\nimport {\n POPIN_ID,\n FILTER_MAIN_BLOCK_ID,\n NAVIGATION_MAIN_BLOCK_ID,\n PRODUCTS_LIST_MAIN_BLOCK_ID,\n PRODUCTS_RESULTS_MAIN_BLOCK_ID,\n CB_RESULTS_TOTAL_ID\n} from '../config/constants'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { setAttributes } from '@kissui/helpers/src/utils'\n\nexport default {\n onloadSuccess: function () {\n const plpApp = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID).parentElement\n plpApp.setAttribute('data-loaded', appData.sessionId)\n },\n /**\n * State: list of products\n */\n readyForPlay: function () {\n const filter = document.getElementById(FILTER_MAIN_BLOCK_ID)\n const navigation = document.getElementById(NAVIGATION_MAIN_BLOCK_ID)\n const productList = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID)\n const productsResults = document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID)\n\n filter.setAttribute('data-request', appData.sessionId)\n filter.setAttribute('data-filter-counter', appData.filtersSelectedCount())\n navigation.setAttribute('data-request', appData.sessionId)\n productList.setAttribute('data-request', appData.sessionId)\n\n filter.style.display = 'block'\n\n navigation.style.display = 'block'\n\n productList.style.display = 'block'\n\n productsResults.style.display = 'none'\n\n if (appData.get('hide_sort_and_filter')) {\n filter.classList.add('hide-sort-and-filter')\n }\n\n document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID).style.display = 'none'\n },\n /**\n * State: list of products filtered\n */\n readyForShowResults: function () {\n const filter = document.getElementById(FILTER_MAIN_BLOCK_ID)\n const navigation = document.getElementById(NAVIGATION_MAIN_BLOCK_ID)\n const productList = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID)\n const productsResults = document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID)\n const cbResultsTotalText = document.getElementById(CB_RESULTS_TOTAL_ID)\n\n filter.style.display = 'block'\n filter.setAttribute('data-request', appData.sessionId)\n filter.setAttribute('data-filter-counter', appData.filtersSelectedCount())\n\n if (navigation) navigation.style.display = 'none'\n\n if (productList) productList.style.display = 'none'\n\n if (productsResults) {\n productsResults.setAttribute('data-request', appData.filtersSelectedSerialized())\n productsResults.style.display = 'block'\n }\n if (cbResultsTotalText) {\n cbResultsTotalText.textContent = appData.productsFilteredCount()\n }\n },\n /**\n * State: filter popin opened\n */\n readyForFilter: function () {\n // check if the popin is in the page\n let plpFilterPopin = document\n .getElementsByClassName('plp-app')[0]\n ?.querySelector(`#${POPIN_ID}`)\n\n if (!plpFilterPopin) {\n // todo test performance of this & new Popin()\n plpFilterPopin = setAttributes(\n document.createElement('nb-popin', {\n is: customElements.get('Popin')\n }),\n {\n 'data-request': appData.sessionId,\n id: POPIN_ID,\n popin_id: POPIN_ID,\n variation: 'before',\n bgcolor: 'white',\n heading: appData.translations['productlistrespblock.filter.label'],\n label_close: 'close',\n content:\n '<plp-filter-popin class=\"plp-filter-popin-content\"></plp-filter-popin>'\n }\n )\n document.getElementsByClassName('plp-app')[0]?.appendChild(plpFilterPopin)\n // todo wrong way to open the popin\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: POPIN_ID } })\n } else {\n // todo wrong way to open the popin\n plpFilterPopin.querySelector('plp-filter-popin').setAttribute('data-refresh', 'true')\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: POPIN_ID } })\n }\n },\n /**\n * State: shows the error\n */\n showError: function (e) {\n const errorMessage = e.detail.err || 'Error'\n console.error(errorMessage)\n }\n}\n","import PLPApp from '../plp-core/plp.app'\nimport { getMergedPLPData, getMergedFilterData, getMergedSortData } from './dataTransform'\nimport appStates from '../plp-core/store/plp.states'\n\nclass PLPCoffee extends PLPApp {\n constructor() {\n super()\n // change for coffee-B2B to see b2b plp\n this.plpType = 'coffee'\n\n this.dataTransformService = getMergedPLPData\n this.dataFiltersService = getMergedFilterData\n this.dataSortService = getMergedSortData\n this.appStates = appStates\n }\n}\n\ncustomElements.get('nb-plp') || customElements.define('nb-plp', PLPCoffee)\n\nexport default PLPCoffee\n"],"names":["createProps","attributes","data","find","attribute","nodeName","getData","props","filter","reduce","all","attr","nodeValue","isNil","JSON","parse","error","console","log","obj","CardLabels","HTMLElement","constructor","super","this","labels","connectedCallback","render","direction","classList","add","length","innerHTML","renderLabels","map","label","name","bgColor","color","join","customElements","get","define","BREAKPOINT_TABLET","BREAKPOINT_M","EVENT_POPIN_OPEN","EVENT_POPIN_CLOSE","EVENT_POPIN_CLOSED","EVENT_POPIN_KEY_DOWN","EVENT_SLIDER_READY","EVENT_SORT_BY_CHANGE","EVENT_SWIPED_DOWN","COFFEE_VERTUO","CONTRAST_LIGHT","NespressoElement","template","_createProps","onStart","loadTemplate","onReady","forceAttributes","force","_diff","elem","_getNodeType","node","nodeType","tagName","toLowerCase","_getNodeContent","childNodes","textContent","domNodes","Array","prototype","slice","call","templateNodes","count","parentNode","removeChild","forEach","index","appendChild","cloneNode","replaceChild","templateContent","fragment","document","createDocumentFragment","templateHTML","str","DOMParser","parseFromString","body","disconnectedCallback","onDestroy","helper","is","innerWidth","vw","devicePixelRatio","window","mobile","mobile_tablet","tablet","desktop","retina","lt","ref","parseHTML","tmp","implementation","createHTMLDocument","makeId","result","characters","i","charAt","Math","floor","random","removeEmptyValues","findText","key","value","text","includes","getHashLink","link","linkHash","linkNoHash","indexOf","replace","lazyLoad","url","inViewPort","setAttribute","cb","img","Image","src","onload","onerror","Error","test","navigator","userAgent","agent","start","Number","substr","lazyBackgroundObserver","IntersectionObserver","entries","entry","isIntersecting","unobserve","target","observe","isOldIOS","interpolate","txt","vars","stChr","enChr","curIdx","stIdx","enIdx","hashId","substring","stringifyForAttribute","escapeHtml","stringify","m","sanitizeString","toString","setAttributes","element","attrs","VARIATION_PLP","VARIATION_PDP","isPdp","variation","renderHeading","name_custom","finalName","headingLevel","getHeadingLevel","push","viewportHelper","renderLink","a11y_product_card","a11yProductName","renderHeadline","headline","is_headline_hidden","renderLabelTechnology","label_technology","renderLabelRange","label_range","ECAPI_TYPE_CAPSULE","ECAPI_TYPE_MACHINE","ECAPI_TYPE_ACCESSORY","ECAPI_TYPE_GIFT_CARD","TECHNOLOGY_CATEGORY_IDENTIFIER","getProduct","sku","napi","catalog","trimSku","getTechnologyName","productData","techno","technologies","isMultipleOf","quantity","multiple","getSleeveNumber","product","getTechnologyNameFn","sales_multiple","unitQuantity","NaN","isBundled","salesMultiple","isSalesMultipleGreaterThanOne","isUnitQuantityEqualToOne","isSalesMultipleEqualToOne","isUnitQuantityGreaterThanOne","getFormattedPrice","async","price","priceFormatter","priceFormat","getPriceFormatter","currency","config","padl","namespace","dataLayer","app","html","short","getStrikethroughPriceElement","component","querySelector","renderStrikethroughPrice","strikethrough_price","strikethroughPrice","fetchStrikethroughPrice","then","payload","catch","e","style","display","renderPrice","hidePrice","giftcard_price","price_per_capsule","show_sleeve_price","type","finalPrice","getDataLayer","padlNamespace","getMarketCode","market","toLocaleLowerCase","getLangCode","page","pageInfo","language","isLoggedIn","user","renderAddToCart","activeLongSku","activeSku","category_name","contact_cta","longSku","position","rendererName","show_view_details","view_details_label","disableTracking","buttonSize","getButtonSize","cta_url","cta_label","contact_cta_text","contact_url_anchor","is_b2b","isArray","some","tech","checkForB2B","skuProp","activeLongSkuProp","disableTrackingProp","getComputedProps","b2bLoggedIn","remainingCases","b2bNotLoggedIn","LABEL_CATEGORY_NAME","LABEL_CATEGORY_NAME_MACHINE","FAIR_TRADE_CATEGORY_NAME","VERTUO_NEXT_CATEGORY_NAME","ORGANIC_EU_CATEGORY_NAME","RAINFOREST_CATEGORY_NAME","SUSTAINABILITY_CATEGORY_NAME","ARABICA_CATEGORY_NAME","PRODUCT_HIGHLIGHT_CATEGORY_NAME","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","getVertuoNext","categories","category","getCategoryRegEx","id","isVertuoNext","getOrganicEu","isOrganicEu","getRainforest","isRainforest","getSustainability","isSustainability","getArabica","isArabica","getLabels","isLabel","getProductHighlight","isProductHighlight","getFairTrade","isFairTrade","categoryIdTail","RegExp","isCategoryHidden","categoryId","hideCategory","PLP_HIDE_CATEGORIES","findIndex","c","PLP_ONLY_SHOW_CATEGORIES","getFinalPrice","showCapsulePrice","final_price","bundled","round","getMaxIntensity","INTENSITY_MAX_OL","apiOverride","pageBuilderData","images","description","api_override","image","icon","main","getMergedProductData","pageBuilderProductProps","pageBuilderProps","options","variant","additional_message","additional_message_icon","additional_message_link","internationalId","unit_quantity","rangeData","rawPrice","image_alt_text","highlighted","dataTransformObjectProductType","getMergedProductCoffeeData","bundle_details","isBundledResult","option","intensity","capsuleProperties","max_intensity","show_capsule_price","getMergedProductMachineData","ratingsAndReviews","ratings","colors","max_colors","show_ratings","minimum_rating","getMergedProductAccessoryData","getMergedProductGiftCardData","_","default_image","VARIATION_CROSS_SELL","getCapsuleFeatures","acidity","bitterness","roastLevel","roast","getSkuQuickViewProp","popinId","skuData","componentType","mergedProductData","getMergedProductDataForComponentType","addToCartProps","getAddToCartProperties","isVariationOnPLP","getPlpQuickViewProps","getCrossSellQuickViewProps","matchedProduct","products","productPageBuilder","legacyId","getAddToCartProps","commonProps","label_capsules","capsule_price_label","capsule_price_syntax","show_sleeve","sleeve_syntax","number_of_sleeves","label_sleeves","label_sleeve","popin","popin_id","close","quick_view_plp","footer","intensity_label","a11y_intensity_max","cup_sizes","items","cupSizesDetails","aromatic_profile","capsuleProductAromatics","levels","pricing","add_to_cart","showSleeve","campaign","copywriting","sku_quick_view","pdpURLs","dispatchEvent","eventName","args","event","CustomEvent","detail","bubbles","Event","createEvent","initEvent","readEvent","emitCustomEvent","customEvent","cancelable","composed","eventsHelper","eventListeners","eventListener","addEventListener","listener","remove","removeEventListener","raisedByPB","raisedByWC","eventData","gtmDataObject","undefined","event_GA4","eventRaisedBy","eventCategory","eventAction","eventLabel","nonInteraction","event_raised_by","trackComponentInteraction","creative","actionType","internationalName","productType","technology","component_name","action_type","item_id_event","item_name_event","item_category_event","item_technology_event","item_range_event","item_price_event","viewPromotion","ecommerce","Object","keys","ecommerceData","promotion_id","promotion_name","creative_slot","creative_name","handlePromoClick","cta_name","cleanedData","selectPromotion","getProductInfo","getProductPayload","actionField","unitPrice","inStock","item","split","pop","dimension44","dimension53","dimension54","dimension55","dimension56","dimension57","dimension192","brand","productImpression","list","p","productInfo","productPayload","currencyCode","impressions","productClick","click","filterActionEvent","filterType","filterValues","clickLocation","dataType","getExplicitFilterEventData","NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING","experiment_action","filter_type","filter_values","click_location","Sku","isQuickViewPlp","boundOnPDPLinkClick","onPDPLinkClick","bind","boundOnQuickViewOpen","onQuickViewOpen","clickMethod","setCardTheme","assign","getSleevePrice","checkHiddenPriceForLoggedInUser","show_view","renderVisual","renderHeader","renderInformation","renderQuickView","renderPricing","renderAction","renderFooter","bindEvent","renderHeaderDefault","renderLogos","alt_fair_trade","alt_organic","alt_vertuo_next","alt_rainforest","alt_sustainable","alt_q_certification_arabica","logos","renderVisualDefault","theme","hasAttribute","renderImage","renderClass","linkHref","trim","sleevePrice","hasPricePerSleeve","renderInformationDefault","quick_view","tracking_list","tracking_position","campaign_creative","colorsSkusList","renderPricingDefault","isPortrait","renderActionDefault","actionSlot","outerHTML","renderFooterDefault","renderAdditionalMessage","additionalMessageFinal","renderIcon","size","seo_label","productIndex","getAttribute","renderSkuQuickView","quickViewElement","handleVariation","zi","handlePLPVariation","createElement","heading","Ds","handleCrossSellVariation","more_info","newQuickViewElement","getSkuQuickViewData","preventDefault","unbindEvent","showQuickView","quickViewTextExists","quick_view_text","querySelectorAll","addStopPropagationEvent","removeStopPropagationEvent","selector","stopPropagationHandler","stopPropagation","bundlePopinIDPrefix","label_close","bundlePopinContent","renderPopinBundleDetail","bundlePopinID","getElementById","hasOwn","hasOwnProperty","classNames","classes","arguments","arg","appendClass","parseValue","apply","newClass","module","exports","default","o","n","t","f","l","s","u","a","__k","__","__b","__e","__d","__c","__h","__v","__source","__self","defaultProps","r","vnode","CompatibilityButton","class","className","onClick","textCentered","maintainElementFocus","_jsx","cn","styles","button","buttonFocus","children","inner","_jsxs","contents","chevron","fetchAndParse","response","fetch","ok","fetchHtml","parser","parseHtml","mainTag","from","child","contains","Context","createContext","setFooter","ModalDrawer","title","closeIconAltText","isOpen","maxHeightMobile","onClose","dialogRef","useRef","isClosing","setIsClosing","useState","useEffect","current","versionMatch","match","isOlderThan153","parseFloat","isOldSafari","dialogPolyfill","import","registerDialog","onDialogClick","showModal","open","hideModal","parentContext","useMemo","container","article","Provider","header","closeButton","autoFocus","content","Footer","useContext","CompatibilityModal","modalSettings","compatibilityUrl","modalTitle","loadingLabel","loadingLabelError","errorLoadingLabel","closeButtonLabel","setData","status","fetchData","Loaded","Pending","stateLoaded","dangerouslySetInnerHTML","__html","statePending","stateError","getChildContext","context","_vdom","_props","d","slot","h","_vdomComponent","_root","toUpperCase","_listener","func","observedAttributes","Reflect","construct","shadow","attachShadow","mode","create","attributeChangedCallback","propTypes","defineProperty","set","displayName","asWebComponent","productStringified","compatibility","compatibilityStringified","modalState","setModalState","compatibilityDataParsed","handleCompatibilityClick","toggleCompatibilityModal","compatibilityButtonLabel","compatibility_card_button_text","compatibility_modal_url","compatibility_modal_title","compatibility_modal_loading_text","compatibility_modal_loading_text_error","compatibility_modal_close_button_ally","isPDP","_Fragment","getDecaffeinatoRegExp","label_decaffeinato","hasDecaffeinato","renderHeadingSku","renderShowSleeve","getSleeveLabel","number_of_capsules","getQuantity","sleeveNumber","numberOfSleeves","sleeveLabel","perSleeveLabel","boundHandleBundleOpen","handleBundleOpen","bundlePopinLink","quickViewLabel","renderSkuQuickViewLink","renderIntensity","maxIntensity","renderCompatibility","renderBundlePopinLink","range","popin_link_text","other_skus","other_skus_quantity","popin_label_close","renderBoxTube","packaging","show_packaging","packaging_list","a11y_packaging_label","selected","ranges","simplifyRangeIds","capsuleHasMachineCompatibilityIssue","dataset","renderPackFormat","pack_format","pricePerCapsule","renderCapsulePrice","bundlePopIn","bgcolor","padding","openBundlePopin","Intensity","parseInt","isNaN","a11yIntensityMax","renderIntensityMin","renderIntensityMax","max","min_intensity","fill","min","bus","_bus","register","callback","fire","EventBus$1","Cta","boundHandleClick","handleClick","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","setTimeout","LAZYLOAD_CUSTOM","PROFILES","sizes","Img","__privateAdd","_initLazyLoad","_setImPolicyQuery","_getRetinaWidth","_getImpolicyProfile","_getClosests","_setCssProperties","_setCssProperty","__privateMethod","initLazyLoad_fn","file","lazyload","fetchpriority","setImPolicyQuery_fn","setCssProperties_fn","parentClass","firstElementChild","WeakSet","#initLazyLoad","#setImPolicyQuery","aspect_ratio","force_width","force_height","impolicy","width","offsetWidth","w","finalWidth","getRetinaWidth_fn","getImpolicyProfile_fn","#getRetinaWidth","#getImpolicyProfile","exactFound","closests","getClosests_fn","tempDiff","diff","closest","#getClosests","every","profile","found","el","#setCssProperties","object_fit","placeholder_color_light","placeholder_color_dark","error_message","setCssProperty_fn","#setCssProperty","setProperty","Link","setClassHelper","bindEvents","image_alt","renderButton","tracking_label","a11y_label_new_tab","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","background_color","classname","element_class","contrastDefault","hasBgImage","renderBg","Chip","checkbox","computedSlot","computeSlot","onclick","background_image","filter_label_AA","rounded","checked","disabled","checkedAttr","disabledAttr","inputId","hash","charCodeAt","makeHash","getElementsByTagName","newValue","recursiveSwitchAriaHidden","componentOpenState","parent","brothers","brother","removeAttribute","focusin","loop","lastFocused","firstFocusable","lastFocusable","focus","setFirstAndLastFocusable","focusable","Dropdown","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","reRender","setSelected","dispatchChange","tmpSelected","switchAriaModal","openingSource","activeElement","prevOption","nextOption","firstOption","lastOption","prevSibling","previousElementSibling","nextSibling","nextElementSibling","ProductTracking","noImpression","getPLPCategory","getPLPData","configuration","eCommerceData","getCategoriesWithPlpData","cupSizes","flavors","Promise","categoryData","isTechnologyCategory","getCategories","supercategories","superCategory","getCategory","code","buildGTMProductObject","capitalize","dimension130","productSelections","impressionsOnScrollData","dimension43","AddToCart","elementID","addToCartCounter","isWindowNapiActive","getConfig","pushButton","ui","productId","activated","resolve","productTracking","getProductData","getSkuKey","plpData","allKeys","currentKeyIndex","__publicField","_AddToCart","SLIDER_CHIPS_ID","PlpStickyBar","boundReinitSlider","reinitSlider","boundLinkClick","linkClick","dropdownButtons","navigation","navigation_bubbles","renderLinksSelect","renderChipsSlider","dropdown","navigationBubble","links","a11y_slider_previous_button","a11y_slider_next_button","selected_nav_link_label","forceSliderWidth","dropdownWidth","navigationBubbleWidth","initSlider","currentTarget","location","href","swipeEvents","stopEl","nwcSwipeEvents","scrollTopArray","scrollLeftArray","scrollTop","scrollLeft","memorizeStartElScrollPositions","startEl","timeDown","Date","now","touches","clientX","clientY","xDiff","yDiff","xDown","yDown","xUp","yUp","defaultVertical","innerHeight","defaultHorizontal","swipeThresholdVertical","getNearestAttribute","swipeThresholdHorizontal","swipeTimeout","timeDiff","eventType","changedTouches","abs","checkScrollCondition","dir","touchType","xStart","xEnd","yStart","yEnd","isScrollable","scrollHeight","clientHeight","scrollWidth","clientWidth","attributeName","defaultValue","documentElement","attributeValue","String","Overlay","overlay","getElementsByClassName","STATE_OPEN","SCROLL_LOCK","Popin","ariaModal","isVideo","boundOpen","boundClose","boundEscapeClose","escapeClose","oldValue","hasEvent","subheading","heading_class","checkIsVideo","parseBool","tempEl","addLock","removeLock","cancelBubble","openVideoPopin","swipeDown","swipeOverlayTogglePlayPause","boundSwipeDown","swipeOverlay","boundSwipeOverlayTogglePlayPause","CardLogos","logos_list","param","appendLogo","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","_container","_pnIndicator","_containerSlidesContent","hasContainer","constants","wrapItems","insertBefore","createIndicator","randId","tag","div","elements","pnAdvancerLeft","pnAdvancerRight","goToElement","goToSlide","showContent","contentId","deselectAllLinkBut","distance","boundingClientRect","scroll","left","behavior","sideScroll","speed","step","slideTimer","setInterval","clearInterval","moveIndicator","determineOverflow","containerMetrics","getBoundingClientRect","containerMetricsRight","right","containerMetricsLeft","contentMetrics","contentMetricsRight","contentMetricsLeft","textPosition","transform","link_plp_category_padding_x","backgroundColor","onResize","clearListeners","kill","intersection","disconnect","root","isInViewport","entryBound","SliderMenu","randomId","sliderMenu","boundOnResize","onLoad","debouncedOnResize","debounce","time","timer","clearTimeout","loadSwiper","SliderMenuLib","li","firstChild","itemTypes","itemDisplay","rootElement","slider","onNavigationClick","SliderNatural","_waitForSliderToBeSized","_set","_getOption","_setProperties","_render","_renderButtons","_renderButton","_renderNav","_renderBullet","_renderCounter","_renderGradients","_renderSafariFix","_calculateItemsPerSlide","_getSliderPositions","_setCss","_setCssSlideWidth","_setCssSlideMinHeight","_setCssSliderGap","_setCssFlexAuto","_setCssPlaceholder","_setCssItemsPerSlide","_applyCenteredLayout","_updateStates","_updateStatesScroll","_setActiveButtons","_setActiveBullet","_setCounter","_setActiveSlides","_gotoDefaultPosition","_onScroll","_getOpacityParams","_setOpacity","_switchBullets","_onPrevClick","_onNextClick","_onNavClick","_dispatchReady","_bindEvent","_unbindEvent","defaultPosition","displayButtons","displayNav","displayCounter","displayGradients","itemsPerSlide","overflow","overflowOpacity","flexAuto","onPrevClick_fn","onNextClick_fn","boundNavClick","onNavClick_fn","boundScroll","onScroll_fn","render_fn","testId","setProperties_fn","loops","waitForSliderToBeSized_fn","dispatchReady_fn","finally","wait","slidesElements","itemNumber","set_fn","item_width","items_per_slide","calculateItemsPerSlide_fn","setCssSlideWidth_fn","setCssItemsPerSlide_fn","setCssFlexAuto_fn","maxSlides","renderButtons_fn","renderNav_fn","renderCounter_fn","renderGradients_fn","applyCenteredLayout_fn","getSliderPositions_fn","getOpacityParams_fn","setOpacity_fn","updateStates_fn","bindEvent_fn","gotoDefaultPosition_fn","renderSafariFix_fn","updateSlider","instantly","currentIndex","carousel","scrollTo","sliderPositions","unbindEvent_fn","#waitForSliderToBeSized","reject","#set","normalisedValue","getOption_fn","convertToCamelCase","arr","low","k","#getOption","#setProperties","a11y_labels","wrapper","property","buttonsContrast","getOppositeContrast","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","has","warn","targets","delete","destroyAll","clear","Deferred","promise","scrollDuration","baseScrollDuration","deferred","scrollPosition","resolveScrollPosition","scrollPaddingTop","scrollToElement","scrollY","top","currentTime","initialTimestamp","performance","deltaScroll","resolveScrollDuration","viewportHeight","bodyHeight","finalTimestamp","requestAnimationFrame","currentTimestamp","moveStep","EVENT_NAVIGATION_SECTION_CHANGE","NB_SLIDES_STICKY","INTERSECTION_RATIOS_SECTION","SLIDER_CONFIG_DEFAULT","display_gradients","display_nav","placeholder_background","slide_min_height","slider_gap","NavigationBubbles","isMobile","scrollObserver","sticky","isSticky","isCenteredItems","is_centered_items","init","eventsListeners","bindSliderLinksEvents","geometry","getGeometry","onSliderLinkClick","$event","sectionId","finalLabel","plpListLabel","bubbleLabel","onSectionChange","updateBubbles","updateChips","createListeners","once","updateLayout","eventsManager","renderNavigation","getSliderOptions","flex_auto","gradients_color","gradients_width","slider_id","a11y_goto_slide","renderList","sliderOptions","sliderData","display_buttons","renderFunction","bubble","renderBubble","bubbleWithCampaign","renderChip","chip","bubbleId","chips","chipId","isChecked","_index","sliderChip","emit","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","b","createSorter","sort","sortProducts","productsFilteredCount","filtersUpdate","filterSelection","fireAll","setFilterValue","filterChipsUpdate","filtersUpdateMultiple","valueSelections","filtersSelected","filterValueIsEqual","filtersSelectedWithLabel","filterKey","filterValue","foundFilter","filterLabel","values","v","categoryTitle","filtersSelectedCount","filtersSelectedSerialized","filtersReset","filterChip","productCount","predicate","subscribe","fn","unsubscribe","fnToRemove","productPropValue","groups","groupFiltersByType","types","splice","fSelected","updateUrlVariable","variable","queryArray","path","updateQueryStringParameter","uri","re","separator","encodeURIComponent","pushState","getUrlVariable","queryString","search","URLSearchParams","decodeURIComponent","defaultTracking","getSortTracking","isSorted","sortKey","sortOrder","getFilterTracking","isFiltered","__crema_service__","pageStores","signalStore","ProductsList","signal","ProductDetails","HeaderNavigation","setPageHtml","getStore","pageHtml","getModuleData","moduleName","setModuleData","loadFromUrl","cacheOnly","batch","store","debug","statusText","parseModuleData","moduleScript","scripts","script","lines","line","trimmed","startsWith","jsonString","parseProductScript","appStates","appEvents","process","handlePostEvent","appStatesHandler","err","loadFromPage","onReload","urlObj","URL","pathname","history","simulatePageChange","_data","onloadSuccess","nextState","onloadError","showError","onMergeData","filtersService","productService","dataSortService","recommendationService","recommendationInstance","mergeData","recommendation","readyToLoadProducts","loadProducts","newData","enabledTechnologies","isSelected","at","translations","nav_links","hide_sort_and_filter","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","parentElement","see_result_number_label_zero","eventPopinClsed","bubbleElement","oldVal","newVal","updateBubbleCounter","cta_filter_label","SLIDER_NAV_LINKS_ID","renderLinksList","label_sort_by","aa_description_sort_by","aa_listbox_description_sort_by","aa_select_description_sort_by","label_close_sort_by","_formatSortValue","updateComponent","HTML","filterLinks","service","stickyService","elementHeight","stickyElementSelector","magicIndex","initialize","updateSticky","offsetElement","isReady","offsetTop","offsetHeight","paddingTop","$element","$elementHeight","$stickyElementSelector","$magicIndex","updatePosition","offset","nav_link","data_navigation_bubbles","dataTransformNavigationBubbles","customEventAction","navLinks","dataTransformNavLinks","_isSticky","getNamedItem","navigationBar","a11y_label","colorHtml","renderProduct","getSkuComponentByType","is_machine_b2b","_headerSelector","_resetSelector","shouldHideHeader","productListBkp","headerMarkup","copywritingProps","a11y_header_result_label_button","a11y_header_result_label_reset","a11y_header_result_label_results","header_result_label","header_result_label_reset","header_result_label_results","header_result_label_results_one","header_result_label_results_zero","total","filterLabels","getResultLabel","arraysAreEqual","outerhtml","hasFilters","listName","resetClick","categoryProducts","PLPApp","dataTransformService","dataFiltersService","propChanged","valueChanged","defineTemplate","enabledExperiments","info","enableExperiment","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","CoffeeCategory","Product","available","maxOrderQuantity","packagingType","pushRatingEnabled","altText","CoffeeProduct","in_stock","a11y_price","shop_similar","sort_price","initializeCopywritingData","initializeOptionsData","initializeProductData","finalizeInitialization","alt_sustainability","altTexts","vertuo_next","organic","rainforest","sustainability","q_certification_arabica","getPrice","getSortPrice","initializeLogos","logosConfig","condition","onlyVertuoNext","altKey","fairTrade","organicEu","arabica","navigationLinks","enabledCremaTechnologies","VERTUO_ICON","PRO_ICON","transformCremaTechnologiesToLink","getIconByTechnology","COFFEE_ORIGINAL","hide_technologies_in_navigation","replaceCremaTechnologies","all_products_navigation_label","selectedTechnology","navLinksWithoutTechnology","navigationBubbles","productGroups","productsGroup","bubblesFilteredAndSorted","bubblesMathProductsGroup","normalizedBubble","ele","cremaCategory","cremaBubble","unshift","addLabels","highlightLabels","textColor","parsedData","parseLabels","labelGroups","group","__label","productIds","prod","labelGroup","indexToRemove","productGroup","MainDTO","colorFilterFunction","getOverridenProductGroups","applyRecommendationOverrides","getPBProperty","pbProduct","pbProductData","display_machine_range_name","applyProductsOverrides","overriddenCategories","extraData","catData","category_id","categoryObj","productID","productObj","Boolean","applyCategoryOverrides","original","vertuo","getMinMaxIntensity","intensities","flatMap","cupSizeLookup","ristretto","espresso","lungo","coffee","xl","alto","americano","icedrecipe","milk","reverso","getCupSizeIcon","cupSize","returnDefaultIcon","cupSizeKey","format","getPageBuilderData","field","getMergedPLPData","addProductAttribute","categoryFetcher","assignHandler","categoryGroup","plpProduct","getCupSizesDetails","getNoteIcon","note","_note","NOTES_ICON_DEFAULT","harmonizeNoteName","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","cssColorCode","createCategoriesFilter","PBprops","PBBubbles","categoriesFilter","filter_label_showall_collections","getIntenistyFilter","intensityFilter","filter_label_showall_intensity","intensityMin","intensityMax","INTENSITY_RANGES","filter_group_intensity_light","filter_group_intensity_medium","filter_group_intensity_intense","getMergedFilterData","filter_label_showall_cupsize","filter_label_showall_aromatic","getMergedSortData","dropdown_recommended_option_label","dropdown_price_ascending_option_label","dropdown_price_descending_option_label","dropdown_intensity_ascending_option_label","dropdown_intensity_descending_option_label","productList","productsResults","cbResultsTotalText","plpFilterPopin","errorMessage","PLPCoffee"],"mappings":"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","x_google_ignoreList":[39,40,46]}