{"version":3,"file":"index.es.min.js","sources":["../../../packages/helpers/src/props.helpers.js","../../../packages/components/src/card-labels/cardLabels.js","../../../packages/components/src/constants.mjs","../../../packages/components/src/nespressoElement/nespressoElement.js","../../../packages/helpers/src/viewport.helpers.ts","../../../packages/helpers/src/utils.ts","../../../packages/components/src/sku/constants.mjs","../../../packages/components/src/sku/fragments/heading.js","../../../packages/helpers/src/catalog.js","../../../packages/helpers/src/getCurrency.js","../../../packages/components/src/sku/fragments/strikethroughPrice.js","../../../packages/helpers/src/dataLayer.js","../../../packages/components/src/sku/fragments/addToCart.js","../../../packages/components/src/sku/fragments/additionalMessage.js","../../../packages/helpers/src/cremaDataHelper.js","../../../packages/components/src/sku-coffee/services/index.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.coffee.dto.js","../../../services/plp/services.js","../../../packages/components/src/sku/services/index.js","../../../packages/components/src/sku-quick-view/shared-quick-view-types.ts","../../../packages/components/src/sku-quick-view/shared-quick-view.ts","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.machine.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.accessory.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.giftCard.dto.js","../../../packages/helpers/src/assets/js/eventDispatch.js","../../../packages/helpers/src/events.helpers.ts","../../../packages/helpers/src/gtmEvents.js","../../../packages/components/src/sku/sku.js","../../../packages/components/src/sku/fragments/setCardTheme.js","../../../packages/components/src/sku/fragments/labels.js","../../../packages/helpers/src/logos.helpers.js","../../../packages/components/src/sku/fragments/image.js","../../../packages/components/src/sku/fragments/labelTechnology.js","../../../packages/components/src/sku/fragments/labelRange.js","../../../packages/components/src/sku/fragments/headline.js","../../../packages/components/src/sku/fragments/quickView.js","../../../packages/components/src/sku/fragments/price.js","../../../packages/components/src/sku-accessory/sku-accessory.js","../../../packages/helpers/src/assets/js/eventBus.js","../../../packages/components/src/cta/cta.js","../../../packages/components/src/img/js/constants.js","../../../packages/components/src/img/img.js","../../../packages/components/src/link/link.js","../../../packages/helpers/src/assets/js/viewportTracking.js","../../../packages/helpers/src/assets/js/zoneTracking.js","../../../packages/components/src/container/container.js","../../../packages/components/src/chip/chip.js","../../../packages/helpers/src/assets/js/scopedKeyboardNav.js","../../../packages/components/src/dropdown/dropdown.js","../../../packages/helpers/src/assets/js/productTracking.js","../../../packages/components/src/add-to-cart/addToCart.js","../../../packages/components/src/plp-sticky-bar/plp-sticky-bar.js","../../../packages/helpers/src/swipeEvents.ts","../../../packages/components/src/popin/components/overlay.js","../../../packages/components/src/popin/popin.js","../../../packages/components/src/card-logos/cardLogos.js","../../../packages/components/src/slider-menu/js/constants.js","../../../packages/components/src/slider-menu/js/SliderMenuLib.js","../../../packages/components/src/slider-menu/slider-menu.js","../../../packages/components/src/slider-natural/slider-natural.js","../../../packages/helpers/src/contrast.helpers.js","../../../packages/helpers/src/useragent.helpers.ts","../../../packages/helpers/src/refs.helpers.js","../../../packages/helpers/src/impolicy.js","../../../packages/components/src/navigation-bubbles/components/bubble/js/constants.js","../../../packages/components/src/navigation-bubbles/components/bubble/bubble.js","../../../packages/helpers/src/intersection-observer.service.js","../../../packages/helpers/src/deferred.js","../../../packages/helpers/src/scrollTo.ts","../../../packages/components/src/navigation-bubbles/data/constants.js","../../../packages/components/src/navigation-bubbles/navigation-bubbles.js","../../../packages/components/src/navigation-bubbles/services/events.manager.js","../../../services/plp-data/src/prod/index.js","../../../packages/apps/src/plp-core/config/experiments.ts","../../../packages/apps/src/plp-core/config/constants.js","../../../packages/apps/src/plp-core/store/plp.data.js","../../../packages/apps/src/plp-core/store/plp.actions.js","../../../services/crema-service/src/Store.ts","../../../services/crema-service/src/CremaService.ts","../../../packages/apps/src/plp-core/store/plp.events.js","../../../packages/apps/src/plp-core/helpers/tracking.js","../../../packages/apps/src/plp-core/store/index.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.mobileDropDown.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.content.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.footer.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-popin.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-cta.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-links.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-sort.js","../../../packages/apps/src/plp-core/components/filter/_plp.filter.main.js","../../../packages/components/src/sticky/sticky.service.js","../../../packages/apps/src/plp-core/components/navigation/plp.bar.js","../../../packages/apps/src/plp-core/components/navigation/_plp.navigation.main.js","../../../packages/apps/src/plp-core/components/results/plp.results-chip.js","../../../packages/apps/src/plp-core/components/results/plp.results-header.js","../../../packages/apps/src/plp-core/components/plp.product.js","../../../packages/apps/src/plp-core/components/results/_plp.results.main.js","../../../packages/apps/src/plp-core/components/products/_plp.products.main.js","../../../packages/apps/src/plp-core/components/products/plp.category-products.js","../../../packages/apps/src/plp-core/plp.app.js","../../../packages/apps/src/plp-core/models/Category.js","../../../packages/apps/src/plp-accessory/models/accessory.category.js","../../../packages/apps/src/plp-core/models/Product.js","../../../packages/apps/src/plp-accessory/models/accessory.product.js","../../../packages/apps/src/plp-core/models/NavigationLinks.js","../../../packages/apps/src/plp-core/models/NavigationBubbles.js","../../../packages/apps/src/plp-core/models/MainDTO.js","../../../packages/apps/src/plp-accessory/dataTransform/plp-accessory.dto.js","../../../packages/apps/src/plp-core/filter/filter.js","../../../packages/apps/src/plp-core/filter/types/DefaultFilterChipType.js","../../../packages/apps/src/plp-core/filter/createFilter.js","../../../packages/apps/src/plp-accessory/dataTransform/plp-accessory.filters.dto.js","../../../packages/apps/src/plp-accessory/dataTransform/plp-accessory.sort.dto.js","../../../packages/apps/src/plp-core/store/plp.states.js","../../../packages/apps/src/plp-accessory/plp-accessory.component.js"],"sourcesContent":["const getData = attributes => attributes.find(attribute => attribute.nodeName === 'data')\n\nconst createProps = attributes => {\n const data = getData([...attributes])\n const props = [...attributes]\n .filter(attribute => attribute.nodeName !== 'data')\n .reduce((all, attr) => {\n return { ...all, [attr.nodeName]: attr.nodeValue }\n }, {})\n\n if (isNil(data)) {\n return props\n }\n\n try {\n return { ...props, ...JSON.parse(data.nodeValue) }\n } catch (error) {\n console.log('ERROR: No data', error, data?.nodeValue)\n }\n}\n\nconst isNil = obj => obj === undefined || obj === null\n\nexport const parseBool = value => (!value || value === 'false' ? false : true)\n\nexport default createProps\n","import createProps from '@kissui/helpers/src/props.helpers'\n\nclass CardLabels extends HTMLElement {\n constructor() {\n super()\n this.props = {}\n this.labels = []\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n }\n\n render() {\n const { labels = [], direction = 'column' } = this.props\n this.classList.add(`${direction === 'row' ? 'direction-row' : 'direction-' + direction}`)\n\n if (labels.length === 0) {\n return ''\n }\n this.labels = labels\n\n this.innerHTML = `${this.renderLabels()}`\n }\n\n renderLabels() {\n return this.labels\n .map(label => {\n const { name = '', bgColor = '', color = '' } = label\n return `<mark class=\"t-3xs-500-caps-sl\"\n ${\n bgColor &&\n color &&\n `style=\"background: ${bgColor}; color: ${color}\"`\n }>\n <span>${name}</span>\n </mark>`\n })\n .join('')\n }\n}\n\ncustomElements.get('nb-card-labels') || customElements.define('nb-card-labels', CardLabels)\n\nexport default CardLabels\n","export const MAX_WIDTH_CONTAINER = 1160\n\nexport const BREAKPOINT_XL = 1920\nexport const BREAKPOINT_TABLET = 1024\nexport const BREAKPOINT_L = 996\nexport const BREAKPOINT_M = 768\nexport const BREAKPOINT_S = 750\nexport const BREAKPOINT_XS = 375\n\nexport const CTA_PRIMARY = 'primary'\nexport const CTA_PRIMARY_TRANSPARENT = 'primary_transparent'\nexport const CTA_SUBTLE = 'subtle'\nexport const CTA_LINK = 'link'\nexport const CTA_LINK_UNDERLINE = 'link-underline'\nexport const CTA_LINK_GOLD = 'link-gold'\nexport const CTA_LINK_ADD_TO_CART_SMALL = 'AddToCart_small'\nexport const CTA_LINK_ADD_TO_CART_LARGE = 'AddToCart_large'\n\nexport const EVENT_TAB_CHANGE = 'EVENT_TAB_CHANGE'\n\nexport const EVENT_VIDEO = 'WEB_COMPONENT_VIDEO'\nexport const EVENT_POPIN_OPEN = 'WEB_COMPONENT_POPIN_OPEN'\nexport const EVENT_POPIN_OPENED = 'WEB_COMPONENT_POPIN_OPENED'\nexport const EVENT_POPIN_CLOSE = 'WEB_COMPONENT_POPIN_CLOSE'\nexport const EVENT_POPIN_CLOSED = 'WEB_COMPONENT_POPIN_CLOSED'\nexport const EVENT_POPIN_CLOSE_CLICK = 'WEB_COMPONENT_POPIN_CLOSE_CLICK'\nexport const EVENT_POPIN_KEY_DOWN = 'keydown'\nexport const EVENT_POPIN_FORM_TOGGLE_TITLE = 'WEB_COMPONENT_POPIN_FORM_TOGGLE_TITLE'\nexport const EVENT_CTA_CLICK = 'WEB_COMPONENT_CTA_CLICK'\nexport const EVENT_HERO_REORDER_OPEN = 'WEB_COMPONENT_HERO_REORDER_OPEN'\nexport const EVENT_HERO_REORDER_CLOSE = 'WEB_COMPONENT_HERO_REORDER_CLOSE'\nexport const EVENT_QUICKVIEW_OPEN = 'WEB_COMPONENT_QUICKVIEW_OPEN'\nexport const EVENT_QS_OPEN = 'WEB_COMPONENT_QS_OPEN'\nexport const EVENT_QS_OPENED = 'WEB_COMPONENT_QS_OPENED'\nexport const EVENT_QS_CLOSE = 'WEB_COMPONENT_QS_CLOSE'\nexport const EVENT_QS_CLOSED = 'WEB_COMPONENT_QS_CLOSED'\nexport const EVENT_QS_CLOSE_CLICK = 'WEB_COMPONENT_QS_CLOSE_CLICK'\nexport const EVENT_QS_KEY_DOWN = 'keydown'\nexport const EVENT_ADD_TO_CART = 'WEB_COMPONENT_ADD_TO_CART'\nexport const EVENT_CART_UPDATED = 'WEB_COMPONENT_CART_UPDATED'\nexport const EVENT_VIDEO_TOGGLE = 'WEB_COMPONENT_VIDEO_TOGGLE'\nexport const VIDEO_ON_HOVER = 'VIDEO_ON_HOVER'\nexport const VIDEO_ON_OUT = 'VIDEO_ON_OUT'\nexport const EVENT_DETAIL_OPEN = 'WEB_COMPONENT_DETAIL_OPEN'\nexport const EVENT_SLIDER_READY = 'WEB_COMPONENT_SLIDER_READY'\nexport const EVENT_SLIDE_CHANGE = 'WEB_COMPONENT_SLIDE_CHANGE'\nexport const EVENT_OVERLAY_OPEN = 'WEB_COMPONENT_OVERLAY_OPEN'\nexport const EVENT_OVERLAY_CLOSE = 'WEB_COMPONENT_OVERLAY_CLOSE'\nexport const EVENT_OVERLAY_CLICKED = 'WEB_COMPONENT_OVERLAY_CLICKED'\nexport const EVENT_OPEN_PRODUCT_AR_CLICKED = 'OPEN_PRODUCT_AR_CLICKED'\nexport const EVENT_SORT_BY_CHANGE = 'WEB_COMPONENT_SORT_BY_CHANGE'\n\nexport const EVENT_BUBBLE_SELECTED = 'EVENT_BUBBLE_SELECTED'\nexport const EVENT_RECO_TOOL_OPTION_CLICKED = 'EVENT_RECO_TOOL_OPTION_CLICKED'\nexport const WEB_COMPONENT_PROJECTS_LOADED = 'WEB_COMPONENT_PROJECTS_LOADED'\nexport const WEB_COMPONENT_ANCHOR_LOADED = 'WEB_COMPONENT_ANCHOR_LOADED'\n\nexport const EVENT_SWIPED_UP = 'swiped-up'\nexport const EVENT_SWIPED_DOWN = 'swiped-down'\nexport const EVENT_SWIPED_LEFT = 'swiped-left'\nexport const EVENT_SWIPED_RIGHT = 'swiped-right'\n\nexport const EVENT_HEADER_POSITION_CHANGED = 'EVENT_HEADER_POSITION_CHANGED'\n\nexport const keys = { ESC: 'Escape' }\n\nexport const ADD_TO_CART_MODIFIER_MINI = 'mini'\nexport const ADD_TO_CART_MODIFIER_DEFAULT = ADD_TO_CART_MODIFIER_MINI\n\nexport const COFFEE_ORIGINAL = 'original'\nexport const COFFEE_VERTUO = 'vertuo'\nexport const COFFEE_PRO = 'pro'\nexport const COFFEE_OL = 'OL'\nexport const COFFEE_VL = 'VL'\nexport const INTENSITY_MAX_OL = 14\nexport const INTENSITY_MAX_VL = 12\nexport const DEFAULT_BUBBLE_ICON = ''\n\nexport const NUMBER_PRODUCTS_SLIDER = 8\nexport const NUMBER_FEATURES_PDP = 8\n\nexport const ALIGNMENT = ['center', 'left', 'right']\nexport const POSITION = ['top', 'right', 'bottom', 'left']\nexport const TRANSLATION_ADD_TO_CART = 'Add to cart'\nexport const TRANSLATION_UPDATE_BASKET = 'Update basket'\n\nexport const TIME_INSTANT = 1\nexport const TIME_FAST = 300\nexport const TIME_MEDIUM = 600\nexport const TIME_SLOW = 1200\n\nexport const APP_APPLE_LINK = {\n default: 'https://apps.apple.com/us/app/nespresso/id342879434',\n us: 'https://apps.apple.com/us/app/nespresso-new/id1609639566',\n uk: 'https://apps.apple.com/gb/app/nespresso-new/id1609639566',\n kr: 'https://apps.apple.com/kr/app/%EB%84%A4%EC%8A%A4%ED%94%84%EB%A0%88%EC%86%8C-%EB%B6%80%ED%8B%B0%ED%81%AC/id1609639566'\n}\nexport const APP_ANDROID_LINK =\n 'https://play.google.com/store/apps/details?id=com.nespresso.activities'\nexport const APP_HUAWEI_LINK = 'https://appgallery.huawei.com/app/C102571517'\n\nexport const SRC_PAGE_PLP = 'plp'\nexport const SRC_PAGE_PDP = 'pdp'\n\nexport const PLP_TYPE_COFFEE = 'coffee'\nexport const PLP_TYPE_MACHINE = 'machine'\nexport const PLP_TYPE_ACCESSORY = 'accessory'\nexport const CALLEO_API_DOMAIN = 'https://www.contact.nespresso.com/'\n\n// SCSS RELATED\n// Todo : should be shared by JS and SCSS\nexport const BROWSER_CONTEXT = 16 // 1rem = 16px\nexport const COLOR_WHITE_1000 = '#FFFFFF' // Do not change for #FFF shortcut, it will break slider-natural gradients !\n\nexport const CONTRAST_DARK = 'dark'\nexport const CONTRAST_LIGHT = 'light'\n\nexport const B2B_CONTACT_FORM_POPIN_ID = 'b2b-contact-form-popin-id'\nexport const B2B_CONTACT_FORM_POPIN_SRC_SEARCH = 'coveo-search'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO = 'sku-main-info'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO_AUTO = 'sku-main-info-auto'\n\nexport const ASPECT_RATIO_16_9 = '16/9'\nexport const ASPECT_RATIO_1_1 = '1/1'\n\nexport const NESPRESSO_PRODUCTION_DOMAIN = 'https://www.nespresso.com'\nexport const NESPRESSO_ROLLOUT_DOMAIN = 'https://nc2-env-rollout.nespresso.com'\n\nexport const EVENT_QUIZ_ON_GO_BACK = 'WEB_COMPONENT_EVENT_QUIZ_ON_GO_BACK'\nexport const EVENT_QUIZ_SUBMIT = 'WEB_COMPONENT_EVENT_QUIZ_SUBMIT'\n","export class NespressoElement extends HTMLElement {\n constructor() {\n super()\n this.template = ''\n }\n\n connectedCallback() {\n this.props = this._createProps()\n this.onStart?.()\n this.loadTemplate()\n this.onReady?.()\n }\n\n /**\n * Load the attributes and create the props object\n * @returns {any}\n * @private\n */\n _createProps(forceAttributes = null) {\n const attributes = forceAttributes || this.attributes\n\n const getData = attr => attr.find(attribute => attribute.nodeName === 'data')\n\n let props\n try {\n props = [...attributes].reduce((all, attr) => {\n return { ...all, [attr.nodeName]: attr.nodeValue }\n }, {})\n\n const data = getData([...attributes])\n\n if (data === undefined || data === null) {\n return props\n }\n\n return { ...props, ...JSON.parse(data.nodeValue) }\n } catch (error) {\n console.log(this.nodeName, 'ERROR: No data', error)\n }\n }\n\n /**\n * Render by DOM diff\n */\n render(force = false) {\n if (force) {\n // todo review the performance of this\n this.innerHTML = ''\n }\n /**\n * Convert a template string into HTML DOM nodes\n * @param {String} str The template string\n * @return {Node} The template HTML\n */\n const _stringToHTML = str => {\n const parser = new DOMParser()\n const doc = parser.parseFromString(str, 'text/html')\n return doc.body\n }\n\n /**\n * Compare the template to the UI and make updates\n * @param {Node} template The template HTML\n * @param {Node} elem The UI HTML\n */\n const _diff = (template, elem) => {\n /**\n * Get the type for a node\n * @param {Node} node The node\n * @return {String} The type\n */\n const _getNodeType = node => {\n if (node.nodeType === 3) {\n return 'text'\n }\n if (node.nodeType === 8) {\n return 'comment'\n }\n return node.tagName.toLowerCase()\n }\n\n /**\n * Get the content from a node\n * @param {Node} node The node\n * @return {String} The type\n */\n const _getNodeContent = node => {\n if (node.childNodes && node.childNodes.length > 0) {\n return null\n }\n return node.textContent\n }\n\n // Get arrays of child nodes\n const domNodes = Array.prototype.slice.call(elem.childNodes)\n const templateNodes = Array.prototype.slice.call(template.childNodes)\n\n // If extra elements in DOM, remove them\n var count = domNodes.length - templateNodes.length\n if (count > 0) {\n for (; count > 0; count--) {\n domNodes[domNodes.length - count].parentNode.removeChild(\n domNodes[domNodes.length - count]\n )\n }\n }\n\n // Diff each item in the templateNodes\n templateNodes.forEach(function (node, index) {\n // If element doesn't exist, create it\n if (!domNodes[index]) {\n elem.appendChild(node.cloneNode(true))\n return\n }\n\n // If element is not the same type, replace it with new element\n if (_getNodeType(node) !== _getNodeType(domNodes[index])) {\n domNodes[index].parentNode.replaceChild(node.cloneNode(true), domNodes[index])\n return\n }\n\n // If content is different, update it\n const templateContent = _getNodeContent(node)\n if (templateContent && templateContent !== _getNodeContent(domNodes[index])) {\n domNodes[index].textContent = templateContent\n }\n\n // If target element should be empty, wipe it\n if (domNodes[index].childNodes.length > 0 && node.childNodes.length < 1) {\n domNodes[index].innerHTML = ''\n return\n }\n\n // If element is empty and shouldn't be, build it up\n // This uses a document fragment to minimize reflows\n if (domNodes[index].childNodes.length < 1 && node.childNodes.length > 0) {\n const fragment = document.createDocumentFragment()\n _diff(node, fragment)\n domNodes[index].appendChild(fragment)\n return\n }\n\n // If there are existing child elements that need to be modified, diff them\n if (node.childNodes.length > 0) {\n _diff(node, domNodes[index])\n }\n })\n }\n\n // todo - add support to reactivity\n // this.template(this.state)\n const templateHTML = _stringToHTML(this.template)\n _diff(templateHTML, this)\n }\n\n /**\n * Set the HTML to be used in the template\n * @param {String} html The HTML to use\n *\n * This function is overwritten by the extended class to set the HTML\n *\n */\n loadTemplate(template = '', force = false) {\n this.template = template === '' ? this.template : `${template}`\n this.render(force)\n }\n\n disconnectedCallback() {\n this.onDestroy?.()\n }\n}\n\ncustomElements.get('nb-nespresso-element') ||\n customElements.define('nb-nespresso-element', NespressoElement)\n","import { BREAKPOINT_M, BREAKPOINT_TABLET } from '@kissui/components'\n\nconst viewport = () => {\n const lt = (ref: number) => {\n return window.innerWidth < ref\n }\n\n return {\n get is() {\n const { innerWidth: vw, devicePixelRatio } = window\n return {\n mobile: vw < BREAKPOINT_M,\n mobile_tablet: vw < BREAKPOINT_TABLET,\n tablet: vw >= BREAKPOINT_M && vw < BREAKPOINT_TABLET,\n desktop: vw >= BREAKPOINT_TABLET && devicePixelRatio <= 1,\n retina: vw >= BREAKPOINT_TABLET && devicePixelRatio > 1\n }\n },\n lt\n }\n}\n\nconst helper = viewport()\n\nexport default helper\n","export { waitForSelector } from './waitForSelector'\n\nexport const constants = {\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n ESC: 27,\n SPACE: 32,\n ENTER: 13,\n TAB: 9\n}\n\nexport function capitalize(s = '') {\n return s[0].toUpperCase() + s.slice(1)\n}\n\nexport const convertToCamelCase = (str: string): string => {\n const arr = str.match(/[a-z]+|\\d+/gi)\n if (!arr) { return str }\n return arr.map((m, i) => {\n let low = m.toLowerCase()\n if (i !== 0) {\n low = low.split('').map((s, k) => (k === 0 ? s.toUpperCase() : s)).join(\"\")\n }\n return low\n }).join(\"\")\n}\n\nexport function slug(s = '') {\n return s\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, '-') // Replace spaces with -\n .replace(/[^\\w-]+/g, '') // Remove all non-word chars\n .replace(/--+/g, '-') // Replace multiple - with single -\n}\n\nexport function pxToEm(target: number, stripedInnerFontSize = 1) {\n return target / 14 / stripedInnerFontSize + 'em'\n}\n\nexport function percent(target: number) {\n return target + '%'\n}\n\nexport function parseHTML(str: string) {\n const tmp = document.implementation.createHTMLDocument('')\n tmp.body.innerHTML = str\n return tmp.body.childNodes\n}\n\nexport function stripHTML(str: string) {\n const tmp = document.implementation.createHTMLDocument('')\n tmp.body.innerHTML = str\n return (tmp.body.textContent ?? \"\").replace(RegExp('[\\\\s|\\'|\"]', 'g'), '')\n}\n\nexport function makeId(length: number) {\n var result = ''\n var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n var charactersLength = characters.length\n for (var i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength))\n }\n return result\n}\n\nexport function removeEmptyValues(obj: { [key: string]: any }): { [key: string]: any } {\n const findText = [\n 'Default campaign ID (tracking missing in Page Builder export)',\n 'Default campaign name (tracking missing in Page Builder export)',\n 'promoname', \n 'promoid', \n 'promocreative', \n 'undefined'\n ];\n \n for (let key in obj) {\n const value = obj[key];\n \n if (value === null || value === undefined || value === '') {\n delete obj[key];\n continue;\n }\n \n if (typeof value === 'string') {\n for (const text of findText) {\n if (value.includes(text)) {\n delete obj[key];\n break;\n }\n }\n }\n }\n \n return obj;\n}\n\nexport function makeHash(str: string) {\n var hash = 0,\n i,\n chr\n if (!str) {\n return hash\n }\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i)\n hash = (hash << 5) - hash + chr\n hash |= 0 // Convert to 32bit integer\n }\n return 'id-' + hash\n}\n\nexport function getHashLink(link: string) {\n let linkHash = link\n let linkNoHash = link\n if (link.indexOf('#') !== -1) {\n linkNoHash = link.replace('#', '')\n } else {\n linkHash = '#' + link\n }\n\n return { linkNoHash, linkHash }\n}\n\nexport function lazyLoad(node: Element, attribute: string, value: any, url: string) {\n const CLASSNAME_OUT_OF_SCREEN = 'lazy-load'\n const CLASSNAME_IN_SCREEN = 'lazy-loaded'\n const CLASSNAME_ON_ERROR = 'lazy-loaded-error'\n\n const isOldIOS = () => {\n var agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n }\n return false\n }\n\n const inViewPort = (attribute: string, value: any) => {\n node.setAttribute(attribute, value)\n\n const cb = () => node.classList.add(CLASSNAME_IN_SCREEN)\n\n if (url) {\n const img = new Image()\n img.src = url\n img.onload = cb\n img.onerror = () => {\n cb()\n node.classList.add(CLASSNAME_ON_ERROR)\n throw new Error(`Image ${url} cannot be loaded`)\n }\n\n return\n }\n\n cb()\n }\n\n if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n inViewPort(attribute, value)\n } else {\n if ('IntersectionObserver' in window) {\n node.classList.add(CLASSNAME_OUT_OF_SCREEN)\n let lazyBackgroundObserver = new IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n inViewPort(attribute, value)\n lazyBackgroundObserver.unobserve(entry.target)\n }\n })\n })\n lazyBackgroundObserver.observe(node)\n } else {\n inViewPort(attribute, value)\n }\n }\n}\n\nexport function lazyLoadCallback(node: Element, cb: () => void) {\n const isOldIOS = () => {\n var agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n }\n return false\n }\n\n if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n cb()\n } else {\n if ('IntersectionObserver' in window) {\n let lazyBackgroundObserver = new IntersectionObserver(\n function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n cb()\n lazyBackgroundObserver.unobserve(entry.target)\n }\n })\n },\n { rootMargin: '150% 0px' }\n )\n lazyBackgroundObserver.observe(node)\n }\n }\n}\n\n// Debounce\nexport function debounce<T>(func: (v: T) => void, time = 100) {\n let timer: number\n return function (event: T) {\n if (timer) {\n window.clearTimeout(timer)\n }\n timer = window.setTimeout(func, time, event)\n }\n}\n\n// isIE - to check for internet explorer\nexport function isIE() {\n let ua = window.navigator.userAgent,\n isIE = /MSIE|Trident/.test(ua)\n\n return isIE\n}\n\n// Load external script\nexport const loadExternalScript = ({\n src,\n callback = null,\n async = false,\n defer = false,\n module = false,\n id = ''\n}: {\n src: string;\n callback: null | GlobalEventHandlers[\"onload\"]\n module: boolean,\n defer: boolean,\n async: boolean,\n id: string\n}) => {\n const script = document.createElement('script')\n script.type = module ? 'module' : 'text/javascript'\n script.src = src\n id ? (script.id = id) : false // add id attribute only if passed\n if (typeof callback === 'function') {\n script.onload = callback\n }\n script.async = async\n script.defer = defer\n document.body.appendChild(script)\n}\n\n// Load external css\nexport const loadExternalCss = ({ src }: { src: string }) => {\n const script = document.createElement('link')\n script.rel = 'stylesheet'\n script.href = src\n document.body.appendChild(script)\n}\n// Lazy load vendor script\nexport const lazyLoadVendorScript = (handler, el) => {\n const observer = new IntersectionObserver(handler)\n observer.observe(el)\n}\n\n/**\n * Replaces variable inside a given string\n * Each variable have to be enclosed between stChr and enChr\n * The values have to be contained in the vars object, they key must match\n * example :\n * txt : 'See {resultsLength} Results'\n * vars : {resultsLength:'30'}\n * stChr : '{'\n * enChr : '}'\n *\n * will return : 'See 30 Results'\n *\n * @param {string} txt\n * @param {object} vars\n * @param {string} stChr\n * @param {string} enChr\n */\nexport function interpolate(txt: string, vars: Record<string, null | undefined | string>, stChr: string, enChr: string) {\n let curIdx = 0\n\n while (txt) {\n const stIdx = txt.indexOf(stChr, curIdx)\n if (stIdx === -1) {\n break\n }\n const enIdx = txt.indexOf(enChr, stIdx + 1)\n if (enIdx === -1) {\n break\n }\n const hashId = txt.substring(stIdx + stChr.length, enIdx)\n if (vars[hashId] != null) {\n txt = txt.substr(0, stIdx) + vars[hashId] + txt.substr(enIdx + enChr.length)\n curIdx = stIdx\n } else {\n curIdx = enIdx\n }\n }\n return txt\n}\n\n/**\n * Find in container element, add height to equal size of element\n * @param container css path where my element is contain e.g. `.c-container`\n * @param el css path of elements to equalized\n */\nexport const equalHeight = (containerSelector: string, el: string, elementScope: HTMLElement) => {\n const container = elementScope.querySelector<HTMLElement>(containerSelector)\n if (!container) {\n return\n }\n\n const items = container.querySelectorAll<HTMLElement>(el)\n let max = -1\n\n for (let i = 0; i < [...items].length; i++) {\n const item = [...items][i]\n let h = item.offsetHeight\n max = h > max ? h : max\n }\n\n if (max <= 0) {\n return\n }\n\n for (let i = 0; i < [...items].length; i++) {\n const item = [...items][i]\n item.style.height = `${max}px`\n }\n}\n\nexport const stringifyCurlyQuote = (data: {}) => JSON.stringify(data).replace(\"'\", '’')\n\nexport const stringifyForAttribute = (data = {}) => {\n return escapeHtml(JSON.stringify(data))\n}\n\n/**\n * This function is included instead of sanitizeString because for\n * inserting HTML into innerHTML we need to make sure all HTML\n * entities are escaped.\n */\nexport const escapeHtml = (text: string) => {\n const map = {\n '&': '&',\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 { COFFEE_VERTUO } from '@kissui/components/src/constants.mjs'\nimport { getCurrency } from './getCurrency'\nexport { getCurrency } from './getCurrency'\n\nexport const ECAPI_TYPE_CAPSULE = 'capsule'\nexport const ECAPI_TYPE_MACHINE = 'machine'\nexport const ECAPI_TYPE_ACCESSORY = 'accessory'\nexport const ECAPI_TYPE_GIFT_CARD = 'giftcard'\n\nconst TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\nconst SLEEVE_OF_10 = 10\nconst SLEEVE_OF_7 = 7\n\nconst trimSku = sku => sku.replace(/[^a-z0-9- +./]/gi, '')\n\nexport const getLegacySKU = productId => productId.split('prod/').pop()\n\nexport const getPriceFormatter = async () => await window.napi.priceFormat()\n\nexport const getProduct = sku => window.napi.catalog().getProduct(trimSku(sku))\n\nexport function getTechnologyName(productData) {\n const techno = productData.technologies[0]\n return techno.substring(\n techno.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) + TECHNOLOGY_CATEGORY_IDENTIFIER.length\n )\n}\n\nfunction isMultipleOf(quantity, multiple) {\n return quantity % multiple === 0\n}\n\nexport function getSleeveNumber(product, getTechnologyNameFn = getTechnologyName) {\n if (product.sales_multiple !== 1 && isMultipleOf(product.sales_multiple, SLEEVE_OF_10)) {\n // Sleeve of original or vertuo\n return product.sales_multiple / SLEEVE_OF_10\n }\n\n if (\n product.sales_multiple !== 1 &&\n getTechnologyNameFn(product) === COFFEE_VERTUO &&\n isMultipleOf(product.sales_multiple, SLEEVE_OF_7)\n ) {\n // Sleeve of vertuo\n return product.sales_multiple / SLEEVE_OF_7\n }\n\n if (product.sales_multiple === 1 && isMultipleOf(product.unitQuantity, SLEEVE_OF_10)) {\n // Bundle of original or vertuo\n return product.unitQuantity / SLEEVE_OF_10\n }\n\n if (\n product.sales_multiple === 1 &&\n getTechnologyNameFn(product) === COFFEE_VERTUO &&\n isMultipleOf(product.unitQuantity, SLEEVE_OF_7)\n ) {\n // Bundle of vertuo\n return product.unitQuantity / SLEEVE_OF_7\n }\n\n return NaN\n}\n\n/**\n * Guess if the product is part of a bundle.\n * This is determined by checking the 'sales_multiple' and 'unitQuantity' properties.\n */\nexport function isBundled(productData) {\n // TODO: this function should not change the productData, but some components still need it\n productData.sales_multiple = productData.sales_multiple || productData.salesMultiple\n\n const isSalesMultipleGreaterThanOne = productData.sales_multiple > 1\n const isUnitQuantityEqualToOne = productData.unitQuantity === 1\n const isSalesMultipleEqualToOne = productData.sales_multiple === 1\n const isUnitQuantityGreaterThanOne = productData.unitQuantity > 1\n\n // The product is not bundled if sales_multiple > 1 and unitQuantity = 1\n if (isSalesMultipleGreaterThanOne && isUnitQuantityEqualToOne) {\n return false\n }\n\n // The product is bundled if sales_multiple = 1 and unitQuantity > 1\n return isSalesMultipleEqualToOne && isUnitQuantityGreaterThanOne\n}\n\n/**\n * Replace an array of SKU with product data\n * Remove the element inside the list if sku fail. It prevents to get an empty item.\n * @param {Array.<String>} skus\n * @param getProductFn\n * @returns {Promise<Awaited<unknown>[]>}\n */\nexport function getProductAndClean(skus, getProductFn = getProduct, napi = window.napi) {\n const promises = []\n\n if (!napi) {\n return Promise.reject()\n }\n\n if (!Array.isArray(skus)) {\n skus = [skus]\n }\n\n // Load manually the product to delete SKU fail\n for (const sku of skus) {\n promises.push(\n getProductFn(sku)\n .then(data => skus.splice(skus.indexOf(sku), 1, data))\n .catch(() => {\n skus.splice(skus.indexOf(sku), 1)\n console.error(`getProduct fail on sku ${sku}`)\n })\n )\n }\n\n return Promise.all(promises)\n}\n\nexport const getFormattedPrice = async price => {\n const priceFormatter = await getPriceFormatter()\n const currency = getCurrency()\n\n return priceFormatter.html\n ? priceFormatter.html(currency, price)\n : priceFormatter.short(currency, price) || ''\n}\n\nexport const getProductCategories = async sku => {\n const productDetails = await getProduct(sku)\n const productCategories = productDetails ? productDetails.supercategories : []\n const productCategoriesNew = await Promise.all(\n productCategories.map(async categoryEncoded => {\n const productCategoryData = await window.napi.catalog().getCategory(categoryEncoded)\n return productCategoryData\n })\n )\n return productCategoriesNew\n}\n","export const getCurrency = () => window[window.config.padl.namespace].dataLayer.app.app.currency\n","import { getFormattedPrice } from '@kissui/helpers/src/catalog'\n\nconst getStrikethroughPriceElement = component => {\n return component.querySelector('.cb-price-old')\n}\n\nconst fetchStrikethroughPrice = strikethroughPrice => {\n return getFormattedPrice(strikethroughPrice)\n}\n\nexport const renderStrikethroughPrice = ({ strikethrough_price }, component) => {\n if (!strikethrough_price) {\n return ''\n }\n\n fetchStrikethroughPrice(strikethrough_price)\n .then(payload => {\n const element = getStrikethroughPriceElement(component)\n if (!element) {\n return\n }\n\n element.innerHTML = payload\n })\n .catch(e => {\n console.error(`Error: Component SKU - Strike Through Price - ${e}`)\n\n const element = getStrikethroughPriceElement(component)\n if (!element) {\n return\n }\n\n element.style.display = 'none'\n })\n\n return `<p class=\"cb-price-old t-sm-400-sl\"></p>`\n}\n","export const getDataLayer = () => {\n return window[window?.padlNamespace]?.dataLayer\n}\n\nexport const getMarketCode = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer) {\n return 'ch'\n }\n\n return dataLayer.app.app.market.toLocaleLowerCase()\n}\n\nexport const getLangCode = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer) {\n return 'en'\n }\n\n return getDataLayer().page.page.pageInfo.language.toLocaleLowerCase()\n}\n\nexport const getSegmentCode = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer) {\n return 'B2C'\n }\n\n return getDataLayer().page.page.pageInfo.segmentBusiness\n}\n\nexport const isLoggedIn = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer || !dataLayer.user) {\n return false\n }\n\n return dataLayer.user.isLoggedIn\n}\n\nexport const interpolateMarketLang = (string, market, lang) => {\n return string.replace('{market}', market).replace('{lang}', lang)\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport {\n VARIATION_PLP,\n VARIATION_SMALL,\n VARIATION_CROSS_SELL,\n VARIATION_PDP\n} from '@kissui/components/src/sku/constants'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\n\nconst getButtonSize = variation => {\n switch (variation) {\n case VARIATION_PLP:\n return viewportHelper.is.mobile ? 'small' : 'large'\n case VARIATION_SMALL:\n return 'small'\n default:\n return 'large'\n }\n}\n\nfunction getComputedProps(activeSku, activeLongSku, sku, longSku, disableTracking) {\n const skuProp = activeSku || sku\n const activeLongSkuProp = activeLongSku || longSku\n const disableTrackingProp = disableTracking && `disableTracking=true`\n\n return { skuProp, activeLongSkuProp, disableTrackingProp }\n}\n\nexport const renderAddToCart = props => {\n const {\n activeLongSku,\n activeSku,\n category_name = '',\n contact_cta = {},\n hidePrice,\n longSku = '',\n position,\n rendererName = '',\n show_view_details = false,\n sku,\n url,\n variation = VARIATION_PLP,\n view_details_label = 'View details',\n technologies = [],\n disableTracking = false\n } = props\n\n const buttonSize = getButtonSize(variation)\n let cta_url = url,\n cta_label = view_details_label,\n contact_cta_text = contact_cta.contact_cta_text || '',\n contact_url_anchor = contact_cta.contact_url_anchor || '',\n is_b2b = checkForB2B(technologies)\n\n // CONTACT US BUTTON\n const { skuProp, activeLongSkuProp, disableTrackingProp } = getComputedProps(\n activeSku,\n activeLongSku,\n sku,\n longSku,\n disableTracking\n )\n\n function b2bNotLoggedIn(contact_url_anchor, cta_url, cta_label) {\n //CONTACT US BUTTON[ hidePrice = true]\n const linkAttribute = contact_url_anchor ? `link=\"${cta_url}\"` : ''\n\n return `<nb-cta ${linkAttribute} variation=\"primary\" data-disabletracking=\"true\">${cta_label}</nb-cta>`\n }\n\n function b2bLoggedIn({\n skuProp,\n activeLongSkuProp,\n buttonSize,\n category_name,\n position,\n rendererName,\n variation,\n disableTrackingProp\n }) {\n return `\n <nb-add-to-cart\n sku=\"${skuProp}\"\n longSku=\"${activeLongSkuProp}\"\n buttonSize=\"${buttonSize}\"\n showPrice\n range='${category_name}'\n position='${position}'\n rendererName='${rendererName}'\n tracking_no_impression=\"${variation === VARIATION_PDP}\"\n ${disableTrackingProp}\n >\n </nb-add-to-cart>\n `\n }\n\n function remainingCases(cta_url, cta_label) {\n //VIEW DETAILS BUTTON [ hidePrice = false]\n return `<nb-cta link=\"${cta_url}\" variation=\"primary\">${cta_label}</nb-cta>`\n }\n\n if (hidePrice || show_view_details) {\n if (\n is_b2b &&\n (variation === VARIATION_PDP || variation === VARIATION_CROSS_SELL) &&\n !isLoggedIn()\n ) {\n cta_url = contact_url_anchor\n cta_label = contact_cta_text\n\n return b2bNotLoggedIn(contact_url_anchor, cta_url, cta_label)\n } else if (is_b2b && variation === VARIATION_PDP && isLoggedIn()) {\n return b2bLoggedIn({\n skuProp,\n activeLongSkuProp,\n buttonSize,\n category_name,\n position,\n rendererName,\n variation,\n disableTrackingProp\n })\n }\n\n return remainingCases(cta_url, cta_label)\n }\n\n // ADD TO CART BUTTON\n return `\n <nb-add-to-cart\n sku=\"${skuProp}\"\n longSku=\"${activeLongSkuProp}\"\n buttonSize=\"${buttonSize}\"\n showPrice\n range='${category_name}'\n position='${position}'\n rendererName='${rendererName}'\n tracking_no_impression=\"${variation === VARIATION_PDP}\"\n ${disableTrackingProp}\n ></nb-add-to-cart>\n `\n}\n\nfunction checkForB2B(technologies) {\n return Array.isArray(technologies) && technologies.some(tech => tech.includes('pro'))\n}\n","export const renderAdditionalMessage = ({\n additional_message_icon,\n additional_message,\n additional_message_link\n}) => {\n if (!additional_message && !additional_message_link) {\n return ''\n }\n\n let additionalMessageFinal = ''\n\n if (additional_message) {\n let renderIcon = ''\n if (additional_message_icon) {\n renderIcon = `<nb-icon icon=\"${additional_message_icon}\" class=\"additionalMsgIcon\"></nb-icon>`\n }\n\n additionalMessageFinal = `<p class=\"cb-warn t-sm-500-sl\">\n ${renderIcon}\n ${additional_message}</p>`\n }\n\n const hasAdditionalMessageLink =\n additional_message_link && additional_message_link.link && additional_message_link.label\n\n if (!hasAdditionalMessageLink) {\n return additionalMessageFinal\n }\n\n return (\n additionalMessageFinal +\n `<nb-link\n link='${additional_message_link.link}'\n color=\"${additional_message_link.color}\"\n size=\"${additional_message_link.size}\"\n seo_label=\"${additional_message_link.seo_label}\">\n ${additional_message_link.label}\n </nb-link>`\n )\n}\n","import { getMarketCode } from './dataLayer'\n\nconst LABEL_CATEGORY_NAME = 'cat/capsule-range-label'\nconst LABEL_CATEGORY_NAME_MACHINE = 'cat/machine-range-label'\nexport const RANGE_CATEGORY_NAME = 'cat/capsule-range'\nconst FAIR_TRADE_CATEGORY_NAME = 'cat/capsule-range-fair-trade'\nconst VERTUO_NEXT_CATEGORY_NAME = 'cat/capsule-attribute-only-vertuo-next'\nconst ORGANIC_EU_CATEGORY_NAME = 'capsule-attribute-organic-eu'\nconst RAINFOREST_CATEGORY_NAME = 'capsule-attribute-rainforest'\nconst SUSTAINABILITY_CATEGORY_NAME = 'capsule-attribute-sustainability'\nconst ARABICA_CATEGORY_NAME = 'capsule-attribute-arabica'\nconst PRODUCT_HIGHLIGHT_CATEGORY_NAME = 'cat/capsule-attribute-highlight'\nconst TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\n\nconst COMMON_URL = 'https://www.nespresso.com/shared_res/agility/commons/img/icons/'\n\nexport const FAIR_TRADE_IMG = COMMON_URL + 'fairTrade.svg'\nexport const ORGANIC_LOGO_IMG_EU = COMMON_URL + 'logo-organic-eu.svg'\nexport const ORGANIC_LOGO_IMG_US = COMMON_URL + 'logo-organic-us.svg'\nexport const ORGANIC_LOGO_IMG_CA = COMMON_URL + 'logo-organic-ca.svg'\nexport const ORGANIC_LOGO_IMG_BR = COMMON_URL + 'logo-organic-br.svg'\nexport const ORGANIC_LOGO_IMG_JP = COMMON_URL + 'logo-organic-jp.svg'\nexport const ORGANIC_LOGO_IMG_BE = COMMON_URL + 'logo-organic-be.png'\n\nexport const VERTUONEXT_LOGO_IMG = COMMON_URL + 'logo-only-vertuo-next.svg'\nexport const RAINFOREST_LOGO_IMG = COMMON_URL + 'logo-rainforest.svg'\nexport const SUSTAINABILITY_LOGO_IMG = COMMON_URL + 'logo-sustainability.svg'\nexport const Q_CERTIFICATION_ARABICA_LOGO_IMG = COMMON_URL + 'q_grade_certification_arabica.svg'\nexport const DESIGN_AWARD_2021_IMG = COMMON_URL + 'design_award_2021.svg'\n\nexport const LOGO_IMG_MAP = {\n fair_trade: FAIR_TRADE_IMG,\n is_organic: getOrganicLogo(),\n only_vertuo_next: VERTUONEXT_LOGO_IMG,\n is_q_certified_arabica: Q_CERTIFICATION_ARABICA_LOGO_IMG,\n is_rainforest: RAINFOREST_LOGO_IMG,\n is_sustainable: SUSTAINABILITY_LOGO_IMG,\n is_design_award_2021: DESIGN_AWARD_2021_IMG\n}\n\nexport function getOrganicLogo() {\n let organicLogoImg = ORGANIC_LOGO_IMG_EU\n\n switch (getMarketCode()) {\n case 'us':\n organicLogoImg = ORGANIC_LOGO_IMG_US\n break\n case 'ca':\n organicLogoImg = ORGANIC_LOGO_IMG_CA\n break\n case 'br':\n organicLogoImg = ORGANIC_LOGO_IMG_BR\n break\n case 'jp':\n organicLogoImg = ORGANIC_LOGO_IMG_JP\n break\n case 'be':\n organicLogoImg = ORGANIC_LOGO_IMG_BE\n break\n }\n\n return organicLogoImg\n}\n\n/**\n * retrieves the list of categories of type Vertuo Next\n * @param {category[]} categories\n */\nexport function getVertuoNext(categories) {\n return categories.find(category => isVertuoNext(category))\n}\n\n/**\n * returns true when the category is product vertuo next\n * @param {category} category\n */\nfunction isVertuoNext(category) {\n return getCategoryRegEx(VERTUO_NEXT_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type organic EU\n * @param {category[]} categories\n */\nexport function getOrganicEu(categories) {\n return categories.find(category => isOrganicEu(category))\n}\n\n/**\n * returns true when the category is product organic EU\n * @param {category} category\n */\nfunction isOrganicEu(category) {\n return getCategoryRegEx(ORGANIC_EU_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type rainforest\n * @param {category[]} categories\n */\nexport function getRainforest(categories) {\n return categories.find(category => isRainforest(category))\n}\n\n/**\n * returns true when the category is rainforest\n * @param {category} category\n */\nfunction isRainforest(category) {\n return getCategoryRegEx(RAINFOREST_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type sustainability\n * @param {category[]} categories\n */\nexport function getSustainability(categories) {\n return categories.find(category => isSustainability(category))\n}\n\n/**\n * retrieves the list of categories of type arabica\n * @param {category[]} categories\n */\nexport function getArabica(categories) {\n return categories.find(category => isArabica(category))\n}\n\n/**\n * returns true when the category is arabica\n * @param {category} category\n */\nfunction isArabica(category) {\n return getCategoryRegEx(ARABICA_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * returns true when the category is sustainability\n * @param {category} category\n */\nfunction isSustainability(category) {\n return getCategoryRegEx(SUSTAINABILITY_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type label\n * @param {category[]} categories\n */\nexport function getLabels(categories) {\n return categories.filter(category => isLabel(category))\n}\n\n/**\n * retrieves the list of categories of type label\n * @param {category[]} categories\n */\nexport function getProductHighlight(categories) {\n return categories.find(category => isProductHighlight(category))\n}\n/**\n * retrieves the list of categories of type label\n * @param {category[]} categories\n */\nexport function getFairTrade(categories) {\n return categories.find(category => isFairTrade(category))\n}\n\n/**\n * returns a regex to match the tail (global) of a given local category ID\n * @param {string} categoryIdTail : should contain the end of the category ID\n */\nexport function getCategoryRegEx(categoryIdTail) {\n return new RegExp(categoryIdTail.replace(/\\//g, '\\\\/'))\n}\n\n/**\n * returns true when the category is child of the label category (is type label)\n * @param {category} category\n */\nfunction isLabel(category) {\n return (\n getCategoryRegEx(LABEL_CATEGORY_NAME).test(category.id) ||\n getCategoryRegEx(LABEL_CATEGORY_NAME_MACHINE).test(category.id)\n )\n}\n\n/**\n * returns true when the category is product highlight\n * @param {category} category\n */\nfunction isProductHighlight(category) {\n return getCategoryRegEx(PRODUCT_HIGHLIGHT_CATEGORY_NAME).test(category.id)\n}\n/**\n * returns true when the category is fair trade\n * @param {category} category\n */\nfunction isFairTrade(category) {\n return getCategoryRegEx(FAIR_TRADE_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * returns true when the category is child of the range category (is type range)\n * @param {category} category\n */\nexport function isRange(category) {\n return category.superCategories.some(superCategory =>\n getCategoryRegEx(RANGE_CATEGORY_NAME).test(superCategory)\n )\n}\n\nexport function getTechnologyName(productData, categories) {\n if (!productData || !productData.technologies || !productData.technologies.length) {\n return null\n }\n\n const techno = productData.technologies[0]\n const categoryNameAsSubstring = techno.substring(\n techno.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) + TECHNOLOGY_CATEGORY_IDENTIFIER.length\n )\n const category = categories?.find(cat => cat.id === techno)\n\n // Backward compatibility, return name as substring if the list of categories are not available\n return category?.name || categoryNameAsSubstring\n}\n\nexport function isCategoryHidden(categoryId) {\n let hideCategory = false\n // To enable AB testing: exclude categories which are to be hidden\n if (\n window.PLP_HIDE_CATEGORIES?.length &&\n window.PLP_HIDE_CATEGORIES.findIndex(c => categoryId.indexOf(c) >= 0) >= 0\n ) {\n hideCategory = true\n }\n\n // To enable AB testing: exclude categories except those which are to be shown\n if (window.PLP_ONLY_SHOW_CATEGORIES?.length) {\n // Default to hide\n hideCategory = true\n if (window.PLP_ONLY_SHOW_CATEGORIES.findIndex(c => categoryId.indexOf(c) >= 0) >= 0) {\n hideCategory = false\n }\n }\n return hideCategory\n}\n","import { INTENSITY_MAX_OL, INTENSITY_MAX_VL } from '@kissui/components'\n\nexport const getMaxIntensity = ({ technologies }) =>\n technologies.indexOf('original') !== -1 ? INTENSITY_MAX_OL : INTENSITY_MAX_VL\n","import { getFinalPrice } from '@kissui/plp/services'\nimport { isBundled } from '@kissui/helpers/src/catalog'\nimport { getMaxIntensity } from '@kissui/components/src/sku-coffee/services'\n\nexport const getMergedProductCoffeeData = (\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n) => {\n const { bundle_details } = pageBuilderProductProps\n const { options } = pageBuilderProps\n const { show_sleeve_price } = options\n\n const isBundledResult = isBundled(product)\n\n const { showCapsulePrice, price_per_capsule, final_price } = getFinalPrice(\n show_sleeve_price,\n product,\n isBundled\n )\n\n const option = {\n bundled: isBundledResult,\n intensity: product.capsuleProperties?.intensity || product.intensity || null,\n max_intensity: getMaxIntensity(product),\n price_per_capsule: price_per_capsule\n ? priceFormatter.short(currency, price_per_capsule)\n : null,\n show_capsule_price: showCapsulePrice\n }\n\n if (show_sleeve_price) {\n option.price = priceFormatter.short(currency, final_price)\n }\n\n if (bundle_details) {\n option.bundle_details = bundle_details\n }\n\n return option\n}\n","import {\n getVertuoNext,\n getOrganicEu,\n getRainforest,\n getLabels,\n getProductHighlight,\n getFairTrade,\n getSustainability,\n isRange,\n getCategoryRegEx,\n RANGE_CATEGORY_NAME,\n getArabica\n} from '@kissui/helpers/src/cremaDataHelper'\n\n/**\n * Modifies the structure to make it easier to use in components\n * Applies all the data customization mixing Page builder with HMC data\n * @param {object} plpData : original PLP data\n */\nexport async function getMergedPLPData(plpData) {\n const { data } = plpData\n if (!data) {\n return []\n }\n\n const eCommerceData = data.configuration.eCommerceData\n\n addLabels(eCommerceData)\n\n addProductAttribute(\n eCommerceData,\n getFairTrade,\n (prod, category) => (prod.fairTrade = category.name)\n )\n addProductAttribute(eCommerceData, getProductHighlight, prod => (prod.highlighted = true))\n addProductAttribute(eCommerceData, getVertuoNext, prod => (prod.onlyVertuoNext = true))\n addProductAttribute(eCommerceData, getOrganicEu, prod => (prod.organicEu = true))\n addProductAttribute(eCommerceData, getRainforest, prod => (prod.rainforest = true))\n addProductAttribute(eCommerceData, getSustainability, prod => (prod.sustainability = true))\n addProductAttribute(eCommerceData, getArabica, prod => (prod.arabica = true))\n\n addSubSegments(eCommerceData)\n\n return eCommerceData.categories\n}\n\nfunction addSubSegments(eCommerceData) {\n const { categories, productGroups, products } = eCommerceData\n // should be forEach if nothing returned/assigned\n categories.forEach(category => {\n const hasSegment = category.subCategories.length > 0 && isRange(category)\n if (hasSegment) {\n category.segments = category.subCategories.map(categoryId => {\n const segment = categories.find(subCategory => subCategory.id === categoryId)\n if (segment && isSubsegment(categories, segment)) {\n segment.products = getProductsData(productGroups, segment.id, products)\n segment.isSegment = true\n }\n return segment\n })\n }\n\n category.products = getProductsData(productGroups, category.id, products)\n })\n}\n\nexport function getProductsData(productGroups, categoryId, products) {\n let result = []\n try {\n const currentCategory = productGroups.find(category => category.categoryId === categoryId)\n\n if (!currentCategory) {\n return result\n }\n\n const { productIds } = currentCategory\n return productIds.map(productId => {\n const product = products.find(product => product.id === productId)\n return product\n })\n } catch (e) {\n //generally an anti pattern to only log the error, with no try catch the result would be the same\n console.log(e)\n }\n\n return result\n}\n\n/**\n * adds labels property to products containing each label's category data (JSON parsed description property) assigned to it\n * labels are categories that have the label base category as parent\n * to apply a label on a given product, the label has to contain the product\n * this function has to clean the productGroups as well by removing the label ones\n * @param {category[]} categories\n * @param {productGroup[]} productGroups\n * @param {product[]} products\n */\nfunction addLabels(eCommerceData) {\n const { categories, productGroups, products } = eCommerceData\n const labels = getLabels(categories)\n const labelGroups = getLabelGroups(productGroups, labels)\n labelGroups.forEach(group => {\n const label = labels.find(label => label.id === group.categoryId)\n group.productIds.forEach(productId => {\n const prod = products.find(product => product.id === productId)\n prod.labels = prod.labels || []\n prod.labels.push(label.description)\n })\n })\n //removing label categories from productGroups\n labelGroups.forEach(labelGroup => {\n const indexToRemove = productGroups.findIndex(\n productGroup => productGroup.categoryId === labelGroup.categoryId\n )\n productGroups.splice(indexToRemove, 1)\n })\n}\n\n/**\n * adds a property to products containing the given category assigned to it\n * The category is recognized by ID\n * to apply a the category on a given product, the category's productGroup has to contain the product\n * this function has to clean the productGroups as well by removing the given's one to not let it display as a range in the PLP\n * @param {category[]} categories\n * @param {productGroup[]} productGroups\n * @param {product[]} products\n */\nfunction addProductAttribute(eCommerceData, categoryFetcher, assignHandler) {\n const { categories, productGroups, products } = eCommerceData\n const category = categoryFetcher(categories)\n if (!category) {\n return\n }\n const categoryGroup = getCategoryGroup(productGroups, category)\n if (!categoryGroup) {\n return\n }\n categoryGroup.productIds.forEach(productId => {\n const prod = products.find(product => product.id === productId)\n if (categoryFetcher === getArabica) {\n console.log('addProductAttribute', prod)\n }\n assignHandler(prod, category)\n })\n const indexToRemove = productGroups.findIndex(\n productGroup => productGroup.categoryId === categoryGroup.categoryId\n )\n productGroups.splice(indexToRemove, 1)\n}\n\n/**\n * retrieve all the productGroup that are labels\n * @param {productGroup[]} productGroups\n * @param {category[]} labels\n */\nfunction getLabelGroups(productGroups, labels) {\n return productGroups.filter(group => labels.some(label => label.id === group.categoryId))\n}\n\n/**\n * retrieve the productGroup which correspond to a category\n * @param {productGroup[]} productGroups\n * @param {category} fairTrade\n */\nfunction getCategoryGroup(productGroups, category) {\n return productGroups.find(group => category.id === group.categoryId)\n}\n\n/**\n * returns true when the category is child of the range category (is type range)\n * @param {category} category\n */\nexport function isSubsegment(categories, category) {\n /*category.superCategories.some(superCategoryId => {\n const superCategoryData = categories.find(categoryToFind => categoryToFind.id === superCategoryId)\n })*/\n const result = category.superCategories.some(superCategory =>\n getCategoryRegEx(RANGE_CATEGORY_NAME).test(superCategory)\n )\n return result\n}\nexport function getFinalPrice(show_sleeve_price, product, isBundled) {\n let showCapsulePrice = show_sleeve_price\n let final_price\n let price_per_capsule\n\n const bundled = isBundled(product)\n\n if (product.type === 'capsule' && !bundled) {\n final_price = product.price * product.salesMultiple\n // this isn't necessary in prod but the mock price formatter needs it\n final_price = Math.round(final_price * 100) / 100\n price_per_capsule = product.price\n } else {\n showCapsulePrice = false\n final_price = product.price\n }\n\n return { showCapsulePrice, final_price, price_per_capsule }\n}\n","import {\n ECAPI_TYPE_ACCESSORY,\n ECAPI_TYPE_CAPSULE,\n ECAPI_TYPE_GIFT_CARD,\n ECAPI_TYPE_MACHINE\n} from '@kissui/helpers/src/catalog'\n\nexport const getSkuComponentByType = ({ type, is_machine_b2b }) => {\n let result = 'nb-sku'\n\n if (type === ECAPI_TYPE_CAPSULE) {\n result = 'nb-sku-coffee'\n } else if (type === ECAPI_TYPE_MACHINE && is_machine_b2b) {\n result = 'nb-sku-machine-b2b'\n } else if (type === ECAPI_TYPE_MACHINE) {\n result = 'nb-sku-machine'\n } else if (type === ECAPI_TYPE_ACCESSORY) {\n result = 'nb-sku-accessory'\n } else if (type === ECAPI_TYPE_GIFT_CARD) {\n result = 'nb-sku-gift-card'\n }\n\n return result\n}\n\nexport const apiOverride = (productData, pageBuilderData) => {\n if (!productData || !pageBuilderData) {\n return {}\n }\n\n const { images, name, headline, description } = productData\n const { api_override } = pageBuilderData\n\n if (!api_override) {\n return {}\n }\n\n return {\n image: api_override.image || images?.icon || images?.url || images?.push || images?.main,\n name: api_override.name || name,\n headline: api_override.headline || headline,\n description: api_override.description || description\n }\n}\n","export const VARIATION_CROSS_SELL = 'cross-sell'\nexport const VARIATION_PLP = 'plp'\n\nexport interface CapsuleFeaturesInputType {\n acidity?: number | null\n bitterness?: number | null\n body?: number | null\n intensity?: number | null\n roastLevel?: number | null\n}\n\nexport interface CapsuleFeatureType {\n value: number | null\n}\n\nexport interface CapsuleFeaturesOutputType {\n acidity: CapsuleFeatureType\n bitterness: CapsuleFeatureType\n body: CapsuleFeatureType\n intensity: CapsuleFeatureType\n roast: CapsuleFeatureType\n}\n\nexport type QuickViewProductType = {\n modelType: string\n id: string\n legacyId: string\n internationalId: string\n name: string\n urlFriendlyName: string\n internationalName: string\n headline: string\n rootCategory: string\n category: string\n supercategories: string[]\n mobileImages: {\n modelType: string\n icon: string\n main: string\n }\n responsiveImages: {\n standard: string\n }\n pdpURLs: {\n opr: string\n desktop: string\n mobile: string\n }\n unitQuantity: number\n salesMultiple: number\n maxOrderQuantity: number\n technologies: string[]\n comingSoon: boolean\n unit_quantity: number\n productSelections: string[]\n type: string\n priceDisplay: string\n isOrderable: boolean\n bundled: boolean\n capsuleProperties: {\n intensity: number\n bitterness: number\n acidity: number\n roastLevel: number\n }\n capsuleProductAromatics: string[]\n aromaticProfileDescription: string\n roastingDescription: string\n capsuleCupSizes: string[]\n capsuleCupSizesDetails: {\n id: string\n name: string\n capacityLabel: string\n }[]\n capsuleAromatics: {\n id: string\n name: string\n }[]\n decaffeinated: boolean\n}\n\n//Confirmed this props are not available in Product Type\nexport type ProductNewPropsType = {\n currency: string\n pdpURLs: {\n desktop: string\n mobile: string\n }\n responsiveImages: {\n standard: string\n }\n supercategories: string[]\n productSelections: string[]\n capsuleProperties?: CapsuleFeaturesInputType\n capsuleProductAromatics: string[]\n unitPrice: number\n cupSizesDetails?: {\n icon: string\n label: string\n size: string\n capacityLabel: string | null\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string\n }\n detailsIcon: {\n url: string\n altText: string\n }\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n }[]\n category_name: string\n url: string\n}\n\n// This is the Product Type signature Combined\nexport type ProductPropsType = QuickViewProductType & ProductNewPropsType\n\nexport type AddToCartPropsType = {\n sku?: string\n longSku?: string\n category_name?: string\n price?: string\n strikethrough_price?: number\n hidePrice?: boolean\n type?: string\n price_per_capsule?: number | string\n show_capsule_price?: boolean\n label_capsules?: string\n capsule_price_label?: string\n capsule_price_syntax?: string\n show_sleeve_price?: boolean\n show_sleeve?: boolean\n sleeve_syntax?: string\n number_of_sleeves?: number\n label_sleeves?: string\n label_sleeve?: string\n technologies: string[]\n sales_multiple?: number\n unitQuantity?: number\n unit_quantity?: number\n bundled?: boolean\n url?: string\n}\n\nexport type PageBuilderProductPropsType = {\n sku: string\n highlighted: boolean\n labels: {\n bgColor: string\n color: string\n name: string\n }[]\n strikethrough_price: string\n variant: {\n is_capsule: boolean\n number_of_sleeves: number\n number_of_capsules: string\n bundle_details: {\n popin_link_text: string\n popin_label_close: string\n description: string\n other_skus: string\n other_skus_quantity: string\n }\n logos: {\n fair_trade: boolean\n alt_fair_trade: string\n is_organic: boolean\n alt_organic: string\n only_vertuo_next: boolean\n alt_vertuo_next: string\n is_rainforest: boolean\n alt_rainforest: string\n is_sustainable: boolean\n alt_sustainable: string\n is_q_certified_arabica: boolean\n alt_q_certification_arabica: string\n }\n sku_timer: {\n launch_date: string\n remaining_days: string\n remaining_day: string\n label: string\n a11y_label: string\n }\n ingredients: {\n heading: string\n description: string\n }\n }\n}\n\nexport type PageBuilderPropsType = {\n quick_view_plp?: {\n popin?: {\n close?: string\n }\n cup_sizes?: {\n heading: string\n unit_is_oz: boolean\n items: string[]\n }\n aromatic_profile?: {\n heading: string\n items: string[]\n }\n link?: {\n label: string\n url: string\n }\n levels?: {\n a11y_level_of: string\n acidity_label: string\n bitterness_label: string\n roastiness_label: string\n body_label: string\n }\n }\n campaign?: {\n id?: string\n name?: string\n creative?: string\n position?: string\n }\n tracking_position: string\n tracking_list: string\n capsuleProperties?: CapsuleFeaturesInputType\n price_per_capsule?: number | string\n show_capsule_price?: boolean\n label_capsules?: string\n capsule_price_label?: string\n capsule_price_syntax?: string\n show_sleeve_price?: boolean\n show_sleeve?: boolean\n sleeve_syntax?: string\n number_of_sleeves?: number\n label_sleeves?: string\n label_sleeve?: string\n technologies: string[]\n sales_multiple?: number\n unit_quantity?: number\n bundled?: boolean\n pdpURLs: {\n desktop: string\n mobile: string\n }\n intensity_label: string\n products: {\n sku: string\n longSku: string\n price: number\n strikethrough_price: number\n hidePrice: boolean\n url: string\n }[]\n priceFormatter: {\n formatPrice: (price: number) => string\n }\n currency: string\n options: {\n intensity_label: string\n show_sleeve: boolean\n label_sleeve: string\n label_sleeves: string\n label_capsules: string\n sleeve_syntax: string\n show_sleeve_price: boolean\n capsule_price_label: string\n capsule_price_syntax: string\n a11y_intensity_max: string\n label_decaffeinato: string\n is_headline_hidden: boolean\n sizes_title: string\n notes_title: string\n enabledExperiments: string[]\n }\n copywriting: {\n sku_quick_view: {\n more_info: string\n a11y_more_info: string\n popin: {\n close: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: boolean\n items: string[]\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n }\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n }\n}\n\nexport type SkuType = {\n tracking_list: string\n tracking_position: string\n id: string\n sku: string\n longSku: string\n name: string\n name_custom: string\n available: boolean\n description: string | null\n hidePrice: boolean\n image_alt_text: string\n inStock: boolean\n internationalId: string\n internationalName: string\n legacyId: string\n maxOrderQuantity: number | null\n packagingType: string | null\n price: string\n pushRatingEnabled: boolean\n ranges: string[]\n salesMultiple: number\n technologies: string[]\n type: string\n unitQuantity: number\n url: string\n labels: []\n category_name: string\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string | null\n }\n detailsIcon: string | null\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n highlighted: boolean\n strikethrough_price: string\n view_details_label: string\n headline: string\n cupSizes: string[]\n cupSizesDetails: {\n icon: string\n label: string\n size: string\n capacityLabel: string | null\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string | null\n }\n detailsIcon: string | null\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n }[]\n flavors: string[]\n in_stock: boolean\n sales_multiple: number\n bundled: boolean\n logos: []\n is_headline_hidden: boolean\n a11y_price: string\n a11y_product_card: string\n label_sleeve: string\n label_sleeves: string\n label_capsules: string\n intensity: number\n a11y_intensity_max: string\n label_decaffeinato: string\n show_sleeve_price: boolean\n show_sleeve: boolean\n price_per_capsule: number | string\n final_price: string | null\n capsule_price_label: string\n capsule_price_syntax: string\n sleeve_syntax: string\n perSleeveLabel: string\n number_of_sleeves: number\n number_of_capsules: string\n show_capsule_price: boolean\n sort_price: number\n bundle_details: any\n quick_view_plp: {\n show_view: boolean\n quick_view_text: string\n popin: {\n close: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: boolean\n items: string[]\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n }\n levels: {\n a11y_level_of: string\n acidity_label: string\n bitterness_label: string\n roastiness_label: string\n body_label: string\n }\n }\n hasPricePerSleeve: boolean\n sleevePrice: string\n rendererName: string\n position: number\n rawPrice: number\n variation: string\n intensity_label: string\n campaign: {\n id: string\n name: string\n creative: string\n position: string\n }\n capsuleProductAromatics: string[]\n copywriting: {\n heading: string\n sku_quick_view: {\n more_info: string\n a11y_more_info: string\n popin: {\n close: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: false\n items: string[]\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n }\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n }\n options: {\n intensity_label: string\n show_sleeve: boolean\n label_sleeve: string\n label_sleeves: string\n label_capsules: string\n sleeve_syntax: string\n show_sleeve_price: boolean\n capsule_price_label: string\n capsule_price_syntax: string\n a11y_intensity_max: string\n label_decaffeinato: string\n is_headline_hidden: boolean\n sizes_title: string\n notes_title: string\n enabledExperiments: string[]\n }\n products: {\n sku: string\n longSku: string\n price: number\n strikethrough_price: number\n hidePrice: boolean\n url: string\n }[]\n priceFormatter: {\n formatPrice: (price: number) => string\n }\n currency: string\n}\n\nexport type MergedProductType = {\n intensity_label: string\n capsuleProductAromatics?: string[]\n pdpURLs?: {\n desktop: string\n mobile: string\n }\n}\n\nexport type AddToCardPropertiesType = SkuType & MergedProductType\n\ntype CupSizeType = {\n icon: string\n label: string\n size: string\n capacityLabel: string | null\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string\n }\n detailsIcon: {\n url: string\n altText: string\n }\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n}[]\n\nexport type QuickViewPropsType = {\n popin: {\n popin_id: string\n close?: string\n footer: boolean\n }\n product: MergedProductType\n intensity: {\n intensity_label?: string\n a11y_intensity_max: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: boolean\n items?: [] | CupSizeType\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n url?: string\n }\n levels: any\n pricing: {\n add_to_cart: AddToCartPropsType & {\n position: string\n variation: string\n url: string\n view_details_label: string\n rendererName: string\n }\n showSleeve: any\n showCapsulePrice: any\n }\n campaign: any\n}\n","import { getMergedProductData } from '@kissui/page-builder-sections/src/cross-sell-natural/dataTransform'\n\nimport {\n CapsuleFeaturesInputType,\n CapsuleFeaturesOutputType,\n ProductPropsType,\n AddToCartPropsType,\n SkuType,\n ProductNewPropsType,\n MergedProductType,\n AddToCardPropertiesType,\n QuickViewPropsType,\n VARIATION_PLP,\n VARIATION_CROSS_SELL\n} from './shared-quick-view-types'\n\nexport const getCapsuleFeatures = ({\n acidity = null,\n bitterness = null,\n body = null,\n intensity = null,\n roastLevel = null\n}: CapsuleFeaturesInputType = {}): CapsuleFeaturesOutputType => ({\n acidity: { value: acidity },\n bitterness: { value: bitterness },\n body: { value: body },\n intensity: { value: intensity },\n roast: { value: roastLevel }\n})\n\nexport const getSkuQuickViewData = async (\n product: ProductPropsType,\n popinId: string,\n skuData: SkuType,\n componentType: string\n) => {\n const { tracking_position, tracking_list } = skuData\n\n const handlePLPVariation = () => {\n if (!product) return\n let quickViewElement = document.createElement('nb-sku-quick-view')\n quickViewElement.setAttribute(\n 'data',\n JSON.stringify(getSkuQuickViewProp(popinId, product, skuData, componentType))\n )\n quickViewElement.setAttribute('id', popinId)\n quickViewElement.setAttribute('tracking_no_impression', 'true')\n quickViewElement.setAttribute('tracking_position', tracking_position)\n quickViewElement.setAttribute('tracking_list', tracking_list)\n quickViewElement.setAttribute('campaign_position', skuData.campaign.position)\n quickViewElement.setAttribute('listname_text', skuData?.copywriting?.heading)\n document.body.appendChild(quickViewElement)\n }\n\n const handleCrossSellVariation = () => {\n const { sku_quick_view } = skuData.copywriting\n if (!sku_quick_view.more_info) return ''\n\n const quickViewElement = document.querySelector(\n `nb-sku-quick-view > nb-popin[id=\"${popinId}\"]`\n )?.parentElement\n\n if (quickViewElement) quickViewElement.remove()\n\n let newQuickViewElement = document.createElement('nb-sku-quick-view')\n newQuickViewElement.setAttribute(\n 'data',\n JSON.stringify(getSkuQuickViewProp(popinId, product, skuData, componentType))\n )\n newQuickViewElement.setAttribute('tracking_no_impression', 'true')\n newQuickViewElement.setAttribute('tracking_position', tracking_position)\n newQuickViewElement.setAttribute('tracking_list', tracking_list)\n newQuickViewElement.setAttribute('campaign_position', skuData.campaign.position)\n newQuickViewElement.setAttribute('listname_text', skuData?.copywriting?.heading)\n document.body.appendChild(newQuickViewElement)\n }\n\n const variationHandlers: { [key: string]: () => void | string } = {\n [VARIATION_PLP]: handlePLPVariation,\n [VARIATION_CROSS_SELL]: handleCrossSellVariation\n }\n\n const handleVariation = variationHandlers[componentType]\n if (handleVariation) {\n handleVariation()\n }\n}\n\nexport const getSkuQuickViewProp = (\n popinId: string,\n product: ProductPropsType,\n skuData: SkuType,\n componentType: string\n) => {\n let mergedProductData = getMergedProductDataForComponentType(product, skuData, componentType)\n let addToCartProps = getAddToCartProperties(componentType, skuData, mergedProductData)\n\n return isVariationOnPLP(componentType)\n ? getPlpQuickViewProps(popinId, skuData, mergedProductData, addToCartProps)\n : getCrossSellQuickViewProps(popinId, product, skuData, mergedProductData, addToCartProps)\n}\n\nconst getMergedProductDataForComponentType = (\n product: ProductPropsType,\n skuData: SkuType,\n componentType: string\n) => {\n switch (componentType) {\n case VARIATION_PLP:\n return {\n ...skuData,\n ...product,\n ...getCapsuleFeatures(product?.capsuleProperties)\n }\n case VARIATION_CROSS_SELL: {\n const matchedProduct =\n skuData.products?.find(\n productPageBuilder => productPageBuilder.sku === product?.legacyId\n ) || {}\n return getMergedProductData(\n product,\n matchedProduct,\n skuData,\n skuData?.priceFormatter,\n skuData?.currency\n )\n }\n default:\n return {}\n }\n}\n\nexport const getAddToCartProperties = (\n componentType: string,\n skuData: SkuType,\n mergedProductData: MergedProductType\n): AddToCartPropsType => {\n const data: AddToCardPropertiesType = isVariationOnPLP(componentType)\n ? skuData\n : (mergedProductData as AddToCardPropertiesType)\n return getAddToCartProps(data, componentType)\n}\n\nexport const getAddToCartProps = (\n data: AddToCardPropertiesType,\n componentType: string\n): AddToCartPropsType => {\n const commonProps: AddToCartPropsType = {\n sku: data.sku,\n longSku: data.longSku,\n category_name: data.category_name,\n price: data.price ?? 0,\n strikethrough_price: Number(data.strikethrough_price),\n hidePrice: data.hidePrice,\n technologies: data.technologies || [],\n url: data.url || ''\n }\n\n if (isVariationOnPLP(componentType)) {\n return {\n ...commonProps,\n type: data.type,\n price_per_capsule: data.price_per_capsule,\n show_capsule_price: data.show_capsule_price,\n label_capsules: data.label_capsules,\n capsule_price_label: data.capsule_price_label,\n capsule_price_syntax: data.capsule_price_syntax,\n show_sleeve_price: data.show_sleeve_price,\n show_sleeve: data.show_sleeve,\n sleeve_syntax: data.sleeve_syntax,\n number_of_sleeves: data.number_of_sleeves,\n label_sleeves: data.label_sleeves,\n label_sleeve: data.label_sleeve,\n technologies: data.technologies || [],\n sales_multiple: data.sales_multiple,\n unit_quantity: data.unitQuantity,\n bundled: data.bundled,\n url: data.url || ''\n }\n }\n\n return commonProps\n}\n\nexport const getPlpQuickViewProps = (\n popinId: string,\n skuData: SkuType,\n mergedProductData: MergedProductType,\n addToCartProps: AddToCartPropsType\n): QuickViewPropsType => {\n return {\n popin: {\n popin_id: popinId,\n close: skuData?.quick_view_plp?.popin?.close,\n footer: true\n },\n product: {\n ...mergedProductData\n },\n intensity: {\n intensity_label: mergedProductData?.intensity_label,\n a11y_intensity_max: 'max of {max_intensity}'\n },\n cup_sizes: {\n ...skuData?.quick_view_plp?.cup_sizes,\n items: skuData?.cupSizesDetails\n },\n aromatic_profile: {\n ...skuData?.quick_view_plp?.aromatic_profile,\n items: skuData?.capsuleProductAromatics || mergedProductData?.capsuleProductAromatics\n },\n link: {\n ...skuData?.quick_view_plp?.link,\n url: skuData?.url\n },\n levels: {\n ...skuData?.quick_view_plp?.levels\n },\n pricing: {\n add_to_cart: {\n ...addToCartProps,\n position: '',\n variation: 'small',\n url: '',\n view_details_label: 'View details',\n rendererName: ''\n },\n showSleeve: {},\n showCapsulePrice: {}\n },\n campaign: skuData.campaign\n }\n}\n\nexport const getCrossSellQuickViewProps = (\n popinId: string,\n product: ProductNewPropsType,\n skuData: SkuType,\n mergedProductData: MergedProductType,\n addToCartProps: AddToCartPropsType\n): QuickViewPropsType => {\n const props: QuickViewPropsType = {\n popin: {\n popin_id: popinId,\n close: skuData?.copywriting?.sku_quick_view?.popin?.close,\n footer: true\n },\n product: {\n ...mergedProductData\n },\n intensity: {\n intensity_label: skuData?.options?.intensity_label,\n a11y_intensity_max: 'max of {max_intensity}'\n },\n cup_sizes: {\n ...skuData?.copywriting?.sku_quick_view?.cup_sizes,\n items: product?.cupSizesDetails\n },\n aromatic_profile: {\n ...skuData?.copywriting?.sku_quick_view?.aromatic_profile,\n items: product?.capsuleProductAromatics || mergedProductData?.capsuleProductAromatics\n },\n link: {\n ...skuData?.copywriting?.sku_quick_view?.link,\n url: mergedProductData?.pdpURLs?.desktop\n },\n levels: {\n ...skuData?.quick_view_plp?.levels\n },\n pricing: {\n add_to_cart: {\n ...addToCartProps,\n position: '',\n variation: 'small',\n url: '',\n view_details_label: 'View details',\n rendererName: ''\n },\n showSleeve: {},\n showCapsulePrice: {}\n },\n campaign: {}\n }\n return props\n}\nconst isVariationOnPLP = (componentType: string) => componentType === VARIATION_PLP\n","import { sanitizeString } from '@kissui/helpers/src/utils'\nimport { getMergedProductCoffeeData } from './product.coffee.dto'\nimport { getMergedProductMachineData } from './product.machine.dto'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { getMergedProductGiftCardData } from './product.giftCard.dto'\nimport { getMergedProductAccessoryData } from './product.accessory.dto'\nimport { apiOverride } from '@kissui/components/src/sku/services'\nimport {\n ECAPI_TYPE_ACCESSORY,\n ECAPI_TYPE_CAPSULE,\n ECAPI_TYPE_GIFT_CARD,\n ECAPI_TYPE_MACHINE\n} from '@kissui/helpers/src/catalog'\n\nexport const getMergedProductData = (\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n) => {\n const { options } = pageBuilderProps\n const {\n variant = {},\n labels = [],\n strikethrough_price,\n additional_message,\n additional_message_icon,\n additional_message_link,\n contact_cta\n } = pageBuilderProductProps || {}\n\n // lists header props not coming from this.props\n let data = {\n sku: product.internationalId,\n technologies: product.technologies,\n longSku: product.id,\n name: product.name,\n headline: sanitizeString(product.headline),\n sales_multiple: product.salesMultiple,\n unit_quantity: product.unitQuantity,\n type: product.type,\n category_name: product.rangeData?.name || '',\n label_range: product.rangeData?.name || '',\n price: product.price ? priceFormatter.short(currency, product.price) : null,\n rawPrice: product.price,\n strikethrough_price: strikethrough_price || '',\n variation: VARIATION_PLP,\n image_alt_text: product.name,\n image: product.images?.icon || product.images?.push || product.images?.main,\n additional_message: additional_message || '',\n additional_message_icon: additional_message_icon || '',\n additional_message_link: additional_message_link || {},\n contact_cta: contact_cta || {},\n ...apiOverride(product, pageBuilderProductProps)\n }\n\n if (labels && labels.length) {\n data.labels = labels\n }\n\n if (product.highlighted) {\n data.highlighted = product.highlighted\n }\n\n let dataTransformObjectProductType = {}\n if (product.type === ECAPI_TYPE_CAPSULE) {\n dataTransformObjectProductType = getMergedProductCoffeeData(\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n )\n } else if (product.type === ECAPI_TYPE_MACHINE) {\n dataTransformObjectProductType = getMergedProductMachineData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n } else if (product.type === ECAPI_TYPE_ACCESSORY) {\n dataTransformObjectProductType = getMergedProductAccessoryData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n } else if (product.type === ECAPI_TYPE_GIFT_CARD) {\n dataTransformObjectProductType = getMergedProductGiftCardData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n }\n\n return {\n ...product,\n ...options,\n ...variant,\n ...data,\n ...dataTransformObjectProductType\n }\n}\n","export const getMergedProductMachineData = (product, pageBuilderProductProps, pageBuilderProps) => {\n const { strikethrough_price, variant = {} } = pageBuilderProductProps\n const { ratingsAndReviews } = product\n\n // lists header props not coming from this.props\n const options = {\n ratings: ratingsAndReviews\n }\n\n if (variant?.colors) {\n options.colors = variant.colors\n options.activeSku = product.internationalId\n options.max_colors = 99\n }\n\n options.strikethrough_price = strikethrough_price || ''\n options.show_ratings = (pageBuilderProps && pageBuilderProps.options.show_ratings) || false\n options.minimum_rating = (pageBuilderProps && pageBuilderProps.options.minimum_rating) || 0\n\n return options\n}\n","export const getMergedProductAccessoryData = () => ({})\n","export const getMergedProductGiftCardData = (_, pageBuilderProductProps) => {\n const { variant = {} } = pageBuilderProductProps\n\n return {\n image: variant && variant.default_image\n }\n}\n","export const dispatchEvent = ({ eventName, args, element }) => {\n // Use the provided element or fallback to window if available\n if (!element) {\n if (typeof window !== 'undefined') {\n element = window\n } else {\n throw new Error(\n '`element` is not provided and `window` is unavailable. Provide a valid element to dispatch the event.'\n )\n }\n }\n\n let event\n if (args) {\n event = new CustomEvent(eventName, { detail: args, bubbles: true })\n } else {\n if (typeof Event === 'function') {\n event = new Event(eventName)\n } else {\n event = document.createEvent('Event')\n event.initEvent(eventName, true, true)\n }\n }\n element.dispatchEvent(event)\n}\n\nexport const readEvent = e => {\n if (!e.detail) {\n return\n }\n return e.detail\n}\n","export type EventListener = {\n element: HTMLElement\n type: string\n listener: (e: Event) => void\n options?: boolean | AddEventListenerOptions\n}\n\nconst add = (eventListeners: EventListener[] = []) => {\n eventListeners.forEach(eventListener => {\n if (!eventListener || !eventListener.element) {\n return\n }\n return eventListener.element.addEventListener(\n eventListener.type,\n eventListener.listener,\n eventListener.options\n )\n })\n}\n\nconst remove = (eventListeners: EventListener[] = []) => {\n eventListeners.forEach(eventListener => {\n if (!eventListener || !eventListener.element) {\n return\n }\n eventListener.element.removeEventListener(eventListener.type, eventListener.listener)\n })\n}\n\nconst busNamespace = 'pageBuilder'\n\nexport const emitCustomEvent = (eventName: string, data: unknown) => {\n const customEvent = new CustomEvent(`${busNamespace}.${eventName}`, {\n detail: data,\n bubbles: true,\n cancelable: true,\n composed: false\n })\n\n window.dispatchEvent(customEvent)\n}\n\nexport default { add, emitCustomEvent, remove }\n","import { getProduct } from '@kissui/helpers/src/catalog'\nimport { emitCustomEvent } from './events.helpers'\nimport { removeEmptyValues } from '@kissui/helpers/src/utils'\n\nconst raisedByPB = 'page builder'\nconst raisedByWC = 'Web component'\n\n/**\n * helper method for 'itemDisplay' GTM event\n * @param {*} event : 'itemDisplay' - Mandatory as is\n * @param {*} eventRaisedBy : 'Web component' - Mandatory as is\n * @param {*} eventAction : 'Click' - Action that led to the item display. For example, click\n * @param {*} itemTypes : ['products'] - Mandatory as is\n * @param {*} rootElement : ['nb-slider'] - Root DOM element for item detection. Closest common ancestor element of the inserted/displayed promotions and products. It will help the detection to reduce its performance consumption. Set to 0 (zero) in order to request detection through the entire document.\n */\nexport const itemDisplay = args => {\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'itemDisplay',\n eventRaisedBy: raisedByWC,\n eventAction: 'Click',\n itemTypes: ['products'],\n ...args\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('itemDisplay', eventData)\n}\n\n/**\n *\n * helper method for 'customEvent' GTM event\n * @param {*} args (event, eventRaisedBy, eventCategory, eventAction, eventLabel, nonInteraction)\n */\n\nexport const customEvent = args => {\n window.gtmDataObject = window.gtmDataObject || []\n var eventData\n if (args.event_GA4 === undefined || args.event_GA4 === false) {\n eventData = {\n event: 'customEvent',\n eventRaisedBy: raisedByWC,\n ...args\n }\n } else {\n eventData = {\n event_raised_by: raisedByPB,\n ...args\n }\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('customEvent', eventData)\n}\n\n/**\n * Helper method for tracking component interactions, compatible with GA4.\n *\n * @param {String} creative : component raising the event, e.g. 'before_coffees_list', 'before_machines_list', 'before_accessories_list'\n * @param {String} actionType : description of the interaction, e.g 'pdp quick view'\n * @param {String} internationalId : long SKU, e.g. 'erp.pt.b2c/prod/7243.30'\n * @param {String} internationalName : international name of the product, e.g. 'Vertuo Carafe Pour-Over Style Mild'\n * @param {String} productType : type of product, i.e. 'capsule', 'machine', 'accessory'\n * @param {String} range : product range, e.g. 'ispirazione italiana'\n * @param {String} technology : technology, i.e. 'original', 'vertuo'\n * @param {Number} price : price, e.g. .51\n * @param {String} eventAction : description of the action, e.g. 'PDP Quick View'\n *\n * Initally created for PDP Quick View tracking:\n * https://dsu-confluence.nestle.biz/display/DIANA/BEFORE+-+PDP+Quick+View\n * Will probably be rolled out across all components, update this comment accordingly.\n */\nexport const trackComponentInteraction = ({\n creative = '',\n actionType = '',\n internationalId = '',\n internationalName = '',\n productType = '',\n technology = '',\n category = '',\n rawPrice = '',\n eventAction = ''\n}) => {\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'page_builder_component_interaction',\n event_raised_by: raisedByPB,\n component_name: creative,\n action_type: actionType,\n item_id_event: internationalId,\n item_name_event: internationalName,\n item_category_event: productType,\n item_technology_event: technology,\n item_range_event: category,\n item_price_event: rawPrice,\n eventCategory: 'User Engagement',\n eventAction: eventAction,\n eventLabel: `${productType} - ${technology} - ${internationalName}`\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\n/**\n *\n * Push 'view_promotion' event for GA 4\n * @param {*} args (event, event_raised_by, ecommerce: {promotion_id, promotion_name, creative_slot, creative_name})\n */\nexport const viewPromotion = args => {\n const event = 'view_promotion'\n const eventData = {\n event,\n event_raised_by: raisedByPB,\n ecommerce: {}\n }\n if (Object.keys(args).length) {\n const { id = '', creative = '', name = '', position = '' } = args\n let ecommerceData = {\n promotion_id: id,\n promotion_name: name,\n creative_slot: position,\n creative_name: creative\n }\n ecommerceData = removeEmptyValues(ecommerceData)\n eventData.ecommerce = ecommerceData\n }\n window.gtmDataObject ??= []\n window.gtmDataObject.push(eventData)\n emitCustomEvent(event, eventData)\n}\n\nexport const handlePromoClick = args => {\n const { campaign, cta_name } = args\n\n const cleanedData = removeEmptyValues(campaign)\n selectPromotion({ cta_name, ...cleanedData })\n}\n\n/**\n *\n * Push 'select_promotion' event for GA 4\n * @param {*} args (event, event_raised_by, cta_name, ecommerce: {promotion_id, promotion_name, creative_slot, creative_name})\n */\nexport const selectPromotion = args => {\n const event = 'select_promotion'\n const eventData = {\n event: 'select_promotion',\n cta_name: args?.cta_name ?? '(not set)',\n event_raised_by: raisedByPB,\n ecommerce: {}\n }\n if (Object.keys(args).length) {\n const { id = '', creative = '', name = '', position = '' } = args\n let ecommerceData = {\n promotion_id: id,\n promotion_name: name,\n creative_slot: position,\n creative_name: creative\n }\n ecommerceData = removeEmptyValues(ecommerceData)\n eventData.ecommerce = ecommerceData\n }\n\n window.gtmDataObject ??= []\n window.gtmDataObject.push(eventData)\n emitCustomEvent(event, eventData)\n}\n\nexport const interactionClick = (nameComponent, ctaName) => {\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'page_builder_component_interaction',\n event_raised_by: raisedByPB,\n eventCategory: 'User Engagement',\n eventAction: 'Click CTA',\n eventLabel: `Page Builder - ${nameComponent} - ${ctaName}`,\n component_name: nameComponent,\n action_type: 'web component click',\n cta_name: ctaName\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\nexport const getProductInfo = async (sku, data) => {\n let product = data\n if (!product) {\n product = await getProduct(sku)\n }\n return product\n}\n\nexport const getProductPayload = (data, actionField = {}) => {\n const {\n internationalName,\n internationalId,\n category,\n unitPrice,\n legacyId,\n name,\n technologies,\n bundled,\n inStock,\n type\n } = data\n\n const technology = technologies.map(item => item.split('/').pop()).join('|')\n const isDiscovery = category.toLowerCase().includes('discovery')\n\n return [\n // Array consists of one product details for PDP Product Detail View\n {\n ...actionField,\n name: internationalName, // '[[International Product Name]]' NIE, Contract\n id: internationalId, // '[[International Product ID]]'\n price: unitPrice, // '[[Product Price]'\n // dimension43: '[[true/false]]', // '[[true/false]]' // Signifies if this product is part of a standing order or not\n dimension44: isDiscovery.toString(), // '[[true/false]]', // Signifies if this product is part of a discovery offer\n dimension53: legacyId, // '[[Product Local market ID]]', // Local market id for product\n dimension54: name, // '[[Product Local market Name]]', // Local market name for product\n dimension55: category, // '[[Product Range]]', // Range of the product, eg: Barista Creations for Ice (Nessoft Category)\n dimension56: technology, // '[[Product Technology]]', //Product technology according to Nespresso categorization (original, vertuo, pro)\n dimension57: bundled ? 'bundle' : 'single', // '[[Product Type]]', //If the product is single or bundle\n dimension192: inStock ? 'in stock' : 'out of stock', // '[in stock]', // \"in stock\" or \"out of stock\"\n category: type, // '[[Product Category]]', //Product category according to Nespresso categorization (Nessoft type): capsule, accessory, machine\n brand: 'Nespresso' // Static value set to Nespresso\n }\n ]\n}\n\nexport const trackDetailView = async (sku, data) => {\n // https://dsu-confluence.nestle.biz/display/DIANA/HQ+PB+Tracking+-+Product+Detail+View\n if (window.pbTrackDetailViewPDP || !sku || !window.napi) {\n return\n }\n\n const productInfo = await getProductInfo(sku, data)\n const productPayload = getProductPayload(productInfo)\n const currency = productInfo.currency\n\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'detailView',\n currencyCode: currency,\n eventRaisedBy: raisedByPB,\n ecommerce: {\n detail: {\n actionField: {},\n products: productPayload\n }\n }\n }\n window.gtmDataObject.push(eventData)\n // Track only once per page\n window.pbTrackDetailViewPDP = true\n emitCustomEvent('detailView', eventData)\n}\n\nexport const trackAddToCartImpression = (product, isStickyBar) => {\n // https://dsu-confluence.nestle.biz/pages/viewpage.action?spaceKey=DIANA&title=PDP+-+Sticky+Add+To+Cart+Custom+Event\n\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'page_builder_component_interaction',\n event_raised_by: raisedByPB,\n component_name: 'before_sku_main_info',\n action_type: isStickyBar\n ? 'sticky add to cart impression'\n : 'standard add to cart impression',\n //product info\n item_id_event: product.internationalId,\n item_name_event: product.internationalName,\n item_category_event: product.type,\n item_price_event: product.price_per_capsule?.split(' ')[0],\n item_market_id_event: product.legacyId,\n item_market_name_event: product.name,\n item_range_event: product.category_name,\n item_technology_event: product.technology?.[0]?.split('/').slice(-1) ?? '',\n item_type_event: product.bundled ? 'bundle' : 'single'\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\nexport const productImpression = async (position, list, sku, data) => {\n // https://dsu-confluence.nestle.biz/pages/viewpage.action?pageId=225612781\n // don't track already tracked products\n window.gtmDataObject = window.gtmDataObject || []\n const hasDetailView = window.gtmDataObject.find(item => item.event === 'detailView')\n const alreadyTracked = !!hasDetailView?.ecommerce?.detail?.products.find(p =>\n sku.includes(p.id)\n )\n if (alreadyTracked) {\n return\n }\n\n const productInfo = await getProductInfo(sku, data)\n const productPayload = getProductPayload(productInfo, { list: list, position: position })\n const currency = productInfo.currency\n const eventData = {\n event: 'impression',\n eventAction: 'Product Impression',\n currencyCode: currency,\n eventRaisedBy: raisedByPB,\n ecommerce: {\n impressions: productPayload\n }\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('impression', eventData)\n}\n\nexport const productClick = async (position, list, sku, data) => {\n // https://dsu-confluence.nestle.biz/pages/viewpage.action?pageId=225612781\n\n if (typeof list !== 'string') return\n\n const productInfo = await getProductInfo(sku, data)\n const productPayload = getProductPayload(productInfo, { position: position })\n const currency = productInfo.currency\n\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'productClick',\n eventAction: 'Product Click',\n currencyCode: currency,\n eventRaisedBy: raisedByPB,\n ecommerce: {\n click: {\n actionField: {\n list: list\n },\n products: productPayload\n }\n }\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('productClick', eventData)\n}\n\nexport function filterTrackingFromPlpFilters(filtersSelected) {\n const grouped = groupSelectedFilters(filtersSelected)\n const groupKeys = Object.keys(grouped)\n const typesFiltersSelected = groupKeys.join('|').substring(0, 99)\n const valuesFiltersSelected = groupKeys\n .map(key => grouped[key].values.map(value => value.split('/').at(-1)).join(','))\n .join('|')\n .substring(0, 99)\n\n return [typesFiltersSelected, valuesFiltersSelected]\n}\n\nexport const filterActionEvent = (\n actionType,\n filterType,\n filterValues,\n clickLocation,\n dataType\n) => {\n // https://dsu-confluence.nestle.biz/display/DIANA/PLP+-+Filter+Revamp\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = getExplicitFilterEventData(\n actionType,\n filterType,\n filterValues,\n clickLocation\n )\n\n window.gtmDataObject.push(eventData)\n if (window.NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING && dataType) {\n window.gtmDataObject.push({\n ...window.NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING,\n experiment_action: `${actionType} - ${dataType}`,\n cta_name: 'All filters'\n })\n }\n\n emitCustomEvent('plp_filter', eventData)\n}\n\nconst getExplicitFilterEventData = (actionType, filterType, filterValues, clickLocation) => {\n return {\n event: 'plp_filter',\n event_raised_by: raisedByPB,\n action_type: actionType,\n filter_type: filterType,\n ...(filterValues ? { filter_values: filterValues } : {}),\n ...(clickLocation ? { click_location: clickLocation } : {})\n }\n}\n\nfunction groupSelectedFilters(filtersSelected = []) {\n return filtersSelected.reduce((grouped, { key, value }) => {\n if (!grouped[key]) grouped[key] = { key, values: [] }\n grouped[key].values.push(value.replaceAll(',', '-'))\n return grouped\n }, {})\n}\n\nfunction arrTolastURLElementMapper(arr) {\n if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n return arr.map(item => item.split('/').pop()?.trim() || '')\n}\n\nfunction arrToJoinedString(arr, joiner = '|') {\n if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n return arr.map(item => item.trim()).join(joiner)\n}\n\nfunction findTechnogiesText(arr) {\n if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n if (arr.length === 1) return cleanText(arrTolastURLElementMapper(arr)?.[0])\n else return 'multiple'\n}\n\nfunction cleanText(str) {\n if (typeof str === 'undefined') return undefined\n\n return str.toString().trim()\n}\n\nconst generateEcommerceObject = async (productIds, options) => {\n const productRequests = productIds.map(SKU => getProduct(SKU))\n const productData = await Promise.all(productRequests)\n\n return {\n ecommerce: {\n currency: window[window.config.padl.namespace].dataLayer.app.app.currency,\n value: productData.reduce((ac, product) => {\n return ac + product.price\n }, 0),\n items: productData.map((product, index) => {\n if (product.type === 'bundle' || product.type === 'giftcard') {\n return {\n item_id: cleanText(product.internationalId),\n item_name: cleanText(product.internationalName),\n item_brand: 'nespresso',\n item_category: cleanText(product.type),\n index: index + 1\n }\n }\n\n let output = {\n item_id: cleanText(product.internationalId),\n item_name: cleanText(product.internationalName),\n item_brand: 'nespresso',\n item_category: cleanText(product.type),\n item_category2: arrToJoinedString(\n arrTolastURLElementMapper(product.technologies)\n ),\n item_category3: cleanText(product.category),\n price: product.price,\n quantity: product.salesMultiple,\n affiliation: 'nespresso online store',\n coupon: undefined,\n discount: undefined,\n location_id: undefined,\n item_list_name: cleanText(options?.listName),\n item_list_id: cleanText(options?.listId),\n index: index + 1,\n item_market_id: cleanText(product.legacyId),\n item_market_name: cleanText(product.name),\n item_technology: findTechnogiesText(product.technologies),\n item_range: cleanText(product.category),\n item_discovery_offer: product.category.includes('discovery').toString(),\n item_added_by_user: undefined,\n item_ecotax_applicable: product?.displayEcoTax\n ? cleanText(product?.displayEcoTax.toString())\n : undefined,\n item_selection_list: cleanText(arrToJoinedString(product.productSelections)),\n item_in_stock: product?.inStock\n ? cleanText(product?.inStock.toString())\n : undefined,\n item_subscription_name: undefined,\n item_subscription_category: undefined,\n item_subscription_price: undefined,\n item_subscription_duration: undefined,\n item_subscription_fee: undefined\n }\n\n switch (product.type) {\n case 'capsule': {\n const capsuleProduct = product\n\n output.item_category4 = capsuleProduct.bundled ? 'bundle' : 'single'\n\n output.item_type = capsuleProduct.bundled ? 'bundle' : 'single'\n\n output.item_coffee_aromatic_profile = cleanText(\n arrToJoinedString(capsuleProduct.capsuleProductAromatics)?.toLowerCase()\n )\n\n output.item_coffee_intensity =\n cleanText(capsuleProduct.capsuleProperties.intensity) ?? undefined\n\n output.item_coffee_cup_size = cleanText(\n arrToJoinedString(capsuleProduct.capsuleCupSizes)\n )?.toLowerCase()\n\n break\n }\n case 'machine': {\n const machineProduct = product\n\n output.item_machine_shade = cleanText(machineProduct.colorShade?.name)\n\n break\n }\n }\n\n if (product.type === 'machine' || product.type === 'accessory') {\n output.item_avg_rating = product.ratingCode\n output.item_number_of_reviews = product.ratingCode\n }\n\n return output\n })\n }\n }\n}\n\nexport const selectItems = async (productIds, options) => {\n const ecommerceObject = await generateEcommerceObject(productIds, options)\n\n const output = {\n event: 'select_item',\n event_raised_by: options?.eventRaisedBy ?? 'before_cross_sell_v3',\n click_location: options?.clickLocation ?? 'page builder cross sell quick view',\n item_list_id: options?.listId ?? 'before_cross_sell_v3',\n subscription_product_included: 'false',\n discovery_offer_included: 'false',\n ...ecommerceObject\n }\n\n window.gtmDataObject.push({ ecommerce: null })\n window.gtmDataObject.push(output)\n}\n\nexport const viewItemList = async (productIds, options) => {\n const ecommerceObject = await generateEcommerceObject(productIds, options)\n\n const output = {\n event: 'view_item_list',\n event_raised_by: options?.eventRaisedBy,\n subscription_product_included: 'false',\n discovery_offer_included: 'false',\n ...ecommerceObject\n }\n\n if (options?.eventRaisedBy === undefined) delete output.event_raised_by\n\n window.gtmDataObject.push({ ecommerce: null })\n window.gtmDataObject.push(output)\n}\n\nexport const isGtmTrackingExists = trackingData => {\n window.gtmDataObject = window.gtmDataObject || []\n\n return window.gtmDataObject.some(\n event =>\n event.event === trackingData.event &&\n event.ecommerce?.creative_slot === trackingData.campaign.position &&\n event.ecommerce?.promotion_id === trackingData.campaign.id &&\n event.ecommerce?.promotion_name === trackingData.campaign.name &&\n event.ecommerce?.creative_name === trackingData.campaign.creative\n )\n}\n","import { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { renderLabels } from './fragments/labels'\nimport { renderLogos } from '@kissui/helpers/src/logos.helpers'\nimport { renderImage } from './fragments/image'\nimport { renderHeading } from './fragments/heading'\nimport { renderHeadline } from './fragments/headline'\nimport { renderLabelTechnology } from './fragments/labelTechnology'\nimport { renderLabelRange } from './fragments/labelRange'\nimport { renderQuickView } from './fragments/quickView'\nimport { renderStrikethroughPrice } from './fragments/strikethroughPrice'\nimport { renderPrice } from './fragments/price'\nimport { renderAddToCart } from './fragments/addToCart'\nimport { renderAdditionalMessage } from './fragments/additionalMessage'\nimport { setCardTheme } from './fragments/setCardTheme'\nimport { getSkuQuickViewData } from '@kissui/components/src/sku-quick-view/shared-quick-view'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { getTechnologyName, getProduct } from '@kissui/helpers/src/catalog'\nimport { trackComponentInteraction, productClick } from '@kissui/helpers/src/gtmEvents'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\n\nclass Sku extends NespressoElement {\n constructor() {\n super()\n this.type = 'default'\n this.popinId = ''\n this.isQuickViewPlp = false\n this.boundOnPDPLinkClick = this.onPDPLinkClick.bind(this)\n this.boundOnQuickViewOpen = this.onQuickViewOpen.bind(this)\n this.clickMethod = this.boundOnPDPLinkClick\n }\n\n loadTemplate() {\n this.classList.add('nb-sku')\n this.classList.add(`nb-sku__${this.type}`)\n setCardTheme(this.props, this)\n\n Object.assign(this.props, this.getSleevePrice(this.props))\n Object.assign(this.props, this.checkHiddenPriceForLoggedInUser(this.props))\n\n const { quick_view_plp = {} } = this.props\n this.isQuickViewPlp = quick_view_plp?.show_view || false\n this.clickMethod = this.isQuickViewPlp\n ? this.boundOnQuickViewOpen\n : this.boundOnPDPLinkClick\n\n this.template = `${this.renderVisual()}\n ${this.renderHeader()}\n <div class=\"cb-content\">\n ${this.renderInformation()}\n ${this.isQuickViewPlp ? this.renderQuickView() : ''}\n <div class=\"cb-shop\">\n <div class=\"cb-price\">\n ${this.renderPricing()}\n </div>\n ${this.renderAction()}\n </div>\n ${this.renderFooter()}\n </div>`\n\n this.render()\n }\n\n onReady() {\n const { activeSku, sku } = this.props\n this.setAttribute('data-product-short-sku', activeSku || sku)\n this.bindEvent()\n }\n\n renderHeaderDefault() {\n return `${renderLabels(this.props, this)}${renderLogos(this.props, this)}`\n }\n\n renderHeader() {\n return this.renderHeaderDefault()\n }\n\n renderVisualDefault() {\n const theme = this.hasAttribute('portrait') ? 'portrait' : 'landscape'\n return renderImage(this.props, theme)\n }\n\n getSleevePrice({ number_of_sleeves, price }) {\n let hasPricePerSleeve = true\n let sleevePrice\n if (number_of_sleeves === '1') {\n sleevePrice = price\n } else {\n hasPricePerSleeve = false\n }\n return { hasPricePerSleeve, sleevePrice }\n }\n\n checkHiddenPriceForLoggedInUser({ hidePrice, show_view_details }) {\n return {\n hidePrice: isLoggedIn() ? false : hidePrice,\n show_view_details: isLoggedIn() ? false : show_view_details\n }\n }\n\n renderVisual() {\n return this.renderVisualDefault()\n }\n\n renderInformationDefault() {\n return `${renderLabelTechnology(this.props)}\n ${renderLabelRange(this.props)}\n ${renderHeading(this.props)}\n ${renderHeadline(this.props)}`\n }\n\n renderInformation() {\n return this.renderInformationDefault()\n }\n\n renderQuickView() {\n return renderQuickView(this.props)\n }\n\n renderPricingDefault() {\n const isPortrait = this.hasAttribute('portrait')\n\n const pricingWithClass = `\n ${renderStrikethroughPrice(this.props, this)}\n <div class=\"${isPortrait ? 't-md-700-sl' : 't-sm-700-sl'}\">\n ${renderPrice(this.props)}\n </div>`\n\n return pricingWithClass\n }\n\n renderPricing() {\n return this.renderPricingDefault()\n }\n\n renderActionDefault() {\n return renderAddToCart(this.props, false, this)\n }\n\n renderAction() {\n const actionSlot = this.querySelector('[slot=\"action\"]')?.outerHTML\n if (actionSlot) {\n return actionSlot\n }\n return this.renderActionDefault()\n }\n\n renderFooterDefault() {\n return renderAdditionalMessage(this.props)\n }\n\n renderFooter() {\n return this.renderFooterDefault()\n }\n\n async onPDPLinkClick() {\n const productIndex = this.getAttribute('tracking_position') || 0\n const list = this.getAttribute('tracking_list') || ''\n\n await productClick(productIndex, list, this.props.longSku)\n }\n\n renderSkuQuickView(product) {\n this.popinId = `plp-quick-view`\n\n let quickViewElement = document.querySelector(`#${this.popinId}`)\n if (quickViewElement) {\n quickViewElement.remove()\n }\n\n getSkuQuickViewData(product, this.popinId, this.props, VARIATION_PLP)\n }\n\n async onQuickViewOpen(e) {\n e.preventDefault()\n\n const { sku } = this.props\n if (!sku) {\n return\n }\n\n try {\n const product = await getProduct(sku)\n\n this.renderSkuQuickView(product)\n trackComponentInteraction({\n creative: this.props.campaign?.creative,\n actionType: 'pdp quick view',\n internationalId: product.internationalId,\n internationalName: product.internationalName,\n productType: product.type,\n technology: getTechnologyName(product),\n category: product.category,\n rawPrice: product.price,\n eventAction: 'PDP Quick View'\n })\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: this.popinId } })\n } catch (e) {\n console.error(`getProduct fail on sku ${sku}`)\n }\n return false\n }\n\n bindEvent() {\n this.unbindEvent()\n const showQuickView = this.props.quick_view_plp?.show_view\n const quickViewTextExists = this.props.quick_view_plp?.quick_view_text\n\n if (!quickViewTextExists) {\n this.classList.add('sku-hover')\n }\n\n if (showQuickView && this.props.variation === VARIATION_PLP) {\n const elements = quickViewTextExists ? this.querySelectorAll('nb-link button') : [this]\n\n elements.forEach(element => {\n element.addEventListener('click', this.clickMethod)\n })\n\n // to avoid adding click event to the button inside the sku card\n this.addStopPropagationEvent('nb-add-to-cart')\n this.addStopPropagationEvent('nb-cta')\n }\n }\n\n unbindEvent() {\n const showQuickView = this.props.quick_view_plp?.show_view\n const quickViewTextExists = this.props.quick_view_plp?.quick_view_text\n\n if (showQuickView && this.props.variation === VARIATION_PLP) {\n const elements = quickViewTextExists ? this.querySelectorAll('nb-link button') : [this]\n\n elements.forEach(element => {\n element.removeEventListener('click', this.clickMethod)\n })\n\n this.removeStopPropagationEvent('nb-add-to-cart')\n this.removeStopPropagationEvent('nb-cta')\n }\n }\n\n addStopPropagationEvent(selector) {\n const element = this.querySelector(selector)\n if (element) {\n element.addEventListener('click', this.stopPropagationHandler)\n }\n }\n\n removeStopPropagationEvent(selector) {\n const element = this.querySelector(selector)\n if (element) {\n element.removeEventListener('click', this.stopPropagationHandler)\n }\n }\n\n stopPropagationHandler(event) {\n event.stopPropagation()\n }\n\n disconnectedCallback() {\n this.unbindEvent()\n }\n}\n\ncustomElements.get('nb-sku') || customElements.define('nb-sku', Sku)\n\nexport default Sku\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { VARIATION_PDP, VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { ECAPI_TYPE_CAPSULE } from '@kissui/helpers/src/catalog'\n\nexport const setCardTheme = ({ variation, type }, component) => {\n // PDP\n if (variation === VARIATION_PDP) {\n component.setAttribute('pdp', 'true') // Used by CSS to increase font-size, etc.\n }\n\n // COFFEE on PLP on MOBILE\n if (variation === VARIATION_PLP && type === ECAPI_TYPE_CAPSULE && viewportHelper.is.mobile) {\n component.setAttribute('landscape', 'true')\n return\n }\n\n component.setAttribute('portrait', 'true')\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\n/**\n * Display labels\n * @param {Object[]} labels - List of labels\n * @param {string} labels[].name - Text\n * @param {string} labels[].bgColor - Background\n * @param {string} labels[].color - Font color\n * @param {HTMLElement} component - Apply css on component\n * @returns {String} - Render of labels\n */\nexport const renderLabels = ({ labels = [] }, component = null) => {\n if (!component || !labels || !labels.length) {\n return ''\n }\n\n if (component && labels.length) {\n component.classList.add('has-labels')\n }\n\n const direction = viewportHelper.is.mobile ? 'row' : 'column'\n const data = stringifyForAttribute({ labels })\n\n return `<nb-card-labels data=\"${data}\" direction=\"${direction}\"></nb-card-labels>`\n}\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nexport const renderLogos = (props, component) => {\n const {\n fair_trade,\n alt_fair_trade,\n is_organic,\n alt_organic,\n only_vertuo_next,\n alt_vertuo_next,\n is_rainforest,\n alt_rainforest,\n is_sustainable,\n alt_sustainable,\n is_q_certified_arabica,\n alt_q_certification_arabica,\n logos\n } = props\n\n if (\n !fair_trade &&\n !is_organic &&\n !only_vertuo_next &&\n !is_rainforest &&\n !is_sustainable &&\n !is_q_certified_arabica &&\n (logos == null || logos.length < 1)\n ) {\n return ''\n }\n\n component.classList.add('has-logos')\n\n const data = {\n fair_trade,\n alt_fair_trade,\n is_organic,\n alt_organic,\n only_vertuo_next,\n alt_vertuo_next,\n is_rainforest,\n alt_rainforest,\n is_sustainable,\n alt_sustainable,\n is_q_certified_arabica,\n alt_q_certification_arabica,\n logos\n }\n return `<nb-card-logos data='${stringifyForAttribute(data)}'></nb-card-logos>`\n}\n","import './image.scss'\n\nexport const renderImage = (\n { url, image_alt_text, image, quick_view_plp = {} },\n theme = 'portrait'\n) => {\n if (!image) {\n return ''\n }\n\n let img = `<nb-img file=\"${image}\"\n description=\"${image_alt_text}\"\n aspect_ratio=\"${theme === 'portrait' ? '16/9' : '1/1'}\"\n object_fit=\"contain\"\n force_height=\"${theme === 'portrait' ? '160' : '120'}\">\n </nb-img>`\n\n const renderClass = url ? '' : 'class=\"cursor-default\"'\n\n if (url || quick_view_plp?.show_view) {\n const linkHref = url || 'javascript:void(0)'\n img = `<a ${renderClass.trim()} href=\"${linkHref}\" target=\"_self\" aria-hidden=\"true\" tabindex=\"-1\">${img}</a>`\n }\n\n return `<div class=\"cb-image\">\n ${img}\n </div>`\n}\n","export const renderLabelTechnology = ({ label_technology }) => {\n if (!label_technology) {\n return ''\n }\n\n return `<p class=\"cb-technology t-xs-700-sl\">${label_technology}</p>`\n}\n","export const renderLabelRange = ({ label_range }) => {\n if (!label_range) {\n return ''\n }\n\n return `<p class=\"cb-range t-xs-500-sl\">${label_range}</p>`\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nexport const renderHeadline = ({ headline = '', is_headline_hidden = false }) => {\n if ((is_headline_hidden && viewportHelper.is.mobile) || !headline) {\n return ''\n }\n\n return `<p class=\"cb-text t-sm-400-sl\">${headline}</p>`\n}\n","import { getTechnologyName } from '@kissui/helpers/src/catalog'\n\nexport const renderQuickView = ({\n sku,\n quick_view,\n tracking_list,\n tracking_position,\n campaign_creative,\n internationalId,\n internationalName,\n type,\n technologies,\n category,\n rawPrice,\n colors\n}) => {\n if (!quick_view || !quick_view.label || !quick_view.popin_id) {\n return ''\n }\n\n const skuData = JSON.stringify({\n internationalId: internationalId,\n internationalName: internationalName,\n type: type,\n technology: getTechnologyName({ technologies }),\n category: category,\n rawPrice: rawPrice\n })\n let colorsSkusList = []\n if (typeof colors !== 'undefined') {\n colors.map(color => {\n colorsSkusList.push(color.sku)\n })\n }\n\n return `<nb-link\n color=\"gold\"\n size=\"large\"\n sku_colors=\"${colorsSkusList}\"\n popin_id=\"${quick_view.popin_id}\"\n sku='${sku}'\n sku_data='${skuData}'\n campaign_creative='${campaign_creative}'\n tracking_list='${tracking_list}'\n tracking_position='${tracking_position}'>${quick_view.label}</nb-link>`\n}\n","import { ECAPI_TYPE_CAPSULE } from '@kissui/helpers/src/catalog'\nexport const renderPrice = ({\n price,\n hidePrice,\n giftcard_price,\n price_per_capsule,\n show_sleeve_price,\n type\n}) => {\n if ((!price && !giftcard_price) || hidePrice) {\n return ''\n }\n let finalPrice = null\n if (!show_sleeve_price && price_per_capsule) {\n finalPrice = price_per_capsule\n } else {\n finalPrice = price\n }\n if (type !== ECAPI_TYPE_CAPSULE) {\n finalPrice = price\n }\n\n return `<p class=\"cb-price-current\"><span>${finalPrice || giftcard_price}</span></p>`\n}\n","import Sku from '@kissui/components/src/sku'\n\nclass SkuAccessory extends Sku {\n constructor() {\n super()\n this.type = 'accessory'\n }\n}\n\ncustomElements.get('nb-sku-accessory') || customElements.define('nb-sku-accessory', SkuAccessory)\n\nexport default SkuAccessory\n","class EventBus {\n constructor() {\n this._bus = document.createElement('div')\n }\n\n register(event, callback) {\n this._bus.addEventListener(event, callback)\n }\n\n remove(event, callback) {\n this._bus.removeEventListener(event, callback)\n }\n\n fire(event, detail = {}) {\n this._bus.dispatchEvent(new CustomEvent(event, { detail }))\n }\n}\n\nif (!bus) {\n var bus = new EventBus()\n}\n\nexport default bus\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport EventBus from '@kissui/helpers/src/assets/js/eventBus'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport {\n handlePromoClick,\n productImpression,\n trackComponentInteraction\n} from '@kissui/helpers/src/gtmEvents'\nimport { EVENT_POPIN_OPEN, EVENT_QS_OPEN, TIME_SLOW } from '@kissui/components'\nimport { getLangCode, getMarketCode } from '@kissui/helpers/src/dataLayer'\n\nclass Cta extends HTMLElement {\n constructor() {\n super()\n this.props = {}\n this.market = getMarketCode()\n this.language = getLangCode()\n }\n\n static get observedAttributes() {\n return ['slot', 'quantity']\n }\n\n connectedCallback() {\n this.props = {\n ...createProps(this.attributes),\n disableTracking: this.hasAttribute('data-disabletracking')\n }\n\n this.boundHandleClick = this.handleClick.bind(this)\n this.slot = this.innerHTML.replace(/\\n*$/, '').trim()\n this.render()\n }\n\n render() {\n const {\n add_to_cart = '',\n aria_label,\n aria_label_after,\n aria_label_before,\n contrast,\n icon_left = '',\n icon_right = '',\n label_update,\n label,\n link_new_tab = false,\n long_sku = '',\n seo_label = '',\n size = '48',\n tracking_list = '',\n tracking_position = '',\n transparent = 'false',\n variation\n } = this.props\n let { link } = this.props\n\n const slot = this.slot ? this.slot : label\n\n const element = document.createElement(link ? 'a' : 'button')\n\n if (tracking_position && tracking_list && long_sku) {\n productImpression(tracking_position, tracking_list, long_sku)\n }\n\n if (link) {\n link = link.replace('{market}', this.market)\n link = link.replace('{lang}', this.language)\n\n element.setAttribute('href', link)\n }\n\n if (link && link_new_tab) {\n element.setAttribute('target', '_blank')\n }\n // Todo : can we get rid of this title attr ? at least when it's a button, not a link ?\n if (seo_label && link) {\n element.setAttribute('title', seo_label)\n }\n\n if (aria_label) {\n element.setAttribute('aria-label', aria_label)\n } else if (aria_label_before || aria_label_after) {\n const ariaLabel = [aria_label_before, slot, aria_label_after]\n .filter(value => !!value)\n .join(' ')\n ariaLabel && element.setAttribute('aria-label', ariaLabel)\n }\n\n if (variation !== 'navigation') {\n element.classList.add(`button--cta`)\n }\n element.classList.add(`button--${variation}`)\n if (contrast) {\n if (transparent === 'true') {\n element.classList.add(`button--${contrast}--transparent`)\n } else {\n element.classList.add(`button--${contrast}`)\n }\n }\n if (size) {\n let textClass = 't-md-400-sl'\n switch (size) {\n case '32':\n textClass = 't-xs-500-sl'\n break\n case '40':\n textClass = 't-sm-400-sl'\n break\n }\n element.classList.add(`size--${size}`, textClass)\n }\n\n if ((variation === 'primary' || variation === 'tertiary') && add_to_cart !== '') {\n this.setAttribute('add_to_cart', add_to_cart)\n this.setAttribute('quantity', '0')\n add_to_cart === 'small'\n ? element.classList.add('addToCart--small')\n : element.classList.add('addToCart--large')\n }\n\n icon_left && this.setAttribute('icon_left', icon_left)\n icon_right && this.setAttribute('icon_right', icon_right)\n\n element.innerHTML = `\n ${icon_left && `<nb-icon icon='${icon_left}'></nb-icon>`}\n <span>${slot}</span>\n ${\n variation === 'primary' && add_to_cart !== '' && label_update !== ''\n ? `<span class=\"update\">${label_update}</span>`\n : ''\n }\n ${icon_right && `<nb-icon icon='${icon_right}'></nb-icon>`}\n `\n this.innerHTML = element.outerHTML\n\n this.removeListeners()\n this.addListeners()\n }\n\n handleClick() {\n if (this.props.disableTracking === false) {\n this.track()\n }\n\n const { event_id = '', popin_id = '', qs_id = '' } = this.props\n\n if (event_id) {\n EventBus.fire(event_id, {})\n }\n if (popin_id) {\n this.popin(popin_id)\n }\n if (qs_id) {\n this.openQuantitySelector(qs_id)\n }\n }\n\n popin(popin_id) {\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: popin_id } })\n }\n\n openQuantitySelector(qs_id) {\n dispatchEvent({ eventName: EVENT_QS_OPEN, args: { id: qs_id } })\n }\n\n track() {\n const {\n campaign_id = '',\n campaign_name = '',\n campaign_position = '',\n campaign_creative = '',\n campaign_instance_index = '',\n tracking_list,\n label,\n popin_id = '',\n tracking_slot_prefix = '',\n sku_data = ''\n } = this.props\n\n const campaign = {\n id: campaign_id,\n name: campaign_name,\n position: campaign_position,\n creative: campaign_creative\n }\n\n const ctaOrPopin = popin_id ? 'POPIN' : 'CTA'\n const slot = this.slot ? this.slot : label\n const slotContent = `${tracking_slot_prefix}${slot}`\n const instanceIndex = campaign_instance_index ? ` - ${campaign_instance_index}` : ''\n const tabbedComponentStatus = JSON.parse(this.props?.tabbed_component ?? 'false')\n\n let cta_name_value = tabbedComponentStatus\n ? `${ctaOrPopin + instanceIndex} - ${\n this.props.long_sku.split('/')[2]\n } - ${slotContent}`\n : `${ctaOrPopin + instanceIndex} - ${slotContent}`\n\n handlePromoClick({\n campaign,\n cta_name: cta_name_value\n })\n\n if (popin_id && sku_data) {\n const product = JSON.parse(sku_data)\n const componentName =\n tracking_list.indexOf(' - ') > -1 ? tracking_list.split(' - ')[0] : tracking_list\n trackComponentInteraction({\n creative: this.props.campaign_creative ?? '',\n actionType: componentName.toLowerCase() + ' quick view',\n internationalId: product.internationalId,\n internationalName: product.internationalName,\n productType: product.type,\n technology: product.technology,\n category: product.category,\n rawPrice: product.rawPrice,\n eventAction: componentName + ' Quick View'\n })\n }\n }\n\n attributeChangedCallback(name) {\n if (name === 'slot') {\n this.render()\n }\n if (name === 'quantity') {\n this.classList.add('updated')\n setTimeout(() => {\n this.classList.remove('updated')\n }, TIME_SLOW)\n }\n }\n\n addListeners() {\n this.addEventListener('click', this.boundHandleClick)\n }\n\n removeListeners() {\n this.removeEventListener('click', this.boundHandleClick)\n }\n\n disconnectedCallback() {\n this.removeListeners()\n }\n}\n\ncustomElements.get('nb-cta') || customElements.define('nb-cta', Cta)\n\nexport default Cta\n","/**\n * We removed duplicated values to improve the performances\n * Here are original values :\n * small: 16, 24, 32, 36, 48, 64, 72, 96, 108, 120, 128, 144, 150, 180, 192, 216, 225, 240, 288, 300, 360, 384, 450, 480, 600\n * medium: 180, 240, 270, 360, 450, 480, 512, 540, 600, 675, 720, 768, 800, 900, 960, 1000, 1024, 1080, 1200, 1350, 1440, 1500, 1536, 1600, 1800, 2000, 2048, 2400, 3000, 3200, 4000\n * large: 640, 720, 800, 960, 1024, 1080, 1200, 1280, 1440, 1536, 1600, 1920, 2048, 2160, 2400, 2560, 2880, 3072, 3200, 3840, 4096\n * product: 45, 50, 58, 60, 65, 90, 100, 120, 130, 135, 150, 174, 180, 195, 200, 230, 232, 240, 260, 300, 360, 400, 450, 460, 480, 600, 690, 720, 800, 900, 960, 1200\n *\n * Useful documentation:\n * IT documentation on IM Policy (Image Manager Policy) profiles and resolutions: https://dsu-confluence.nestle.biz/x/XAYoC\n * Our IM Policy documentation: https://dsu-confluence.nestle.biz/x/zQjrCg\n * Our IM Policy study on page builder sections: https://dsu-confluence.nestle.biz/x/1tb3Cg\n */\n\nexport const LAZYLOAD_CUSTOM = 'custom'\nexport const LAZYLOAD_NATIVE = 'native'\n\nexport const PROFILES = [\n {\n name: 'small',\n sizes: [\n 16, 24, 32, 36, 48, 64, 72, 96, 108, 120, 128, 144, 150, 180, 192, 216, 225, 240, 288,\n 300, 360, 384, 450, 480, 600\n ]\n },\n {\n name: 'medium',\n sizes: [\n 270, 512, 540, 675, 720, 768, 800, 900, 960, 1000, 1024, 1080, 1200, 1350, 1440, 1500,\n 1536, 1600, 1800, 2000, 2048, 2400, 3000, 3200, 4000\n ]\n },\n {\n name: 'large',\n sizes: [640, 1280, 1920, 2160, 2560, 2880, 3072, 3840, 4096]\n },\n {\n name: 'product',\n sizes: [\n 45, 50, 58, 60, 65, 90, 100, 130, 135, 174, 195, 200, 230, 232, 260, 300, 400, 460, 690\n ]\n }\n]\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { lazyLoad } from '@kissui/helpers/src/utils'\nimport { PROFILES, LAZYLOAD_CUSTOM, LAZYLOAD_NATIVE } from './js/constants'\n\n/** IMAGE COMPONENT\n * Important prerequisite!\n * For the ImPolicy and CLS we need to assume that the width of the component is set by the parent component\n *\n * IM Policy annoying behaviour:\n * Also IM Policy is returning in some cases more than 2x images (based in device pixel density auto detection e.g. Iphone 11 pro returns x3)\n * We don't want this behaviour so we need to force x1 by adding an extra param &imdensity=1\n *\n * @Params\n * - file: path of your image\n * - description: img alt description. If empty, set alt='image' to avoid A11y errors + aria-hidden=\"true\" because we assume it's a decorative image\n * (we don't use alt='' because if void it does not allow the error message to be displayed, not creating :before and :after pseudo element on img)\n * - aspect_ratio: (default 1:1) is managing the CLS including a blinking animation\n * - force_width: use this if for any reason you need to force the image width to ask to akamai (e.g. image cropped on both sides like in card-lifestyle tablet)\n * - force_height: use this if in the layout you cannot rely on width but in height\n * - lazyload: (default custom / native / no) is managing fadein animation + error message\n * - impolicy: (default true) is checking automatically the right profile and 'real' end resolution\n * - placeholder_color_light: (default black_100) is the lighter color for CLS animation\n * - placeholder_color_dark: (default black_250) is the darker color for CLS animation\n * - object-fit: (default: cover) use 'contain' instead (applys object-fit: contain on img) if you want to image to be displayed always fully\n * like in sku component, where the product image have different original aspect_ratio, we want to display always the full product\n */\n\nclass Img extends HTMLElement {\n constructor() {\n super()\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n this.#initLazyLoad()\n }\n\n #initLazyLoad() {\n if (this.lazyload !== LAZYLOAD_CUSTOM) {\n return\n }\n const callbackSuccess = () => {\n this.classList.remove('loading')\n }\n\n lazyLoad(this.firstElementChild, 'src', `${this.file}`, this.file, { callbackSuccess })\n }\n\n render() {\n const {\n file = '',\n description = '',\n lazyload = LAZYLOAD_CUSTOM,\n fetchpriority = ''\n } = this.props\n\n if (file === '') {\n return\n }\n\n // Set properties used elsewhere in component\n this.lazyload = lazyload\n this.file = file + this.#setImPolicyQuery()\n\n this.#setCssProperties()\n this.classList.add('nb-img')\n this.innerHTML = `\n <img\n ${this.lazyload === LAZYLOAD_CUSTOM ? 'src=\"\"' : `src=\"${this.file}\"`}\n ${description !== '' ? `alt=\"${description}\"` : 'alt=\"image\" aria-hidden=\"true\"'}\n ${this.lazyload === LAZYLOAD_NATIVE ? 'loading=\"lazy\"' : ''}\n ${fetchpriority !== '' ? `fetchpriority=${fetchpriority}` : ''}\n class=\"loading\"\n />`\n // Get this element's first class\n this.parentClass = this.getAttribute('class').split(' ')[0]\n\n // Add that previous class + a suffix to its first child\n if (this.parentClass !== '') {\n this.firstElementChild.classList.add(this.parentClass + '-content')\n }\n }\n\n #setImPolicyQuery() {\n const { aspect_ratio, force_width, force_height, impolicy = true } = this.props\n\n if (impolicy === 'false') {\n return ''\n }\n\n let width = this.offsetWidth\n\n if (force_width && force_width !== '') {\n width = Number(force_width)\n }\n\n if (force_height && force_height !== '') {\n const [w, h] = aspect_ratio.split('/')\n width = Math.round((Number(force_height) * w) / h)\n }\n\n let finalWidth = this.#getRetinaWidth(width)\n\n const impolicy_profil = this.#getImpolicyProfile(finalWidth)\n\n return `?impolicy=${impolicy_profil}&imwidth=${finalWidth}&imdensity=1`\n }\n\n #getRetinaWidth(width) {\n const { devicePixelRatio } = window\n return devicePixelRatio > 1 ? width * 2 : width\n }\n\n #getImpolicyProfile(width) {\n const { exactFound, closests } = this.#getClosests(width)\n\n if (exactFound) {\n return exactFound.name\n } else {\n let tempDiff = closests[0].diff\n let closest = null\n closests.forEach(item => {\n if (item.diff <= tempDiff) {\n tempDiff = item.diff\n closest = item\n }\n })\n return closest.name\n }\n }\n\n #getClosests(width) {\n let exactFound = null\n let closests = []\n PROFILES.every(profile => {\n const found = profile.sizes.find(el => el >= width)\n\n if (found) {\n if (found === width) {\n exactFound = profile\n return false\n }\n\n closests.push({ name: profile.name, diff: found - width })\n }\n\n return true\n })\n return { exactFound, closests }\n }\n\n #setCssProperties() {\n const {\n aspect_ratio,\n object_fit,\n placeholder_color_light,\n placeholder_color_dark,\n error_message\n } = this.props\n\n this.#setCssProperty('--image-aspect-ratio', aspect_ratio)\n this.#setCssProperty('--image-object-fit', object_fit)\n this.#setCssProperty('--image-placeholder-color-light', placeholder_color_light)\n this.#setCssProperty('--image-placeholder-color-dark', placeholder_color_dark)\n this.#setCssProperty('--image-placeholder-error-text', '\"' + error_message + '\"')\n }\n\n #setCssProperty(name, value) {\n if (!value || value === '\"undefined\"') {\n return\n }\n\n this.style.setProperty(name, value)\n }\n}\n\ncustomElements.get('nb-img') || customElements.define('nb-img', Img)\n\nexport default Img\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport {\n handlePromoClick,\n productClick,\n trackComponentInteraction\n} from '@kissui/helpers/src/gtmEvents'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_POPIN_OPEN, EVENT_QUICKVIEW_OPEN } from '../constants.mjs'\nimport { getLangCode, getMarketCode } from '@kissui/helpers/src/dataLayer'\n\nclass Link extends HTMLElement {\n constructor() {\n super()\n this.slot = this.innerHTML\n this.boundHandleClick = this.handleClick.bind(this)\n this.market = getMarketCode()\n this.language = getLangCode()\n }\n\n connectedCallback() {\n this.props = {\n ...createProps(this.attributes),\n disableTracking: this.hasAttribute('data-disabletracking')\n }\n this.render()\n this.setClassHelper()\n this.bindEvents()\n }\n\n render() {\n const {\n size = 'large',\n color = 'gold',\n link = '',\n icon_right = '',\n icon_left = '',\n image = '',\n image_alt = ''\n } = this.props\n\n // Todo : can we get rid of this setAttributes, it's only needed because stories are using data\n size && this.setAttribute('size', size)\n color && this.setAttribute('color', color)\n image && this.setAttribute('image', image)\n image_alt && this.setAttribute('image_alt', image_alt)\n icon_left && this.setAttribute('icon_left', icon_left)\n icon_right && this.setAttribute('icon_right', icon_right)\n\n if (link === '') {\n this.renderButton()\n } else {\n this.renderLink()\n }\n\n this.link = this.firstElementChild\n }\n\n renderLink() {\n const {\n label,\n seo_label = '',\n tracking_label = '',\n link_new_tab = 'false',\n a11y_label_new_tab = '',\n icon_right = '',\n image = '',\n image_alt = '',\n icon_left = '',\n selected = '',\n phantom = ''\n } = this.props\n let { link } = this.props\n\n const slot = this.slot ? this.slot : label\n\n if (link) {\n link = link.replace('{market}', this.market)\n link = link.replace('{lang}', this.language)\n }\n\n this.innerHTML = `\n <a\n href=\"${link}\"\n ${link_new_tab === 'true' ? 'target=\"_blank\"' : ''}\n ${\n link_new_tab === 'true' && a11y_label_new_tab !== ''\n ? `aria-description='${a11y_label_new_tab}'`\n : ''\n }\n ${tracking_label && `tracking_label='${tracking_label}'`}\n ${seo_label ? `title=\"${seo_label}\"` : ''}\n ${slot ? `aria-label=\"${slot}\"` : ''}\n ${selected === 'true' ? 'aria-current=\"true\"' : ''}\n ${phantom === 'true' ? `phantom=\"${slot}\"` : ''}\n >\n ${icon_left && `<nb-icon icon='${icon_left}'></nb-icon>`}\n ${image && `<img src='${image}' alt='${image_alt}'/>`}\n <span>${slot}</span>\n ${icon_right && `<nb-icon icon='${icon_right}'></nb-icon>`}\n </a>`\n }\n\n renderButton() {\n const {\n label,\n tracking_label = '',\n icon_right = '',\n icon_left = '',\n selected = '',\n image = '',\n image_alt = '',\n phantom = ''\n } = this.props\n\n const slot = this.slot ? this.slot : label\n\n this.innerHTML = `\n <button\n ${tracking_label && `tracking_label='${tracking_label}'`}\n ${selected === 'true' ? 'aria-selected=\"true\"' : ''}\n ${phantom === 'true' ? `phantom=\"${slot}\"` : ''}\n >\n ${image && `<img src='${image}' alt='${image_alt}'/>`}\n ${icon_left && `<nb-icon icon='${icon_left}'></nb-icon>`}\n <span>${slot}</span>\n ${icon_right && `<nb-icon icon='${icon_right}'></nb-icon>`}\n </button>`\n }\n\n setClassHelper() {\n const { size = 'large', cta_link_type = 'false' } = this.props\n let sizeClass = ''\n\n switch (size) {\n case 'xsmall':\n sizeClass = 't-2xs-500-sl'\n break\n case 'small':\n sizeClass = 't-xs-500-sl'\n break\n case 'medium':\n sizeClass = 't-sm-400-sl'\n break\n case 'large':\n sizeClass = 't-sm-700-sl'\n break\n default:\n sizeClass = 't-sm-700-sl'\n break\n }\n\n if (cta_link_type === 'true') {\n sizeClass = 't-sm-700-sl'\n this.setAttribute('underline', 'false')\n }\n\n this.querySelector('a, button').classList.add(sizeClass)\n }\n\n handleClick() {\n if (this.props.disableTracking === false) {\n this.track()\n }\n\n const {\n popin_id = '',\n sku = '',\n tracking_position = '',\n tracking_list = '',\n sku_colors\n } = this.props\n\n if (popin_id && sku) {\n this.quickView(popin_id, sku, tracking_position, tracking_list, sku_colors)\n return\n }\n\n if (popin_id) {\n this.popin(popin_id)\n }\n }\n\n popin(popin_id) {\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: popin_id } })\n }\n\n quickView(popin_id, sku, tracking_position, tracking_list, colors) {\n const { sku_data } = this.props\n\n dispatchEvent({\n eventName: EVENT_QUICKVIEW_OPEN,\n args: {\n sku_colors: colors,\n id: popin_id,\n sku: sku,\n tracking_position: tracking_position,\n tracking_list: tracking_list\n }\n })\n\n if (sku_data) {\n const product = JSON.parse(sku_data)\n const componentName =\n tracking_list.indexOf(' - ') > -1 ? tracking_list.split(' - ')[0] : tracking_list\n trackComponentInteraction({\n creative: this.props.campaign_creative ?? '',\n actionType: componentName.toLowerCase() + ' quick view',\n internationalId: product.internationalId,\n internationalName: product.internationalName,\n productType: product.type,\n technology: product.technology,\n category: product.category,\n rawPrice: product.rawPrice,\n eventAction: componentName + ' Quick View'\n })\n }\n }\n\n track() {\n const {\n campaign_id = '',\n campaign_name = '',\n campaign_position = '',\n campaign_creative = '',\n campaign_instance_index = '',\n label,\n popin_id = '',\n long_sku = '',\n tracking_list = '',\n tracking_position = ''\n } = this.props\n\n const campaign = {\n id: campaign_id,\n name: campaign_name,\n position: campaign_position,\n creative: campaign_creative\n }\n\n const linkOrPopin = popin_id ? 'POPIN' : 'LINK'\n const slot = this.slot ? this.slot : label\n // value 0 is accepted as we need to pass the index\n const instanceIndex =\n campaign_instance_index || campaign_instance_index === 0\n ? ` - ${campaign_instance_index}`\n : ''\n\n if (tracking_list && tracking_position) {\n productClick(tracking_position, tracking_list, long_sku)\n } else {\n handlePromoClick({\n campaign,\n cta_name: `${linkOrPopin + instanceIndex} - ${slot.trim()}`\n })\n }\n }\n\n bindEvents() {\n this.unbindEvents()\n this.link.addEventListener('click', this.boundHandleClick)\n }\n\n unbindEvents() {\n this.link.removeEventListener('click', this.boundHandleClick)\n }\n\n disconnectedCallback() {\n this.unbindEvents()\n }\n}\n\ncustomElements.get('nb-link') || customElements.define('nb-link', Link)\n\nexport default Link\n","import { viewPromotion } from '@kissui/helpers/src/gtmEvents'\n\nexport default class {\n constructor(node, data) {\n this.observer = new IntersectionObserver(\n IntersectionObserverEntry => this.onChange(IntersectionObserverEntry),\n { threshold: [0], rootMargin: '0% 0%' }\n )\n\n this.el = node\n this.data = data\n\n if (!(this.el instanceof Element)) {\n return\n }\n\n this.observer.observe(this.el)\n }\n\n /**\n * Check if element are in the viewport\n * @param {Array} observables\n * @param {HTMLElement} observables.target\n * @param {Boolean} observables.isIntersecting\n */\n onChange(observables) {\n observables.forEach(observable => {\n if (!observable.isIntersecting) {\n return\n }\n\n this.track(observable)\n this.observer.unobserve(observable.target)\n })\n }\n\n track() {\n // This line is needed to make the code compatible with Safari <=13\n if ('requestIdleCallback' in window) {\n window.requestIdleCallback(() => this.runTrack())\n } else {\n window.setTimeout(() => this.runTrack(), 1)\n }\n }\n\n runTrack() {\n if (!this.data['id'] || this.data['id'] === null || this.data['id'] === '') {\n return\n }\n viewPromotion({ ...this.data })\n }\n}\n","import Viewport from './viewportTracking'\nimport { viewPromotion } from '@kissui/helpers/src/gtmEvents'\nimport { isObjectEmpty, removeEmptyValues } from '@kissui/helpers/src/utils'\n\nexport default function (node, campaign) {\n const tracking = new ZoneTracking(node, campaign)\n\n return {\n destroy: () => {\n if (!tracking.getIom().hasIntersectionObserver()) {\n tracking.destroy()\n }\n }\n }\n}\n\nclass ZoneTracking extends Viewport {\n constructor(node, data) {\n super(node)\n this.data = data\n }\n\n runTrack() {\n const cleanedData = removeEmptyValues(this.data)\n if (cleanedData && !isObjectEmpty(cleanedData)) {\n viewPromotion({ ...cleanedData })\n }\n }\n}\n","import zoneTracking from '@kissui/helpers/src/assets/js/zoneTracking'\nimport { lazyLoad } from '@kissui/helpers/src/utils'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\nclass Container extends HTMLElement {\n constructor() {\n super()\n this.slot = this.innerHTML\n }\n\n connectedCallback() {\n this.props = [...this.attributes].reduce((all, attr) => {\n return { ...all, [attr.nodeName]: attr.nodeValue }\n }, {})\n this.render()\n this.initTracking()\n this.initLazyLoad()\n }\n\n initTracking() {\n const {\n campaign_id = null,\n campaign_name = null,\n campaign_position = null,\n campaign_creative = null\n } = this.props\n zoneTracking(this, {\n id: campaign_id,\n name: campaign_name,\n position: campaign_position,\n creative: campaign_creative\n })\n }\n\n initLazyLoad() {\n const el = this.querySelector('.cb-bg-img')\n if (!el) {\n return\n }\n\n const url = this.getBgImgUrl()\n if (!url) {\n return\n }\n\n const { lazy_load } = this.props\n if (lazy_load === 'false') {\n el.setAttribute('style', `background-image: url(${url})`)\n return\n }\n\n lazyLoad(\n el,\n 'style',\n `background-image: url(${url}); ${el.getAttribute('style') || ''}`,\n url\n )\n }\n\n getBgImgUrl() {\n const {\n background_mobile = '',\n background_tablet = '',\n background_desktop = '',\n background_retina = ''\n } = this.props\n\n let url = ''\n if (viewportHelper.is.mobile && background_mobile) {\n url = background_mobile\n } else if (viewportHelper.is.tablet && background_tablet) {\n url = background_tablet\n } else if ((viewportHelper.is.retina || viewportHelper.is.tablet) && background_retina) {\n url = background_retina\n } else if (\n (viewportHelper.is.desktop || viewportHelper.is.retina || viewportHelper.is.tablet) &&\n background_desktop\n ) {\n url = background_desktop\n }\n\n return url\n }\n\n render() {\n const {\n styles = '',\n contrast,\n background_color = '',\n classname = '',\n element_class = '',\n slot\n } = this.props\n\n // Fix for undefined contrast (contrast is needed for background-color to work)\n let contrastDefault = 'light'\n if (contrast === 'undefined') {\n this.setAttribute('contrast', contrastDefault)\n } else {\n contrastDefault = contrast\n }\n\n this.innerHTML = `\n <section\n class=\"${classname}\"\n contrast=\"${contrastDefault}\"\n style=\"${styles}\"\n >\n ${background_color || this.hasBgImage() ? this.renderBg() : ''}\n <div class=\"cb-inner ${element_class}\">\n ${slot}\n </div>\n </section>`\n }\n\n hasBgImage() {\n const { background_mobile: m, background_desktop: d, background_retina: r } = this.props\n return !!m || !!d || !!r\n }\n\n renderBg() {\n const { background_color = '' } = this.props\n\n return `<div class=\"cb-bg-color ${background_color ? background_color : ''}\">\n </div>${this.hasBgImage() ? '<div class=\"cb-bg-img\"></div>' : ''}`\n }\n}\n\ncustomElements.get('nb-container') || customElements.define('nb-container', Container)\n\nexport default Container\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { makeHash } from '@kissui/helpers/src/utils'\nimport { selectPromotion } from '@kissui/helpers/src/gtmEvents'\n\nclass Chip extends HTMLElement {\n constructor() {\n super()\n this.slot = this.innerHTML\n this.checkbox = null\n }\n\n static get observedAttributes() {\n return ['disabled', 'checked']\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.computedSlot = this.computeSlot()\n this.render()\n this.initTracking()\n }\n\n initTracking() {\n const { campaign_id, campaign_name, campaign_creative, campaign_position } = this.props\n\n const link = this.querySelector('label')\n\n if (link) {\n link.onclick = () => {\n selectPromotion({\n cta_name: this.computedSlot,\n id: campaign_id,\n name: campaign_name,\n creative: campaign_creative,\n position: campaign_position\n })\n }\n }\n }\n\n computeSlot() {\n const { content } = this.props\n return (this.slot ? this.slot : content).trim()\n }\n\n render() {\n const {\n icon = '',\n color = '',\n background_image = '',\n filter_label_AA = 'filter',\n rounded = 'true',\n checked = 'false',\n disabled = 'false',\n id,\n type = 'checkbox'\n } = this.props\n\n const slot = this.computedSlot\n let style = ''\n\n const checkedAttr = checked === 'true' ? 'checked' : ''\n const disabledAttr = disabled === 'true' ? 'disabled' : ''\n const inputId = 'chip-checkbox-' + (id || makeHash(slot))\n\n this.innerHTML = `\n <input type='${type}' name='options' id='${inputId}' aria-label='${slot} ${filter_label_AA}' ${checkedAttr} ${disabledAttr}>\n <label style='${style}' for='${inputId}'>\n ${\n icon &&\n `<nb-icon icon='${icon}'></nb-icon>\n `\n }\n ${\n color &&\n `<div class='chip-color' style='background:${color}'></div>\n `\n }\n ${\n background_image &&\n `<div class='chip-image ${\n rounded === 'true' ? 'rounded' : ''\n }' style='background-image:url(\"${background_image}\")'></div>\n `\n }\n <span class=\"t-2xs-700-sl\" aria-hidden=\"true\" phantom=\"${slot}\">${slot}</span>\n </label>\n `\n\n this.checkbox = this.getElementsByTagName('input')[0]\n }\n\n attributeChangedCallback(name, _, newValue) {\n if (!this.checkbox) {\n return\n }\n\n if (name === 'disabled') {\n this.checkbox.disabled = newValue === 'true'\n } else if (name === 'checked') {\n this.checkbox.checked = newValue === 'true'\n }\n }\n}\n\ncustomElements.get('nb-chip') || customElements.define('nb-chip', Chip)\n\nexport default Chip\n","export function recursiveSwitchAriaHidden(elem, componentOpenState) {\n const parent = elem.parentNode\n const body = document.getElementsByTagName('body')[0]\n\n if (parent === body) {\n return\n }\n\n const brothers = parent.children\n for (const brother of brothers) {\n if (brother !== elem) {\n componentOpenState\n ? brother.setAttribute('aria-hidden', componentOpenState)\n : brother.removeAttribute('aria-hidden')\n }\n }\n recursiveSwitchAriaHidden(parent, componentOpenState)\n}\n\nexport function focusin(e, el, loop) {\n if (!el.contains(e.target)) {\n if (el.lastFocused === el.firstFocusable) {\n loop ? el.lastFocusable.focus() : el.firstFocusable.focus()\n } else {\n loop ? el.firstFocusable.focus() : el.lastFocusable.focus()\n }\n } else {\n el.lastFocused = e.target\n }\n}\n\nexport function setFirstAndLastFocusable(el) {\n const focusable = el.querySelectorAll('button, [href], input, select, textarea, [tabindex=\"0\"]')\n el.firstFocusable = focusable[0]\n el.lastFocusable = focusable[focusable.length - 1]\n el.lastFocused = el.firstFocusable\n}\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport {\n recursiveSwitchAriaHidden,\n setFirstAndLastFocusable,\n focusin\n} from '@kissui/helpers/src/assets/js/scopedKeyboardNav'\nimport { EVENT_SORT_BY_CHANGE, EVENT_POPIN_KEY_DOWN } from '@kissui/components'\n\nclass Dropdown extends HTMLElement {\n constructor() {\n super()\n this.isOpen = false\n this.selected = null\n this.buttonElement = null\n this.onClickOutside = this.onClickOutside.bind(this)\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.classList.add('nb-dropdown')\n this.render()\n }\n\n render() {\n this.buttonElement = null\n const { label = '', aa_description } = this.props\n let { options = [], element_id, element_name } = this.props\n\n // Accept Selected and Checked as option setter\n options = options.map(option => {\n const payload = { ...option }\n payload.checked = payload.checked || payload.selected\n\n return payload\n })\n\n this.unbindEvent()\n\n this.innerHTML = `\n <button\n class='nb-dropdown__button'\n aria-haspopup=\"listbox\"\n aria-expanded=\"${this.isOpen}\"\n aria-label=\"${label} ${options && this.renderSelected()}\"\n ${aa_description !== '' ? `aria-description=\"${aa_description}\"` : ''}>\n <span class=\"nb-dropdown__button__label t-sm-700-sl\">${label}</span>\n <span class=\"nb-dropdown__button__value t-xs-500-sl\"\n ${element_id ? `name=\"${element_id}\"` : ''}\n value=\"${options && this.renderSelected()}\">\n </span>\n </button>\n <div class=\"nb-dropdown__menu\" ${element_name ? `id=\"${element_name}\"` : ''}>\n <div role=\"listbox\">\n <ul>\n ${options && options.length > 0 && this.renderOptions()}\n </ul>\n </div>\n </div>\n `\n this.buttonElement = this.querySelector('.nb-dropdown__button')\n this.buttonElementValue = this.querySelector('.nb-dropdown__button__value')\n this.dropdownMenu = this.querySelector('.nb-dropdown__menu > div')\n this.selectedOption = this.querySelector('button[aria-selected=true]')\n if (!this.selected) {\n this.selected = options[0]\n }\n setFirstAndLastFocusable(this.dropdownMenu)\n this.bindEvent()\n }\n\n // Render <BUTTON> tags for the custom select, <BUTTON> is better than <RADIOBUTTONS> for keyboard navigation users in this case\n renderOptions() {\n const {\n label,\n aa_listbox_description,\n aa_select_description,\n icon_option,\n options = []\n } = this.props\n return options\n .map(option => {\n return `<li>\n <button\n data-id=\"${option.id}\"\n data-selectedlabel=\"${option.label}\"\n class=\"${viewportHelper.is.mobile ? 't-sm-400-sl' : 't-xs-500-sl'}\"\n role=\"option\"\n aria-label='${label + ' ' + option.label}'\n value='${option.id ?? option.label}'\n aria-selected='${option.checked}'\n ${option.link ? `data-link='${option.link}'` : ''}\n ${\n option.checked\n ? aa_listbox_description !== undefined &&\n `aria-description=\"${aa_listbox_description}\"`\n : aa_select_description !== undefined &&\n `aria-description=\"${aa_select_description}\"`\n }>\n ${icon_option && `<nb-icon icon='${icon_option}'></nb-icon>`} ${option.label}\n </button>\n </li>`\n })\n .join('')\n }\n\n // Render the selected option to display in the main button of the PLP Filter Bar\n renderSelected() {\n const { options = [] } = this.props\n const currentOption = options.find(\n option => option.checked === true || option.selected === true\n )\n return `${currentOption?.label || options[0]?.label}`\n }\n\n bindEvent() {\n this.boundHandleClick = this.handleClick.bind(this)\n this.boundHandleLabelClick = this.handleLabelClick.bind(this)\n this.boundHandleMobileClose = this.handleMobileClose.bind(this)\n this.boundFocus = this.focus.bind(this)\n this.boundFocusin = this.focusin.bind(this)\n this.boundKeyNav = this.keyNav.bind(this)\n\n this.buttonElement.addEventListener('click', this.boundHandleClick)\n this.querySelectorAll('.nb-dropdown__menu button').forEach(item => {\n item.addEventListener('click', this.boundHandleLabelClick)\n })\n this.dropdownMenu.addEventListener('click', this.boundHandleMobileClose)\n window.addEventListener('click', this.onClickOutside)\n }\n\n unbindEvent() {\n if (!this.buttonElement) {\n return\n }\n this.buttonElement.removeEventListener('click', this.boundHandleClick)\n this.querySelectorAll('.nb-dropdown__menu button').forEach(item => {\n item.removeEventListener('click', this.boundHandleLabelClick)\n })\n this.dropdownMenu.removeEventListener('click', this.boundHandleMobileClose)\n window.removeEventListener('click', this.onClickOutside)\n document.removeEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNav)\n }\n\n handleClick() {\n this.toogleDropdown(!this.isOpen)\n }\n\n handleMobileClose() {\n this.toogleDropdown(false)\n }\n\n onClickOutside(e) {\n if (this.isOpen && !this.contains(e.target)) {\n this.toogleDropdown(false)\n }\n }\n\n handleLabelClick(e) {\n this.isOpen = false\n\n // Unpress active button\n if (this.selectedOption) {\n this.selectedOption.setAttribute('aria-selected', 'false')\n }\n\n /*\n * TODO CHECK WITH THOMAS\n const activeButton = this.querySelector('button[aria-pressed=true]')\n const activeLink = activeButton.getAttribute('data-link')\n if (activeLink) {\n window.location.href = activeLink\n return null\n }\n activeButton.setAttribute('aria-pressed', 'false')\n * */\n\n // Activate pressed option\n this.selectedOption = e.target\n this.selectedOption.setAttribute('aria-selected', 'true')\n\n // Reset all checked attributes to false / Destroy the object and build it again\n this.props.options = this.props.options.map(option => ({ ...option, checked: false }))\n\n // Get the id from the clicked button's data-id attribute\n const selectedOptionId = this.selectedOption.dataset.id\n\n // Find the option using the selected button's data-id\n this.selected = this.props.options.find(option => option.id === selectedOptionId)\n\n if (!this.selected) {\n // Handle the error as needed maybe set the first item as checked.\n this.selected = this.props.options[0]\n }\n\n this.selected.checked = true\n e.target.closest('.nb-dropdown').classList.add('nb-dropdown--is-filled')\n\n this.reRender()\n\n this.toogleDropdown(false)\n\n dispatchEvent({\n eventName: EVENT_SORT_BY_CHANGE,\n args: { options: this.props.options, selected: this.selected },\n element: this\n })\n }\n\n reRender() {\n const { label, aa_listbox_description, aa_select_description } = this.props\n this.buttonElementValue.setAttribute('value', this.selectedOption.dataset.selectedlabel)\n this.buttonElement.setAttribute('aria-label', label + ' ' + this.renderSelected())\n this.dropdownMenu.querySelectorAll('button').forEach(item => {\n item.setAttribute('aria-description', aa_select_description)\n })\n this.selectedOption.setAttribute('aria-description', aa_listbox_description)\n }\n\n setSelected(value, dispatchChange = false) {\n const { options = [] } = this.props\n const tmpSelected = options.find(option => option.value === value)\n if (tmpSelected) {\n this.selected.checked = false\n this.selected = tmpSelected\n this.selected.checked = true\n }\n\n if (this.selectedOption) {\n this.selectedOption.setAttribute('aria-selected', 'false')\n }\n\n this.dropdownMenu.querySelectorAll('button').forEach(item => {\n if (item.value === this.selected.label) {\n this.selectedOption = item\n this.selectedOption.setAttribute('aria-selected', 'true')\n }\n })\n\n this.classList.add('nb-dropdown--is-filled')\n\n if (this.selectedOption) {\n this.reRender()\n }\n\n if (dispatchChange) {\n dispatchEvent({\n eventName: EVENT_SORT_BY_CHANGE,\n args: { options, selected: this.selected },\n element: this\n })\n }\n }\n\n toogleDropdown(value) {\n value ? this.open() : this.close()\n this.isOpen = !this.isOpen\n\n // Open and Close shared actions\n this.switchAriaModal()\n this.buttonElement.setAttribute('aria-expanded', this.isOpen)\n }\n\n switchAriaModal() {\n // This is the future way to scope the SR focus to a modal, but it's not supported yet by all SR\n this.dropdownMenu.setAttribute('aria-modal', this.isOpen)\n // So we need to set aria-hidden=false to all brothers and brothers of parent until body\n recursiveSwitchAriaHidden(this.dropdownMenu, this.isOpen)\n }\n\n open() {\n // Transitionend listener is fired multiple times (fore each css property)\n // so we need to instanciate it only when we open or close and then we remove it on focusin\n this.dropdownMenu.addEventListener('transitionend', this.boundFocus)\n document.addEventListener('focusin', this.boundFocusin)\n document.addEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNav)\n this.buttonElement.classList.add('isOpen')\n this.openingSource = document.activeElement\n }\n\n close() {\n // Transitionend listener is fired multiple times (fore each css property)\n // so we need to instantiate it only when we open or close and then we remove it on focusin\n this.dropdownMenu.addEventListener('transitionend', this.boundFocus)\n document.removeEventListener('focusin', this.boundFocusin)\n document.removeEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNav)\n this.buttonElement.classList.remove('isOpen')\n this.buttonElement.setAttribute('aria-expanded', false)\n }\n\n focus() {\n this.dropdownMenu.removeEventListener('transitionend', this.boundFocus)\n if (this.isOpen && this.selectedOption) {\n this.selectedOption.focus()\n this.dropdownMenu.lastFocused = this.selectedOption\n } else {\n this.buttonElement.focus()\n }\n }\n\n focusin(e) {\n const loop = false\n focusin(e, this.dropdownMenu, loop)\n }\n\n keyNav(e) {\n switch (e.key) {\n case 'Escape':\n this.toogleDropdown(false)\n break\n case 'ArrowUp':\n e.preventDefault()\n this.prevOption()\n break\n case 'ArrowDown':\n e.preventDefault()\n this.nextOption()\n break\n case 'Home':\n case 'PageUp':\n e.preventDefault()\n this.firstOption()\n break\n case 'End':\n case 'PageDown':\n e.preventDefault()\n this.lastOption()\n break\n default:\n break\n }\n }\n\n prevOption() {\n if (this.dropdownMenu.lastFocused !== this.dropdownMenu.firstFocusable) {\n const prevSibling = this.dropdownMenu.lastFocused.previousElementSibling\n prevSibling.focus()\n this.dropdownMenu.lastFocused = prevSibling\n }\n }\n\n nextOption() {\n if (this.dropdownMenu.lastFocused !== this.dropdownMenu.lastFocusable) {\n const nextSibling = this.dropdownMenu.lastFocused.nextElementSibling\n nextSibling.focus()\n this.dropdownMenu.lastFocused = nextSibling\n }\n }\n\n firstOption() {\n if (this.dropdownMenu.lastFocused !== this.dropdownMenu.firstFocusable) {\n this.dropdownMenu.firstFocusable.focus()\n this.dropdownMenu.lastFocused = this.dropdownMenu.firstFocusable\n }\n }\n\n lastOption() {\n if (this.dropdownMenu.lastFocused !== this.dropdownMenu.lastFocusable) {\n this.dropdownMenu.lastFocusable.focus()\n this.dropdownMenu.lastFocused = this.dropdownMenu.lastFocusable\n }\n }\n\n disconnectedCallback() {\n this.unbindEvent()\n }\n}\n\ncustomElements.get('nb-dropdown') || customElements.define('nb-dropdown', Dropdown)\n\nexport default Dropdown\n","import Viewport from './viewportTracking'\nimport { parseHTML, capitalize } from '../../utils'\nimport { productImpression } from '@kissui/helpers/src/gtmEvents'\n\nexport default function (node, productData, currency, range, position) {\n const tracking = new ProductTracking(node, productData, currency, range, position)\n\n return {\n destroy: () => {\n if (!tracking.getIom().hasIntersectionObserver()) {\n tracking.destroy()\n }\n }\n }\n}\n\nclass ProductTracking extends Viewport {\n constructor(node, data, currency, range, position) {\n super(node)\n this.node = node\n this.data = data\n this.currency = currency\n this.range = range\n this.position = position\n }\n\n async runTrack() {\n // Remove impressionOnScoll event - from Analytics team (Luigi, Yahor)\n const noImpression =\n this.node.closest('[tracking_no_impression]')?.getAttribute('tracking_no_impression') ||\n false\n const productIndex =\n this.node.closest('[tracking_position]')?.getAttribute('tracking_position') || 0\n const list = this.node.closest('[tracking_list]')?.getAttribute('tracking_list') || ''\n\n if (noImpression !== 'true') {\n await productImpression(productIndex, list, this.data.id)\n }\n }\n\n async getPLPCategory(categoryId) {\n return (await window.getPLPData()).data.configuration.eCommerceData.categories.find(\n category => category.id === categoryId\n )\n }\n\n async getCategoriesWithPlpData(productData) {\n const TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\n const isTechnologyCategory = categoryId =>\n categoryId.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) !== -1\n\n const getTechnologyName = categoryId =>\n categoryId.substr(\n categoryId.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) +\n TECHNOLOGY_CATEGORY_IDENTIFIER.length\n )\n\n const categories = [\n ...(productData.cupSizes || []),\n ...(productData.flavors || []),\n ...(productData.ranges || []),\n ...(productData.technologies || [])\n ]\n\n const categoryNames = await Promise.all(\n categories.map(async categoryId => {\n const categoryData = await this.getPLPCategory(categoryId)\n\n if (!categoryData && isTechnologyCategory(categoryId)) {\n return getTechnologyName(categoryId)\n }\n\n return categoryData.name\n })\n )\n\n return categoryNames.join('|')\n }\n\n async getCategories(productData) {\n if (!productData) {\n return ''\n }\n\n if (window.getPLPData) {\n return this.getCategoriesWithPlpData(productData)\n }\n\n return Promise.all(\n productData.supercategories.map(superCategory =>\n window.napi.catalog().getCategory(superCategory)\n )\n ).then(categories => {\n const dimension55 = []\n for (const category of categories) {\n const code = category.code\n if (!code) {\n return\n }\n if (\n ~code.indexOf('-cupSize-') ||\n ~code.indexOf('-range-') ||\n ~code.indexOf('capsule-aromatic-') ||\n ~code.indexOf('machine-keyFeature-') ||\n ~code.indexOf('machine-color-') ||\n ~code.indexOf('accessory-collection-') ||\n ~code.indexOf('accessory-hero-month')\n ) {\n dimension55.push(category.name.toLowerCase())\n }\n }\n return dimension55.join('|')\n })\n }\n\n buildGTMProductObject(productData, dimension55) {\n let category\n if (productData.type === 'capsule') {\n category = 'capsules'\n } else if (productData.type === 'accessory') {\n category = 'accessories'\n } else if (productData.type === 'machine') {\n category = 'machines'\n }\n\n let dimension56 = null\n if (productData.technologies) {\n dimension56 = productData.technologies\n .map(technology => capitalize(technology.split('/')[2]))\n .join('|||')\n }\n\n let dimension130 = ''\n if (productData.productSelections != null) {\n dimension130 = productData.productSelections.join('|')\n }\n\n const impressionsOnScrollData = {\n brand: 'Nespresso',\n category,\n dimension43: 'false',\n dimension44: 'false',\n dimension53: productData.legacyId,\n dimension54: parseHTML(productData.name)[0].textContent,\n dimension55,\n dimension56,\n dimension57: this.isBundled(productData) ? 'bundled' : 'single',\n dimension130,\n id: productData.internationalId,\n name: parseHTML(productData.internationalName)[0].textContent,\n price: productData.price\n }\n if (this.range) {\n impressionsOnScrollData.list = this.range\n }\n if (this.position) {\n impressionsOnScrollData.position = parseInt(this.position)\n }\n return impressionsOnScrollData\n }\n\n /**\n * Guess if it's bundled even if the 'bundled' property is missing (ecapi VS PLP Data)\n */\n isBundled(productData) {\n let result = productData.salesMultiple === 1 && productData.unitQuantity > 1\n\n if (productData.bundled) {\n result = productData.bundled\n } else if (productData.salesMultiple > 1 && productData.unitQuantity === 1) {\n result = false\n }\n\n return result\n }\n}\n","import productTracking from '@kissui/helpers/src/assets/js/productTracking'\nimport { getProduct } from '@kissui/helpers/src/catalog'\n\nclass AddToCart extends HTMLElement {\n static addToCartCounter = 0\n\n connectedCallback() {\n this.sku = (this.getAttribute('sku') || '').trim()\n this.range = this.getAttribute('range')\n this.position = this.getAttribute('position')\n this.longSku = (this.getAttribute('longSku') || '').trim()\n this.buttonSize = this.getAttribute('buttonSize') || 'small' // large or small\n this.rendererName = this.getAttribute('rendererName') || 'default'\n this.elementID = `addToCart${AddToCart.addToCartCounter++}`\n this.disableTracking = this.getAttribute('disableTracking') || false\n\n this.render()\n\n if (!this.isWindowNapiActive()) {\n return\n }\n\n window.napi\n .getConfig()\n .then(() => {\n this.pushButton()\n })\n .catch(e => console.error(e))\n\n if (!this.disableTracking) {\n this.tracking()\n .then(() => {})\n .catch(e => console.error(e))\n }\n }\n\n render() {\n this.innerHTML = `<div class=\"cb-AddToCart\" id=\"${this.elementID}\">\n <button class='AddToBagButtonLarge'>\n <span class='AddToBagButtonLarge__label'>+</span>\n </button>\n </div>`\n }\n\n isWindowNapiActive() {\n return !!window.napi\n }\n\n pushButton() {\n if (!document.getElementById(this.elementID)) {\n return\n }\n\n const buttonSize = this.buttonSize\n\n window.ui = window.ui || []\n window.ui.push({\n id: this.elementID,\n module: 'AddToBagButton',\n configuration: { props: { productId: this.longSku, buttonSize } },\n ecommerceData: { activated: true }\n })\n }\n\n async tracking() {\n if (!this.isWindowNapiActive()) {\n return Promise.resolve()\n }\n\n const data = await this.getProductData()\n const currency = window[window.config.padl.namespace].dataLayer.app.app.currency\n productTracking(this, data, currency, this.range, this.position)\n }\n\n getSkuKey(sku) {\n return sku.indexOf('prod/') !== -1 ? 'id' : 'legacyId'\n }\n\n async getProductData() {\n let plpData = null\n if (window.getPLPData != null) {\n plpData = await window.getPLPData()\n }\n if (plpData) {\n const skuKey = this.getSkuKey(this.sku)\n const allKeys = [skuKey, 'internationalId', 'id', 'legacyId']\n let currentKeyIndex = 0\n let data = null\n\n while (!data && currentKeyIndex < allKeys.length - 1) {\n const key = allKeys[currentKeyIndex]\n\n data = plpData.data.configuration.eCommerceData.products.find(\n product => product[key] === this.sku\n )\n\n currentKeyIndex++\n }\n\n return data\n } else if (this.isWindowNapiActive()) {\n return await getProduct(this.longSku)\n }\n\n console.error('Error: napi is not found.')\n }\n}\n\ncustomElements.get('nb-add-to-cart') || customElements.define('nb-add-to-cart', AddToCart)\n\nexport default AddToCart\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { EVENT_SLIDER_READY } from '@kissui/components'\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { stringifyForAttribute, escapeHtml } from '@kissui/helpers/src/utils'\nimport { BROWSER_CONTEXT } from '../constants.mjs'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nconst SLIDER_CHIPS_ID = 'slider_natural_chips'\n\nclass PlpStickyBar extends HTMLElement {\n constructor() {\n super()\n this.boundReinitSlider = this.reinitSlider.bind(this)\n this.boundLinkClick = this.linkClick.bind(this)\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n\n this.addEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n this.render()\n\n this.dropdownButtons = this.querySelectorAll(`.nb-dropdown__menu button`)\n if (this.dropdownButtons) {\n this.dropdownButtons.forEach(item => {\n item.addEventListener('click', this.boundLinkClick)\n })\n }\n }\n\n render() {\n const { navigation = [], navigation_bubbles = '' } = this.props\n this.classList.add('nb-plp-sticky-bar')\n\n this.innerHTML = `<div class='cb-restrict'>\n ${this.renderLinksSelect(navigation)}\n ${this.renderChipsSlider(navigation_bubbles)}\n </div>`\n\n this.dropdown = this.querySelector('nb-dropdown')\n this.navigationBubble = this.querySelector('nb-navigation-bubbles')\n\n // We set aria-hidden on this whole component because it has no sense to manage twice the features for SR and keyboard navigations\n // Those features (bubble anchor + dropdown page switch) are already managed by the non sticky components\n this.setAttribute('aria-hidden', 'true')\n }\n\n renderLinksSelect(links) {\n if (viewportHelper.is.mobile || !links || links.length <= 1) {\n return ''\n }\n\n const data = links.map(e => {\n e.checked = e.selected\n return e\n })\n\n return `\n <nb-dropdown\n data='${stringifyForAttribute({ icon_option: '16/symbol/check', options: data })}'\n ></nb-dropdown>\n `\n }\n\n renderChipsSlider(bubbles) {\n const { a11y_slider_previous_button = '', a11y_slider_next_button = '' } = this.props\n\n return `<nb-navigation-bubbles\n slider_id='${SLIDER_CHIPS_ID}'\n a11y_slider_previous_button=\"${a11y_slider_previous_button}\"\n a11y_slider_next_button=\"${a11y_slider_next_button}\"\n sticky='true' data='${escapeHtml(bubbles)}'\n selected_nav_link_label=\"${\n this.props.selected_nav_link_label || ''\n }\"></nb-navigation-bubbles>`\n }\n\n forceSliderWidth() {\n // This is needed for Chip Slider, I don't understand why the width is too much\n // So we set it hardly in JS (only when dropdown is in the layout)\n if (this.dropdown) {\n const dropdownWidth = this.dropdown.offsetWidth\n const stickyBarWidth = this.querySelector('.cb-restrict').offsetWidth\n const navigationBubbleWidth = stickyBarWidth - dropdownWidth\n\n this.navigationBubble.style.setProperty(\n 'width',\n `${navigationBubbleWidth / BROWSER_CONTEXT}rem`\n )\n }\n }\n\n reinitSlider(e) {\n const { id } = readEvent(e)\n if (id !== SLIDER_CHIPS_ID) {\n return\n }\n this.forceSliderWidth()\n e.target.initSlider()\n }\n\n linkClick(event) {\n event.preventDefault()\n // We need to redefine click on dropdown links because these are buttons\n const link = event.currentTarget.getAttribute('data-link')\n if (link) {\n window.location.href = link\n }\n\n const textContent = event.currentTarget.getAttribute('value')\n customEvent({\n eventAction: 'PLP Content Tab',\n eventLabel: textContent\n })\n }\n\n disconnectedCallback() {\n this.removeEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n\n if (this.dropdownButtons) {\n this.dropdownButtons.forEach(item => {\n item.removeEventListener('click', this.boundLinkClick)\n })\n }\n }\n}\n\ncustomElements.get('nb-plp-sticky-bar') || customElements.define('nb-plp-sticky-bar', PlpStickyBar)\n\nexport default PlpStickyBar\n","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty <www.johndoherty.info>\n * @license MIT\n */\n\n// scrollElement has been added as an optional parameter in order to avoid scrolling to fire a swipe\nconst swipeEvents = (window: Window & typeof globalThis, document: Document, stopEl?: HTMLElement) => {\n if (window.nwcSwipeEvents) {\n return\n }\n window.nwcSwipeEvents = true\n\n // patch CustomEvent to allow constructor creation (IE/Chrome)\n // if (typeof window.CustomEvent !== 'function') {\n // window.CustomEvent = function(event, params) {\n // params = params || {bubbles: false, cancelable: false, detail: undefined}\n //\n // let evt = document.createEvent('CustomEvent')\n // evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail)\n // return evt\n // }\n //\n // window.CustomEvent.prototype = window.Event.prototype\n // }\n\n document.addEventListener('touchstart', handleTouchStart, false)\n document.addEventListener('touchmove', handleTouchMove, false)\n document.addEventListener('touchend', handleTouchEnd, false)\n\n let xDown: null | number = null\n let yDown: null | number = null\n let xDiff: null | number = null\n let yDiff: null | number = null\n let timeDown: null | number = null\n let startEl: HTMLElement | null = null\n\n // Variables added for checkScrollConditions\n let scrollTopArray: number[] = []\n let scrollLeftArray: number[] = []\n\n /**\n * Avoid swipe up or down events to fire by checking the scrollTop position of the optional param scrollEl (scrollable zone)\n * @param {string} direction - 'up' ,'down', 'left', 'right'\n * @returns {boolean}\n */\n function checkScrollCondition(direction: \"up\" |\"down\" | \"left\" | \"right\", e: TouchEvent) {\n if (stopEl === undefined) {\n return true\n }\n\n let el = e.target as HTMLElement\n let result = true\n let i = 0\n while (el !== stopEl && result) {\n if (isScrollable(el)) {\n switch (direction) {\n case 'up':\n result = scrollTopArray[i] === el.scrollHeight - el.clientHeight\n break\n case 'down':\n result = scrollTopArray[i] === 0\n break\n case 'left':\n result = scrollLeftArray[i] === el.scrollWidth - el.clientWidth\n break\n case 'right':\n result = scrollLeftArray[i] === 0\n break\n default:\n result = true\n }\n }\n el = el.parentNode as HTMLElement\n i++\n }\n return result\n }\n\n function memorizeStartElScrollPositions(el: HTMLElement) {\n if (stopEl === undefined || !stopEl.contains(el)) {\n return\n }\n scrollTopArray = []\n scrollLeftArray = []\n while (el !== stopEl) {\n scrollTopArray.push(el.scrollTop)\n scrollLeftArray.push(el.scrollLeft)\n el = el.parentNode as HTMLElement\n }\n }\n\n function isScrollable(el: HTMLElement) {\n return el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth\n }\n\n /**\n * Fires swiped event if swipe detected on touchend\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchEnd(e: TouchEvent) {\n // if the user released on a different target, cancel!\n if (startEl !== e.target) {\n return\n }\n\n // Calculate the data-swipe-threshold to be a percentage of the viewport\n const defaultVertical = window.innerHeight * 0.25 // 25% of the viewport\n const defaultHorizontal = window.innerWidth * 0.5 // 50% of the viewport\n\n let swipeThresholdVertical =\n getNearestAttribute(startEl!, 'data-swipe-threshold', defaultVertical)\n\n let swipeThresholdHorizontal =\n getNearestAttribute(startEl!, 'data-swipe-threshold', defaultHorizontal)\n\n let swipeTimeout = getNearestAttribute(startEl!, 'data-swipe-timeout', 500) // default 500ms\n let timeDiff = Date.now() - timeDown!\n let eventType = ''\n let changedTouches = e.changedTouches || e.touches || []\n\n if (Math.abs(xDiff!) > Math.abs(yDiff!)) {\n // most significant\n if (Math.abs(xDiff!) > swipeThresholdHorizontal && timeDiff < swipeTimeout) {\n if (xDiff! > 0) {\n if (checkScrollCondition('left', e)) {\n eventType = 'swiped-left'\n }\n } else {\n if (checkScrollCondition('right', e)) {\n eventType = 'swiped-right'\n }\n }\n }\n } else if (Math.abs(yDiff!) > swipeThresholdVertical && timeDiff < swipeTimeout) {\n if (yDiff! > 0) {\n if (checkScrollCondition('up', e)) {\n eventType = 'swiped-up'\n }\n } else {\n if (checkScrollCondition('down', e)) {\n eventType = 'swiped-down'\n }\n }\n }\n\n if (eventType !== '') {\n let eventData = {\n dir: eventType.replace(/swiped-/, ''),\n touchType: (changedTouches[0] as Touch & { touchType: string })?.touchType ?? 'direct', // This is a non standard feature used only by safari\n xStart: xDown!,\n xEnd: (changedTouches[0] || {}).clientX || -1,\n yStart: yDown!,\n yEnd: (changedTouches[0] || {}).clientY || -1\n }\n\n // fire `swiped` event event on the element that started the swipe\n startEl!.dispatchEvent(\n new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData })\n )\n\n // fire `swiped-dir` event on the element that started the swipe\n startEl!.dispatchEvent(\n new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData })\n )\n }\n\n // reset values\n xDown = null\n yDown = null\n timeDown = null\n }\n\n /**\n * Records current location on touchstart event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchStart(e: TouchEvent) {\n const target = e.target as HTMLElement\n // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n if (target.getAttribute('data-swipe-ignore') === 'true') {\n return\n }\n\n startEl = target\n memorizeStartElScrollPositions(startEl)\n\n timeDown = Date.now()\n xDown = e.touches[0].clientX\n yDown = e.touches[0].clientY\n xDiff = 0\n yDiff = 0\n }\n\n /**\n * Records location diff in px on touchmove event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchMove(e: TouchEvent) {\n if (!xDown || !yDown) {\n return\n }\n\n let xUp = e.touches[0].clientX\n let yUp = e.touches[0].clientY\n\n xDiff = xDown - xUp\n yDiff = yDown - yUp\n }\n\n /**\n * Gets attribute off HTML element or nearest parent\n * @param {object} el - HTML element to retrieve attribute from\n * @param {string} attributeName - name of the attribute\n * @param {any} defaultValue - default value to return if no match found\n * @returns {any} attribute value or defaultValue\n */\n function getNearestAttribute(el: HTMLElement, attributeName: string | number, defaultValue: number) {\n // walk up the dom tree looking for attributeName\n while (el && el !== document.documentElement) {\n let attributeValue = el.getAttribute(String(attributeName))\n\n if (attributeValue) {\n return parseInt(attributeValue, 10)\n }\n\n el = el.parentNode as HTMLElement\n }\n\n return defaultValue\n }\n}\n\nexport default swipeEvents\n","import './overlay.scss'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_POPIN_CLOSE, TIME_INSTANT, TIME_SLOW } from '@kissui/components'\n\nconst open = popin_id => {\n const overlay = document.createElement('DIV')\n overlay.classList.add('nb-overlay')\n overlay.addEventListener('click', () => {\n dispatchEvent({ eventName: EVENT_POPIN_CLOSE, args: { id: popin_id } })\n })\n document.body.appendChild(overlay)\n setTimeout(() => {\n overlay.classList.add('fadein')\n }, TIME_INSTANT)\n}\n\nconst close = () => {\n if (!document.getElementsByClassName('nb-overlay').length) {\n return\n }\n const overlay = document.getElementsByClassName('nb-overlay')[0]\n overlay.classList.remove('fadein')\n setTimeout(() => {\n overlay.remove()\n }, TIME_SLOW)\n}\n\nexport default { open, close }\n","import swipeEvents from '@kissui/helpers/src/swipeEvents'\nimport createProps, { parseBool } from '@kissui/helpers/src/props.helpers'\nimport {\n recursiveSwitchAriaHidden,\n setFirstAndLastFocusable,\n focusin\n} from '@kissui/helpers/src/assets/js/scopedKeyboardNav'\nimport {\n TIME_FAST,\n EVENT_POPIN_OPENED,\n EVENT_POPIN_CLOSED,\n EVENT_VIDEO_TOGGLE,\n EVENT_POPIN_OPEN,\n EVENT_POPIN_CLOSE,\n EVENT_POPIN_KEY_DOWN,\n EVENT_SWIPED_DOWN\n} from '@kissui/components'\nimport Overlay from './components/overlay'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { dispatchEvent, readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nconst STATE_OPEN = 'isOpen'\nconst SCROLL_LOCK = 'scroll-lock'\n\nclass Popin extends HTMLElement {\n constructor() {\n super()\n this.props = {}\n this.ariaModal = null\n this.isVideo = null\n\n this.boundOpen = this.open.bind(this)\n this.boundClose = this.close.bind(this)\n this.boundEscapeClose = this.escapeClose.bind(this)\n this.boundFocus = this.focus.bind(this)\n this.boundFocusin = this.focusin.bind(this)\n }\n\n connectedCallback() {\n this.style.display = 'none'\n this.props = createProps(this.attributes)\n\n if (!this.id) {\n this.id = this.props.id\n }\n\n if (!this.content && !this.slot) {\n this.slot = this.innerHTML\n }\n\n this.ariaModal = false\n this.isVideo = false\n this.render()\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n this.props = createProps(this.attributes)\n\n if (name === 'content') {\n this.props.content = newValue\n }\n }\n\n static get observedAttributes() {\n return ['content']\n }\n\n disconnectedCallback() {\n if (!this.hasEvent) {\n return\n }\n this.unbindEvent()\n }\n\n render() {\n if (this.hasEvent) {\n this.unbindEvent()\n }\n const {\n heading = '',\n subheading = '',\n bgcolor = 'highlight',\n size = 'M',\n label_close = 'Close',\n image = '',\n image_alt = '',\n variation = 'before',\n content = '',\n heading_class = viewportHelper.is.mobile ? 't-sm-700-sl' : 'h-lg-700',\n heading_id = 'popin-heading'\n } = this.props\n const slot = content || this.slot\n\n if (slot === '') {\n this.bindEvent()\n this.classList.remove(STATE_OPEN)\n this.isOpen = false\n return false\n }\n this.checkIsVideo(slot)\n this.setAttribute('size', this.isVideo ? 'L' : size)\n\n // FYI : The role is dialog, not alertdialog (only used for alerts / warnings ...)\n this.setAttribute('role', 'dialog')\n this.setAttribute('aria-hidden', 'true')\n this.setAttribute('bgcolor', bgcolor)\n this.setAttribute('variation', variation)\n\n // Be careful to not remove the title div, even if empty, because it holds on purpose the top gradient for scroll effect\n this.innerHTML = `\n <nb-cta\n variation=\"navigation\"\n ${bgcolor === 'white' ? `contrast=\"highlight\"` : `contrast=\"light\"`}\n icon_right=\"24/symbol/close\"\n label=\"${label_close}\"></nb-cta>\n <div class=\"wrapper\">\n ${\n heading &&\n `<div class=\"title\" >\n ${\n heading &&\n `<h2 id=\"${heading_id}\" class=\"${heading_class}\">${heading}</h2>`\n }\n </div>`\n }\n ${\n subheading &&\n `<div class=\"subtitle\">\n ${subheading && `<p class=\"t-sm-500\">${subheading}</p>`}\n </div>`\n }\n\n <div class=\"content t-sm-400\" tabindex=\"-1\">\n ${\n image &&\n `<div class=\"popin-header-img\"><img loading=\"lazy\" src=\"${image}\" alt=\"${image_alt}\" title=\"${image_alt}\" width=\"300\" height=\"225\" /></div>`\n }\n ${slot}\n </div>\n ${this.renderFooter()}\n </div>\n ${this.isVideo && viewportHelper.is.mobile ? '<div class=\"swipeOverlay\"></div>' : ''}\n `\n\n // Expected css to be downloaded\n setTimeout(() => {\n this.style.display = 'inherit'\n }, 100)\n\n // Set the first and last focusable elements\n setFirstAndLastFocusable(this)\n\n this.buttonElement = this.querySelector('button')\n this.bindEvent()\n }\n\n renderFooter() {\n const { footer } = this.props\n return parseBool(footer) ? '<footer></footer>' : ''\n }\n\n checkIsVideo(slot) {\n const tempEl = document.createElement('div')\n tempEl.innerHTML = slot\n if (tempEl.children.length === 1 && tempEl.children[0].tagName === 'NB-VIDEO') {\n this.isVideo = true\n this.setAttribute('video', 'true')\n }\n }\n\n addLock() {\n document.getElementsByTagName('html')[0].classList.add(SCROLL_LOCK)\n Overlay.open(this.id)\n }\n\n removeLock() {\n // In case we have popin inside a popin we shouldn't remove the scroll_lock\n const parentPopin = this.parentNode.closest('nb-popin')\n if (!parentPopin) {\n document.getElementsByTagName('html')[0].classList.remove(SCROLL_LOCK)\n }\n Overlay.close()\n }\n\n switchAriaModal() {\n this.ariaModal = !this.ariaModal\n // This is the future way to scope the SR focus to a modal, but it's not supported yet by all SR\n this.setAttribute('aria-modal', this.ariaModal)\n // So we need to set aria-hidden=false to all ancestors of parent until body\n recursiveSwitchAriaHidden(this, this.ariaModal)\n }\n\n async open(e) {\n const event = readEvent(e)\n if (event.id !== this.id) {\n return\n }\n // Transitionend listener is fired multiple times (fore each css property)\n // so we need to instantiate it only when we open or close and then we remove it on focusin\n this.addEventListener('transitionend', this.boundFocus)\n document.addEventListener('focusin', this.boundFocusin)\n this.openingSource = document.activeElement\n\n this.addLock()\n this.switchAriaModal()\n this.setAttribute('aria-hidden', 'false')\n this.isOpen = !this.isOpen\n\n // event variable already contains ID and other args sent along with dispatch event\n dispatchEvent({\n eventName: EVENT_POPIN_OPENED,\n args: event\n })\n\n await new Promise(resolve => {\n setTimeout(() => {\n this.classList.add(STATE_OPEN)\n resolve()\n }, TIME_FAST)\n })\n }\n\n close(event) {\n event.cancelBubble = true\n if (event.stopPropagation) {\n event.stopPropagation()\n }\n // Transitionend listener is fired multiple times (fore each css property)\n // so we need to instantiate it only when we open or close, and then we remove it on focusin\n this.addEventListener('transitionend', this.boundFocus)\n document.removeEventListener('focusin', this.boundFocusin)\n this.removeLock()\n if (this.isVideo) {\n const openVideoPopin = this.closest('.has-open-video')\n if (openVideoPopin) {\n openVideoPopin.classList.remove('has-open-video')\n }\n }\n this.switchAriaModal()\n this.setAttribute('aria-hidden', 'true')\n this.isOpen = !this.isOpen\n this.classList.remove(STATE_OPEN)\n\n dispatchEvent({\n eventName: EVENT_POPIN_CLOSED,\n args: { id: this.id }\n })\n }\n\n focus() {\n this.removeEventListener('transitionend', this.boundFocus)\n if (this.isOpen) {\n this.buttonElement.focus()\n } else {\n this.openingSource.focus()\n }\n }\n\n focusin(e) {\n focusin(e, this, true)\n }\n\n escapeClose(e) {\n if (e.key === 'Escape' && this.isOpen) {\n this.close(e)\n }\n }\n\n swipeDown(e) {\n if (this.isOpen) {\n this.close(e)\n }\n }\n\n swipeOverlayTogglePlayPause() {\n dispatchEvent({\n eventName: EVENT_VIDEO_TOGGLE,\n args: { id: this.id }\n })\n }\n\n bindEvent() {\n this.hasEvent = true\n this.buttonElement != null && this.buttonElement.addEventListener('click', this.boundClose)\n window.addEventListener(EVENT_POPIN_OPEN, this.boundOpen)\n window.addEventListener(EVENT_POPIN_CLOSE, this.boundClose)\n document.addEventListener(EVENT_POPIN_KEY_DOWN, this.boundEscapeClose)\n\n if (viewportHelper.is.mobile) {\n swipeEvents(window, document, this)\n this.boundSwipeDown = this.swipeDown.bind(this)\n document.addEventListener(EVENT_SWIPED_DOWN, this.boundSwipeDown)\n if (this.isVideo) {\n this.swipeOverlay = this.querySelector('.swipeOverlay')\n this.boundSwipeOverlayTogglePlayPause = this.swipeOverlayTogglePlayPause.bind(this)\n this.swipeOverlay.addEventListener('click', this.boundSwipeOverlayTogglePlayPause)\n }\n }\n }\n\n unbindEvent() {\n this.hasEvent = false\n this.buttonElement != null &&\n this.buttonElement.removeEventListener('click', this.boundClose)\n window.removeEventListener(EVENT_POPIN_OPEN, this.boundOpen)\n window.removeEventListener(EVENT_POPIN_CLOSE, this.boundClose)\n document.removeEventListener(EVENT_POPIN_KEY_DOWN, this.boundEscapeClose)\n if (this.boundSwipeDown) {\n document.removeEventListener(EVENT_SWIPED_DOWN, this.boundSwipeDown)\n this.boundSwipeDown = null\n }\n if (this.boundSwipeOverlayTogglePlayPause) {\n this.swipeOverlay.removeEventListener('click', this.boundSwipeOverlayTogglePlayPause)\n this.boundSwipeOverlayTogglePlayPause = null\n }\n }\n}\n\ncustomElements.get('nb-popin') || customElements.define('nb-popin', Popin)\n\nexport default Popin\n","import { LOGO_IMG_MAP } from '@kissui/helpers/src/cremaDataHelper'\nimport createProps from '@kissui/helpers/src/props.helpers'\n\nclass CardLogos extends HTMLElement {\n constructor() {\n super()\n this.props = {}\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n }\n\n render() {\n // individual props for each logo is there for retro compatibility\n // logos is the prop that we should use going forward to add any logo\n let { direction = 'row', logos } = this.props\n let fair_trade\n let alt_fair_trade\n let is_organic\n let alt_organic\n let only_vertuo_next\n let alt_vertuo_next\n let is_rainforest\n let alt_rainforest\n let is_sustainable\n let alt_sustainable\n let is_q_certified_arabica\n let alt_q_certification_arabica\n\n this.classList.add(\n `${direction === 'column' ? 'direction-column' : 'direction-' + direction}`\n )\n\n let logos_list = []\n if (logos == null) {\n fair_trade = this.props?.fair_trade\n alt_fair_trade = this.props?.alt_fair_trade\n is_organic = this.props?.is_organic\n alt_organic = this.props?.alt_organic\n only_vertuo_next = this.props?.only_vertuo_next\n alt_vertuo_next = this.props?.alt_vertuo_next\n is_rainforest = this.props?.is_rainforest\n alt_rainforest = this.props?.alt_rainforest\n is_sustainable = this.props?.is_sustainable\n alt_sustainable = this.props?.alt_sustainable\n is_q_certified_arabica = this.props?.is_q_certified_arabica\n alt_q_certification_arabica = this.props?.alt_q_certification_arabica\n } else if (logos.length === undefined) {\n // Logos exists but is not an array, this is the old format\n fair_trade = logos?.fair_trade\n alt_fair_trade = logos?.alt_fair_trade\n is_organic = logos?.is_organic\n alt_organic = logos?.alt_organic\n only_vertuo_next = logos?.only_vertuo_next\n alt_vertuo_next = logos?.alt_vertuo_next\n is_rainforest = logos?.is_rainforest\n alt_rainforest = logos?.alt_rainforest\n is_sustainable = logos?.is_sustainable\n alt_sustainable = logos?.alt_sustainable\n is_q_certified_arabica = logos?.is_q_certified_arabica\n alt_q_certification_arabica = logos?.alt_q_certification_arabica\n } else if (logos.length) {\n logos_list = [...logos]\n }\n\n // here we fill logos with logos taken from individual props\n ;[\n [fair_trade, 'fair_trade', alt_fair_trade, logos_list],\n [is_organic, 'is_organic', alt_organic, logos_list],\n [only_vertuo_next, 'only_vertuo_next', alt_vertuo_next, logos_list],\n [is_rainforest, 'is_rainforest', alt_rainforest, logos_list],\n [is_sustainable, 'is_sustainable', alt_sustainable, logos_list],\n [\n is_q_certified_arabica,\n 'is_q_certified_arabica',\n alt_q_certification_arabica,\n logos_list\n ]\n ].forEach(param => this.appendLogo.apply(this, param))\n\n this.innerHTML = logos_list\n .map(logo => `<img src=\"${LOGO_IMG_MAP[logo.name]}\" alt=\"${logo.alt}\" loading=\"lazy\">`)\n .join('')\n }\n\n appendLogo(param, name, alt, list) {\n if (!!param && !this.hasLogo(list, name)) {\n list.push({ name, alt })\n }\n }\n\n hasLogo(logosList, logoName) {\n return logosList.some(logo => logo.name === logoName)\n }\n}\n\ncustomElements.get('nb-card-logos') || customElements.define('nb-card-logos', CardLogos)\n\nexport default CardLogos\n","export const root = 'pn-ProductNav'\nexport const container = 'pn-ProductNavContents'\nexport const slidesContainer = 'pn-ProductContainer'\nexport const item = 'pn-ProductNavLinkWrapper'\nexport const next = 'pnAdvancerRight'\nexport const prev = 'pnAdvancerLeft'\nexport const pnIndicator = 'pn-ProductNavIndicator'\nexport const link_plp_category_padding_x = 10\nexport const TRANSITION_FAST = 300\n\nexport const colours = {\n 0: '#000000',\n 1: '#000000',\n 2: '#99813D',\n 3: '#40FEFF',\n 4: '#14CC99',\n 5: '#00BAFF',\n 6: '#0082B2',\n 7: '#B25D7A',\n 8: '#00FF17',\n 9: '#006B49',\n 10: '#00B27A',\n 11: '#996B3D',\n 12: '#CC7014',\n 13: '#40FF8C',\n 14: '#FF3400',\n 15: '#ECBB5E',\n 16: '#ECBB0C',\n 17: '#B9D912',\n 18: '#253A93',\n 19: '#125FB9'\n}\n","import * as constants from './constants'\nimport { colours, link_plp_category_padding_x, TRANSITION_FAST } from './constants'\nimport { makeId } from '@kissui/helpers/src/utils'\n\nclass SliderMenu {\n /**\n * @param {HTMLElement} element\n * @param {Object} options\n * @param {Number} [options.slidesToScroll=1] options.slidesToScroll of element do slide\n * @param {Number} [options.slidesVisible=1] options.slidesVisible of element to display\n * @param {Boolean} [options.navigationButton=true] options.navigationButton show navigation button\n */\n\n constructor(element, options = {}) {\n this.boundNextClick = this.onNextClick.bind(this)\n this.boundPrevClick = this.onPrevClick.bind(this)\n this.boundLinkClick = this.onLinkClick.bind(this)\n this.boundTouchEnd = this.onTouchEnd.bind(this)\n this.disableAutoScroll = options.disableAutoScroll === 'true' || false\n this._entriesBounds = null\n\n return new Promise(resolve => {\n this._element = element\n this._slides = [].slice.call(element.children)\n this._options = Object.assign(\n {},\n {\n id: 'uuid',\n last_known_scroll_position: 0,\n ticking: false,\n navBarTravelDirection: '',\n navBarTravelling: false,\n navBarTravelDistance: 150,\n scrollAmount: 220\n },\n options\n )\n\n this.buildIHM()\n resolve(this)\n\n // Wait for CSS animation before setting the indicator\n setTimeout(() => {\n this.setOverflowAttribute()\n this.initializeIndicatorPosition()\n }, 0)\n })\n }\n\n /**\n * @returns {HTMLElement}\n */\n get element() {\n return this._element\n }\n\n // MAIN BUILDER\n buildIHM() {\n this._root = this.createElement('nav', constants.root)\n this._container = this.createElement('ul', constants.container)\n this._pnIndicator = null\n this._containerSlidesContent = null\n\n if (this.hasContainer()) {\n this._containerSlidesContent = this.createElement('div', constants.slidesContainer)\n }\n\n this.wrapItems()\n this._root.appendChild(this._container)\n\n if (this._containerSlidesContent) {\n this._element.appendChild(this._containerSlidesContent)\n }\n\n // Insert the slider between Arrows for accessibility keyboard navigation\n this._element.insertBefore(this._root, this._element.childNodes[2])\n\n this.createIndicator()\n }\n\n hasContainer() {\n if (document.querySelector('.slider-container')) return true\n\n return false\n }\n\n wrapItems() {\n const keys = []\n this._slides.map(child => {\n const randId = makeId(5)\n\n if (this.hasContainer()) {\n if (child.classList.contains('slider-container')) {\n if (child.children) {\n if (child.children.length) {\n ;[...child.children].forEach((el, i) => {\n if (i !== 0) {\n el.style.display = 'none'\n }\n\n el.id = keys[i]\n\n this._containerSlidesContent.appendChild(el)\n })\n }\n }\n child.remove()\n }\n }\n\n if (!child.classList.contains('pn-Advancer')) {\n const item = this.createElement('div', constants.item)\n item.appendChild(child)\n item.setAttribute('data-inner-content-id', randId)\n keys.push(randId)\n\n this._container.appendChild(item)\n }\n })\n }\n\n createElement(tag, className) {\n let div = document.createElement(tag)\n div.setAttribute('class', className)\n return div\n }\n\n // COMPONENT ROOT \"ELEMENT\" COMPOSER\n createIndicator() {\n this.elements = []\n this._pnIndicator = this.createElement('div', constants.pnIndicator)\n this._container.appendChild(this._pnIndicator)\n\n this.elements = Array.from(this._container.querySelectorAll('nb-link a'))\n // Handle setting the currently active link\n this.elements.forEach(element => {\n element.addEventListener('click', this.boundLinkClick)\n })\n\n const pnAdvancerLeft = document.getElementById(`${constants.prev}-${this._options.id}`)\n if (pnAdvancerLeft) {\n pnAdvancerLeft.addEventListener('click', this.boundPrevClick)\n }\n\n const pnAdvancerRight = document.getElementById(`${constants.next}-${this._options.id}`)\n if (pnAdvancerRight) {\n pnAdvancerRight.addEventListener('click', this.boundNextClick)\n }\n\n if (this._root) {\n this._container.addEventListener('touchend', this.boundTouchEnd)\n }\n }\n\n onLinkClick(e) {\n this.goToElement(e.currentTarget)\n }\n\n goToSlide(index) {\n this.goToElement(this._slides[index])\n }\n\n showContent(id) {\n const slidesContainer = document.querySelector(`.${constants.slidesContainer}`)\n\n if (slidesContainer.children) {\n ;[...slidesContainer.children].forEach(el => (el.style.display = 'none'))\n }\n\n document.getElementById(id).style.display = 'block'\n }\n\n goToElement(element) {\n if (this.hasContainer()) {\n const contentId = element\n .closest('[data-inner-content-id]')\n .getAttribute('data-inner-content-id')\n\n this.showContent(contentId)\n }\n\n this.deselectAllLinkBut(element)\n element.setAttribute('aria-current', 'true')\n\n if (!element || !this._entriesBounds) {\n return\n }\n\n let distance = 0\n\n for (const entry of this._entriesBounds) {\n if (entry.target.getAttribute('data-href') === element.getAttribute('data-href')) {\n break\n } else {\n distance = distance + entry.boundingClientRect.width + link_plp_category_padding_x\n }\n }\n\n if (!this.disableAutoScroll) {\n this._root.scroll({ left: distance, behavior: 'smooth' })\n }\n }\n\n deselectAllLinkBut(element) {\n this.elements.forEach(el => {\n if (el !== element) {\n el.setAttribute('aria-current', 'false')\n }\n })\n }\n\n sideScroll(element, direction, speed, distance, step) {\n this.setOverflowAttribute()\n\n let scrollAmount = 0\n let slideTimer = setInterval(function () {\n if (direction === 'left') {\n element.scrollLeft -= step\n } else {\n element.scrollLeft += step\n }\n scrollAmount += step\n if (scrollAmount >= distance) {\n window.clearInterval(slideTimer)\n }\n }, speed)\n return { slideTimer }\n }\n\n onPrevClick() {\n this.sideScroll(this._root, 'left', 25, this._options.scrollAmount, 10)\n setTimeout(() => {\n this.setOverflowAttribute()\n }, TRANSITION_FAST)\n }\n\n onNextClick() {\n this.sideScroll(this._root, 'right', 25, this._options.scrollAmount, 10)\n setTimeout(() => {\n this.setOverflowAttribute()\n }, TRANSITION_FAST)\n }\n\n onTouchEnd() {\n this.setOverflowAttribute()\n }\n\n initializeIndicatorPosition() {\n const selected = this._root.querySelector('[aria-current=\"true\"]')\n\n // Set the indicator\n if (selected) {\n this.moveIndicator(selected, colours[0])\n }\n }\n\n determineOverflow(content, container) {\n let containerMetrics = container.getBoundingClientRect()\n let containerMetricsRight = Math.floor(containerMetrics.right)\n let containerMetricsLeft = Math.floor(containerMetrics.left)\n\n let contentMetrics = content.getBoundingClientRect()\n let contentMetricsRight = Math.floor(contentMetrics.right)\n let contentMetricsLeft = Math.floor(contentMetrics.left)\n\n if (\n containerMetricsLeft > contentMetricsLeft &&\n containerMetricsRight < contentMetricsRight\n ) {\n return 'both'\n } else if (contentMetricsLeft < containerMetricsLeft) {\n return 'left'\n } else if (contentMetricsRight > containerMetricsRight) {\n return 'right'\n } else {\n return 'none'\n }\n }\n\n moveIndicator(item, color) {\n if (!this._pnIndicator) {\n return\n }\n\n let textPosition = item.getBoundingClientRect()\n let container = this._container.getBoundingClientRect().left\n let distance = textPosition.left - container\n\n this._pnIndicator.style.transform =\n 'translateX(' +\n (distance + this._container.scrollLeft + link_plp_category_padding_x) +\n 'px) scaleX(' +\n (textPosition.width - link_plp_category_padding_x * 2) * 0.01 +\n ')'\n\n this._root.scrollLeft = Math.floor(\n distance + this._container.getBoundingClientRect().left / 2\n )\n\n if (color) {\n this._pnIndicator.style.backgroundColor = color\n }\n }\n\n onResize() {\n this.setOverflowAttribute()\n this.initializeIndicatorPosition()\n }\n\n clearListeners() {\n this.elements.forEach(element => {\n element.removeEventListener('click', this.boundLinkClick)\n })\n\n if (typeof document !== 'undefined') {\n const pnAdvancerLeft = document.getElementById(`${constants.prev}-${this._options.id}`)\n if (pnAdvancerLeft) {\n pnAdvancerLeft.removeEventListener('click', this.boundPrevClick)\n }\n\n const pnAdvancerRight = document.getElementById(`${constants.next}-${this._options.id}`)\n if (pnAdvancerRight) {\n pnAdvancerRight.removeEventListener('click', this.boundNextClick)\n }\n }\n }\n\n kill() {\n this.clearListeners()\n }\n\n setOverflowAttribute() {\n this._element.setAttribute(\n 'data-overflowing',\n this.determineOverflow(this._container, this._root)\n )\n\n this.observe()\n }\n\n observe() {\n if (!('IntersectionObserver' in window)) {\n return false\n }\n\n this._entriesBounds = []\n\n // Using IntersectionObserver to prevent reflow while getting boundingClientRect\n const observer = new IntersectionObserver(\n entries => {\n for (const entry of entries) {\n this._entriesBounds.push({\n target: entry.target,\n intersection:\n entry.boundingClientRect.right <=\n window.innerWidth - link_plp_category_padding_x &&\n entry.boundingClientRect.left >= link_plp_category_padding_x,\n boundingClientRect: entry.boundingClientRect\n })\n }\n\n observer.disconnect()\n },\n { root: this._container }\n )\n\n this._slides.map(element => observer.observe(element))\n }\n\n isInViewport(element) {\n if (!this._entriesBounds) {\n return false\n }\n\n const entry = this._entriesBounds.find(entryBound => element === entryBound.target)\n\n return entry.intersection\n }\n}\n\nexport default SliderMenu\n","import SliderMenuLib from './js/SliderMenuLib'\nimport { debounce, makeId } from '@kissui/helpers/src/utils'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { customEvent, itemDisplay } from '@kissui/helpers/src/gtmEvents'\nimport { EVENT_SLIDE_CHANGE, EVENT_SLIDER_READY } from '@kissui/components'\n\nclass SliderMenu extends HTMLElement {\n constructor() {\n super()\n this.slot = this.innerHTML\n this.navBarTravelling = true\n this.disableAutoScroll = false\n this.navBarTravelDirection = ''\n this.navBarTravelDistance = 200\n this.randomId = null\n this.sliderMenu = null\n this.boundOnResize = this.onResize.bind(this)\n this.onLoad = this.onLoad.bind(this)\n this.debouncedOnResize = debounce(this.boundOnResize, 250)\n }\n\n static get observedAttributes() {\n return ['navBarTravelling', 'navBarTravelDirection', 'navBarTravelDistance']\n }\n\n render() {\n const navigation = this.getAttribute('navigation') === 'true' ? true : ''\n const a11y_slider_previous_button = this.getAttribute('a11y_slider_previous_button') || ''\n const a11y_slider_next_button = this.getAttribute('a11y_slider_next_button') || ''\n\n this.innerHTML = `\n <div id=\"pnProductNav-${this.randomId}\" class=\"pn-ProductNavWrapper ${this.randomId}\">\n ${\n navigation &&\n `<nb-cta id=\"pnAdvancerLeft-${this.randomId}\"\n class=\"pn-Advancer pn-AdvancerLeft\"\n variation=\"navigation\"\n contrast=\"highlight\"\n size=\"32\"\n icon_right=\"24/symbol/chevron-left\"\n label=\"${a11y_slider_previous_button}\"></nb-cta>`\n }\n ${this.slot}\n ${\n navigation &&\n `<nb-cta id=\"pnAdvancerRight-${this.randomId}\"\n class=\"pn-Advancer pn-AdvancerRight\"\n variation=\"navigation\"\n contrast=\"highlight\"\n size=\"32\"\n icon_right=\"24/symbol/chevron-right\"\n label=\"${a11y_slider_next_button}\"></nb-cta>`\n }\n <span id=\"pnIndicator-${this.randomId}\"\n class=\"pn-ProductNavIndicator\">\n </span>\n </div>\n\n `\n this.loadSwiper()\n }\n\n connectedCallback() {\n this.randomId = this.getAttribute('testId')\n ? this.getAttribute('testId')\n : `swiperMenu_${makeId(5)}`\n this.navBarTravelling = this.getAttribute('navBarTravelling') || this.navBarTravelling\n this.navBarTravelDirection =\n this.getAttribute('navBarTravelDirection') || this.navBarTravelDirection\n this.navBarTravelDistance =\n this.getAttribute('navBarTravelDistance') || this.navBarTravelDistance\n this.disableAutoScroll = this.getAttribute('disable_auto_scroll') || ''\n\n this.render()\n window.addEventListener('resize', this.debouncedOnResize)\n }\n\n loadSwiper() {\n let navBarTravelDirection = this.navBarTravelDirection\n let navBarTravelDistance = this.navBarTravelDistance\n\n this.sliderMenu = new SliderMenuLib(this.querySelector('.' + this.randomId), {\n id: this.randomId,\n index: this.index,\n navBarTravelDirection: navBarTravelDirection,\n navBarTravelDistance: navBarTravelDistance,\n disableAutoScroll: this.disableAutoScroll\n })\n\n this.sliderMenu.then(() => {\n this.classList.add('is-show')\n\n dispatchEvent({\n eventName: EVENT_SLIDER_READY,\n args: { className: this.randomId },\n element: this\n })\n })\n\n // Updates slider menu to follow semantics, accessibility\n const productNavLinkWrappers = document.querySelectorAll('.pn-ProductNavLinkWrapper')\n productNavLinkWrappers.forEach(div => {\n const li = document.createElement('li')\n li.classList.add('pn-ProductNavLinkWrapper')\n while (div.firstChild) {\n li.appendChild(div.firstChild)\n }\n div.parentNode.replaceChild(li, div)\n })\n }\n\n handleClick() {\n dispatchEvent({ eventName: EVENT_SLIDE_CHANGE })\n\n // GTM 'itemDisplay' event\n itemDisplay({ rootElement: ['nb-slider-menu'] })\n }\n\n onLoad() {\n this.sliderMenu.then(slider => slider.onLoad())\n }\n\n onResize() {\n this.sliderMenu.then(slider => slider.onResize())\n }\n\n onNavigationClick(e) {\n let name = ''\n\n if (\n e.target &&\n e.target.closest('.link') &&\n e.target.closest('.link').getAttribute('tracking_label')\n ) {\n name = e.target.closest('.link').getAttribute('tracking_label')\n }\n\n customEvent({ eventAction: 'PLP Content Tab', eventLabel: name })\n }\n\n disconnectedCallback() {\n window.removeEventListener('resize', this.debouncedOnResize)\n this.sliderMenu.then(slider => slider.kill())\n }\n}\n\ncustomElements.get('nb-slider-menu') || customElements.define('nb-slider-menu', SliderMenu)\n\nexport default SliderMenu\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { makeId, setAttributes, convertToCamelCase } from '@kissui/helpers/src/utils'\nimport { isSafari } from '@kissui/helpers/src/useragent.helpers'\nimport { CONTRAST_LIGHT } from '@kissui/components'\nimport { getOppositeContrast } from '@kissui/helpers/src/contrast.helpers'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { BROWSER_CONTEXT, EVENT_SLIDER_READY } from '../constants.mjs'\n\nconst MAX_LOOP_TO_INIT = 50 // max 5 seconds\n\nclass SliderNatural extends HTMLElement {\n constructor() {\n super()\n // Default options\n this.contrast = CONTRAST_LIGHT\n this.defaultPosition = 0\n this.displayButtons = true\n this.displayNav = true\n this.displayCounter = false\n this.displayGradients = false\n this.itemsPerSlide = 1\n this.overflow = true\n this.overflowOpacity = 0.25\n this.flexAuto = false\n // Events\n this.boundPrevClick = this.#onPrevClick.bind(this)\n this.boundNextClick = this.#onNextClick.bind(this)\n this.boundNavClick = this.#onNavClick.bind(this)\n this.boundScroll = this.#onScroll.bind(this)\n }\n\n connectedCallback() {\n this.slot = this.innerHTML\n this.props = createProps(this.attributes)\n this.#render()\n\n // We need an id for event dispatcher\n if (!this.id || this.id === 'undefined') {\n this.id = this.props.testId ? this.props.testId : `slider_natural_${makeId(5)}`\n }\n\n this.#setProperties()\n\n this.loops = 0\n this.#waitForSliderToBeSized()\n .then(() => {\n this.initSlider()\n this.#dispatchReady()\n })\n .catch(e => {\n console.error(e)\n })\n .finally(() => {\n if (this.wait) {\n clearInterval(this.wait)\n this.wait = null\n }\n })\n }\n\n #waitForSliderToBeSized() {\n return new Promise((resolve, reject) => {\n this.wait = setInterval(() => {\n if (this.carousel.offsetWidth > 0) {\n return resolve()\n }\n\n this.loops += 1\n if (this.loops === MAX_LOOP_TO_INIT) {\n return reject(\n 'Error: slider width is ZERO even after 5s, cannot finish slider init'\n )\n }\n }, 100)\n })\n }\n\n #set(key, value) {\n const normalisedValue = this.#getOption(value)\n if (normalisedValue !== undefined) {\n this[convertToCamelCase(key)] = normalisedValue\n }\n }\n\n #getOption(value) {\n if (!isNaN(value)) {\n return parseFloat(value)\n } else if (value === 'true') {\n return true\n } else if (value === 'false') {\n return false\n } else {\n return value\n }\n }\n\n #setProperties() {\n const { options, a11y_labels } = this.props\n\n // Create refs to html elements\n this.container = this.querySelector('.container')\n this.wrapper = this.querySelector('.wrapper')\n this.carousel = this.querySelector('ul')\n\n // Set slider properties\n this.currentIndex = 0\n this.a11y_labels = a11y_labels\n if (viewportHelper.is.mobile) {\n this.options = options.mobile\n } else if (viewportHelper.is.tablet) {\n this.options = options.tablet\n } else {\n this.options = options.desktop\n }\n\n // Set options\n for (const property in this.options) {\n this.#set(property, this.options[property])\n }\n\n // If counter is displayed we force buttons and pagination to false\n if (this.displayCounter) {\n this.displayNav = this.displayButtons = false\n }\n\n // Overflow needs a class\n if (this.overflow) {\n this.container.classList.add('overflow')\n }\n\n // Contrast needs an attribute\n this.buttonsContrast = getOppositeContrast(this.contrast)\n this.setAttribute('contrast', this.contrast)\n\n // Set CSS properties for non dynamic options\n this.#setCssSlideMinHeight()\n this.#setCssSliderGap()\n this.#setCssPlaceholder()\n }\n\n /** Public Method **/\n initSlider() {\n // Get an updated number of items (if async we run again)\n this.slidesElements = this.querySelectorAll('.nn-carousel > li:not(.safari-fix)')\n this.itemNumber = this.slidesElements.length\n\n // For asynchronous initSlider() we need to reset first itemWidth and itemPerSlide to get the original values before other calculations\n this.#set('item_width', this.options['item_width'])\n this.#set('items_per_slide', this.options['items_per_slide'])\n\n // If itemsPerSlide is 'auto' we need to calculate it's real value based on itemWidth or scrollWidth / itemNumber\n // We also need to set the CSS --item-width variable to handle the calculation correctly\n if (this.itemsPerSlide === 'auto') {\n this.#calculateItemsPerSlide()\n }\n this.#setCssSlideWidth()\n this.#setCssItemsPerSlide()\n this.#setCssFlexAuto()\n\n // Other properties that can be set only after the rest\n this.maxSlides = this.itemNumber - this.itemsPerSlide\n\n // Finish rendering\n this.#renderButtons()\n this.#renderNav()\n this.#renderCounter()\n this.#renderGradients()\n\n // Init methods in this order !\n this.#applyCenteredLayout()\n this.#getSliderPositions()\n this.#getOpacityParams()\n this.#setOpacity()\n this.#updateStates()\n this.#bindEvent()\n this.#gotoDefaultPosition()\n\n // Render this safariFix at the end because we don't want the extra li to be considered in sliderElements\n this.#renderSafariFix()\n }\n\n #render() {\n this.innerHTML = `<div class=\"container\"><div class=\"wrapper\"><ul class=\"nn-carousel\">${this.slot}</ul></div></div>`\n }\n\n #renderButtons() {\n // Important: if maxSlides <= 0 it means we don't have scroll, so we don't need buttons\n const hasNoButton = !this.displayButtons || this.maxSlides <= 0\n if (hasNoButton) {\n // Needed if we reinit\n if (this.prevButton && this.nextButton) {\n this.prevButton.remove()\n this.nextButton.remove()\n }\n return\n }\n\n // Check if button exists already (for async content in order to avoid creating two occurrences)\n if (!this.prevButton) {\n this.prevButton = this.#renderButton('prev')\n }\n if (!this.nextButton) {\n this.nextButton = this.#renderButton('next')\n }\n }\n\n #renderButton(pos, renderInCounter = false) {\n const { creative = '', id = '', name = '', position = '' } = this.props.campaign ?? {}\n const buttonContrast = renderInCounter ? this.contrast : this.buttonsContrast\n const isPrev = pos === 'prev'\n\n const buttonEl = document.createElement('nb-cta')\n buttonEl.classList.add(pos)\n setAttributes(buttonEl, {\n variation: 'navigation',\n contrast: buttonContrast,\n size: '48',\n icon_right: isPrev ? '24/symbol/chevron-left' : '24/symbol/chevron-right',\n label: this.a11y_labels[pos],\n campaign_creative: creative,\n campaign_id: id,\n campaign_name: name,\n campaign_position: position\n })\n if (!renderInCounter) {\n isPrev ? this.container.prepend(buttonEl) : this.container.append(buttonEl)\n } else {\n isPrev ? this.counter.prepend(buttonEl) : this.counter.append(buttonEl)\n }\n return buttonEl\n }\n\n #renderNav() {\n if (!this.displayNav || this.maxSlides === 0) {\n // Needed if we reinit\n if (this.nav) {\n this.nav.remove()\n }\n return\n }\n\n // Check if nav exists already (for async content in order to avoid creating two occurrences)\n if (this.nav) {\n this.nav.remove()\n }\n\n const nav = document.createElement('nav')\n\n let bullets = ''\n for (let i = 0; i <= this.maxSlides; i++) {\n bullets += this.#renderBullet(i)\n }\n\n nav.innerHTML = `${bullets}`\n\n this.appendChild(nav)\n this.nav = this.querySelector('nav')\n this.navElements = this.querySelectorAll('nav button')\n }\n\n #renderBullet(index) {\n return `<button data-item='${index}' aria-label='${this.a11y_labels.nav} ${index}'><span></span></button>`\n }\n\n #renderCounter() {\n if (!this.displayCounter || this.maxSlides === 0) {\n // Needed if we reinit\n if (this.counter) {\n this.counter.remove()\n }\n return\n }\n\n // Check if counter exists already (for async content in order to avoid creating two occurrences)\n if (this.counter) {\n this.counter.remove()\n }\n\n this.counter = document.createElement('div')\n this.counter.classList.add('counter')\n this.counter.classList.add('t-sm-500')\n this.counter.setAttribute('aria-hidden', 'true')\n\n this.counter.innerHTML = `<span class='current'>${this.currentIndex + 1}</span>\n <span>/</span>\n <span>${this.maxSlides + 1}</span>`\n\n this.prevButton = this.#renderButton('prev', true)\n this.nextButton = this.#renderButton('next', true)\n\n this.appendChild(this.counter)\n }\n\n #renderGradients() {\n if (!this.displayGradients || this.overflow) {\n return\n }\n\n if (this.gradientsWidth) {\n this.#setCss('--gradients-width', this.gradientsWidth, true)\n }\n\n if (this.gradientsColor) {\n this.#setCss('--gradients-color', this.gradientsColor)\n this.#setCss('--gradients-color-transparent', this.gradientsColor + '00')\n }\n\n this.container.classList.add('hasGradients')\n }\n\n #renderSafariFix() {\n // In safari, both Desktop and iOS, the scroll doesn't reach the end, because the scroll-padding on the right side seems to not been taken into account\n // Same bug is happening in Chrome on iOS (seems to use Safari webkit rendering)\n // The fix is to render an extra <li> with the size equal to the scroll-padding\n if (!this.overflow || !isSafari()) {\n return\n }\n\n // Check if safariFix exists already (for async content in order to avoid creating two occurences)\n if (!this.safariFix) {\n this.safariFix = document.createElement('li')\n this.safariFix.classList.add('safari-fix')\n this.safariFix.setAttribute('aria-hidden', true)\n this.carousel.appendChild(this.safariFix)\n }\n\n const safariFixWidth = (this.paddingCorrection - this.sliderGap) / BROWSER_CONTEXT\n this.safariFix.style.setProperty('width', safariFixWidth + 'rem')\n }\n\n #calculateItemsPerSlide() {\n // For asynchronous slider content, if initSlider() is called twice, we need to remove first this class\n this.carousel.classList.remove('no-slides')\n\n let itemWidth = this.itemWidth\n\n // If itemWidth is not provided or 'auto', we need to calculate an average width for items that doesn't have fixed width\n if (this.itemWidth === undefined || this.itemWidth === 'auto') {\n itemWidth =\n (this.carousel.scrollWidth - this.sliderGap * (this.itemNumber - 1)) /\n this.itemNumber\n }\n\n this.itemsPerSlide = Math.floor(this.carousel.offsetWidth / itemWidth)\n // TODO: the fix below doesn't work, needs to be resolved.\n // const isLastElementSingle =\n // this.slidesElements[this.slidesElements.length - 2].offsetWidth +\n // this.slidesElements[this.slidesElements.length - 1].offsetWidth >\n // this.carousel.offsetWidth\n\n // this.itemsPerSlide = isLastElementSingle\n // ? 0\n // : Math.floor(this.carousel.offsetWidth / itemWidth)\n }\n\n #getSliderPositions() {\n this.sliderPositions = []\n this.maxScroll = this.carousel.scrollWidth - this.carousel.offsetWidth\n\n if (this.slidesElements.length === 0) {\n return\n }\n\n // We need to manage the first item initial position in case the slides are\n // visible on each side (equivalent to scroll-padding CSS of ul.nn-carousel)\n const firstItemOffsetLeft = this.slidesElements[0].offsetLeft\n\n this.querySelectorAll('.nn-carousel > li:not(.safari-fix)').forEach(element => {\n this.sliderPositions.push(element.offsetLeft - firstItemOffsetLeft)\n })\n }\n\n #setCss(name, value, isRem = false) {\n this.style.setProperty(name, isRem ? value / BROWSER_CONTEXT + 'rem' : value)\n }\n\n #setCssSlideWidth() {\n if (this.itemWidth === 'auto') {\n const itemWidthAuto =\n (this.container.clientWidth - (this.itemsPerSlide - 1) * this.sliderGap) /\n (this.itemsPerSlide || 1)\n this.#setCss('--item-width', itemWidthAuto, true)\n } else if (this.itemWidth) {\n this.#setCss('--item-width', this.itemWidth, true)\n }\n }\n\n #setCssSlideMinHeight() {\n if (this.slideMinHeight === 'auto') {\n this.#setCss('--slide-min-height', 'auto')\n } else if (this.slideMinHeight !== undefined) {\n this.#setCss('--slide-min-height', this.slideMinHeight, true)\n }\n }\n\n #setCssSliderGap() {\n if (this.sliderGap || this.sliderGap === 0) {\n this.#setCss('--slider-gap', this.sliderGap, true)\n }\n }\n\n #setCssFlexAuto() {\n if (this.flexAuto) {\n this.carousel.classList.add('flex-auto')\n }\n }\n\n #setCssPlaceholder() {\n if (this.placeholderBackground) {\n this.#setCss('--placeholder-background', this.placeholderBackground)\n }\n }\n\n #setCssItemsPerSlide() {\n this.#setCss('--items-per-slide', this.itemsPerSlide)\n }\n\n #applyCenteredLayout() {\n if (this.maxSlides > 0) {\n return\n }\n // If maxSlides is 0 or negative, it means that we have less items than needed to fulfill the carousel width\n // So to center the items (for example the bubbles when only 3) we need to apply a justify-content: center fix\n this.carousel.classList.add('no-slides')\n }\n\n /** Public Method **/\n updateSlider(index, instantly = false) {\n this.#getSliderPositions()\n this.goToSlide(parseInt(index), instantly)\n }\n\n #updateStates() {\n this.#setActiveButtons()\n this.#setActiveBullet()\n this.#setCounter()\n this.#setActiveSlides()\n }\n\n #updateStatesScroll(index) {\n this.#setActiveButtons(index)\n this.#setCounter()\n }\n\n #setActiveButtons(currentIndex) {\n if ((!this.displayButtons || this.maxSlides <= 0) && !this.displayCounter) {\n return\n }\n\n // First we remove all hide classes (because with pagination we can move from more than 2 slides)\n this.prevButton.classList.remove('hide')\n this.nextButton.classList.remove('hide')\n\n // Then we reset hide class on the right button\n if (this.currentIndex === 0) {\n this.prevButton.classList.add('hide')\n } else if (this.currentIndex === this.maxSlides || currentIndex === this.maxSlides) {\n this.nextButton.classList.add('hide')\n }\n }\n\n #setActiveBullet() {\n if (!this.displayNav || this.maxSlides <= 0) {\n return\n }\n\n this.navElements.forEach(item => {\n item.classList.remove('active')\n })\n\n this.navElements[this.currentIndex].classList.add('active')\n }\n\n #setCounter() {\n if (!this.displayCounter || this.maxSlides === 0) {\n return\n }\n\n if (!this.displayCounter) {\n return\n }\n\n this.counter.querySelector('.current').textContent = parseInt(this.currentIndex + 1)\n }\n\n #setActiveSlides() {\n // If we have no items overflowing on each side, we don't need to manage disabled slides\n if (!this.overflow) {\n return\n }\n\n this.slidesElements.forEach(element => {\n element.setAttribute('aria-disabled', 'true')\n })\n\n let tempIndex = parseInt(this.currentIndex)\n for (let i = 0; i < this.itemsPerSlide; i++) {\n if (this.slidesElements[tempIndex + i]) {\n this.slidesElements[tempIndex + i].removeAttribute('aria-disabled')\n }\n }\n }\n\n /** Public Method **/\n goToSlide(index, instantly = false) {\n if (index !== undefined) {\n this.currentIndex = index\n }\n\n // If index is over maxSlides, it means we reached out the end of scroll, so we don't need to update states anymore\n if (index < this.maxSlides) {\n this.#updateStates()\n }\n\n // We scroll to the right position (scrollTo duration is approx 750ms)\n this.carousel.scrollTo({\n left: this.sliderPositions[parseInt(this.currentIndex, 10)],\n behavior: instantly ? 'auto' : 'smooth'\n })\n }\n\n #gotoDefaultPosition() {\n if (this.defaultPosition === 0 || this.defaultPosition > this.maxSlides + 1) {\n return\n }\n this.goToSlide(this.defaultPosition, true)\n }\n\n #onScroll() {\n // Clear our timeout throughout the scroll\n if (this.isScrolling) {\n clearTimeout(this.isScrolling)\n }\n\n this.#setOpacity()\n\n // Set a timeout to run after scrolling ends\n this.isScrolling = setTimeout(() => {\n // Update the expected scroll positions again as sometimes they are initially incorrect\n this.#getSliderPositions()\n\n const carouselScrollLeft = Math.round(this.carousel.scrollLeft)\n\n // Ideal use case (exact pixel value)\n let index = this.sliderPositions.indexOf(carouselScrollLeft)\n\n // Sometimes the scrollLeft value can be +1 or -1 pixels. If the position is not found\n // then the index will be -1. In this case, try searching the list of positions to see\n // if the scroll position is one pixel left or right of the expected position (hence\n // using -1 and +1 in the indexOf() call below)\n if (index === -1) {\n index = this.sliderPositions.indexOf(carouselScrollLeft - 1)\n }\n if (index === -1) {\n index = this.sliderPositions.indexOf(carouselScrollLeft + 1)\n }\n\n // For items with flexible width (flex_auto) the last position of the scroll can not match an exact SliderPositions\n if (carouselScrollLeft === this.maxScroll) {\n index = this.maxSlides\n }\n\n if (index >= 0) {\n this.#switchBullets(index, true)\n }\n\n this.#updateStatesScroll(index)\n }, 100)\n }\n\n #getOpacityParams() {\n if (!this.overflow || !this.slidesElements.length) {\n return\n }\n // Set properties used for slide opacity calculation in #setOpacity()\n this.paddingCorrection = parseInt(\n getComputedStyle(this.carousel).getPropertyValue('padding-left')\n )\n\n this.itemWidthAdjusted = this.slidesElements[0].offsetWidth + this.sliderGap\n }\n\n #setOpacity() {\n if (!this.overflow) {\n return\n }\n const scrollX = this.carousel.scrollLeft\n\n this.slidesElements.forEach((item, index) => {\n // Adjust item offsetLeft because of slider padding on each side\n const itemOffsetLeft = item.offsetLeft - this.paddingCorrection\n // Adjust item offsetLeft to add itemWidth + sliderGap\n let itemX = itemOffsetLeft + this.itemWidthAdjusted\n\n // Determine if we need to calculate left or right items\n let percentage = 100\n\n if (scrollX > itemX) {\n // Avoid calculation if item is outside on left\n percentage = 0\n } else if (scrollX >= this.itemWidthAdjusted * index) {\n // Do left calculations\n percentage = Math.round(((itemX - scrollX) / this.itemWidthAdjusted) * 100)\n } else if (scrollX < itemX - (1 + this.itemsPerSlide) * this.itemWidthAdjusted) {\n // Avoid calculation if item is outside on right\n percentage = 0\n } else if (scrollX <= itemX - this.itemsPerSlide * this.itemWidthAdjusted) {\n // Do right calculations\n percentage = Math.round(\n (this.itemsPerSlide + 1) * 100 -\n ((itemX - scrollX) / this.itemWidthAdjusted) * 100\n )\n }\n\n const opacityPercentage = percentage / 100\n let finalOpacity =\n Math.round(\n (opacityPercentage * (1 - this.overflowOpacity) + this.overflowOpacity) * 100\n ) / 100\n\n item.firstElementChild.style.setProperty('opacity', finalOpacity)\n })\n }\n\n #switchBullets(index, alreadyScrolled = false) {\n if (!this.slidesElements[index]) {\n return\n }\n\n this.currentIndex = index\n\n // only fires goToSlide if user clicks on pagination buttons\n if (!alreadyScrolled) {\n this.goToSlide()\n } else {\n this.#updateStates()\n }\n }\n\n #onPrevClick() {\n if (this.currentIndex > 0) {\n this.currentIndex = this.currentIndex - 1\n this.#updateStates()\n }\n this.goToSlide()\n }\n\n #onNextClick() {\n if (this.currentIndex < this.maxSlides) {\n this.currentIndex = this.currentIndex + 1\n this.#updateStates()\n }\n this.goToSlide()\n }\n\n #onNavClick(e) {\n this.currentIndex = parseInt(e.target.dataset.item)\n this.#setActiveBullet()\n this.#switchBullets(this.currentIndex)\n }\n\n #dispatchReady() {\n dispatchEvent({\n eventName: EVENT_SLIDER_READY,\n args: { id: this.id },\n element: this\n })\n }\n\n #bindEvent() {\n this.#unbindEvent()\n\n this.carousel.addEventListener('scroll', this.boundScroll)\n if (this.prevButton) {\n this.prevButton.addEventListener('click', this.boundPrevClick)\n }\n if (this.nextButton) {\n this.nextButton.addEventListener('click', this.boundNextClick)\n }\n if (this.navElements) {\n this.navElements.forEach(element => {\n element.addEventListener('click', this.boundNavClick)\n })\n }\n }\n\n #unbindEvent() {\n this.carousel.removeEventListener('scroll', this.boundScroll)\n if (this.prevButton) {\n this.prevButton.removeEventListener('click', this.boundPrevClick)\n }\n if (this.nextButton) {\n this.nextButton.removeEventListener('click', this.boundNextClick)\n }\n if (this.navElements) {\n this.navElements.forEach(element => {\n element.removeEventListener('click', this.boundNavClick)\n })\n }\n }\n\n disconnectedCallback() {\n this.#unbindEvent()\n }\n}\n\ncustomElements.get('nb-slider-natural') || customElements.define('nb-slider-natural', SliderNatural)\n\nexport default SliderNatural\n","import { CONTRAST_DARK, CONTRAST_LIGHT } from '@kissui/components'\n\nexport const getOppositeContrast = contrast => {\n return contrast === CONTRAST_LIGHT ? CONTRAST_DARK : CONTRAST_LIGHT\n}\n","export const isIOS = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n return (agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1\n}\n\nexport const isMacOS = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n return agent.indexOf('Mac') > -1 && start > -1\n}\n\nexport const isApple = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n return (\n (agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1 || agent.indexOf('Mac') > -1) &&\n start > -1\n )\n}\n\nexport const isAndroid = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('Android ')\n return start > -1\n}\n\nexport const isHuawei = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('HUAWEI'),\n devices = navigator.userAgent.match(\n /ALP-|AMN-|ANA-|ANE-|ANG-|AQM-|ARS-|ART-|ATU-|BAC-|BLA-|BRQ-|CAG-|CAM-|CAN-|CAZ-|CDL-|CDY-|CLT-|CRO-|CUN-|DIG-|DRA-|DUA-|DUB-|DVC-|ELE-|ELS-|EML-|EVA-|EVR-|FIG-|FLA-|FRL-|GLK-|HMA-|HW-|HWI-|INE-|JAT-|JEF-|JER-|JKM-|JNY-|JSC-|LDN-|LIO-|LON-|LUA-|LYA-|LYO-|MAR-|MED-|MHA-|MLA-|MRD-|MYA-|NCE-|NEO-|NOH-|NOP-|OCE-|PAR-|PIC-|POT-|PPA-|PRA-|RNE-|SEA-|SLA-|SNE-|SPN-|STK-|TAH-|TAS-|TET-|TRT-|VCE-|VIE-|VKY-|VNS-|VOG-|VTR-|WAS-|WKG-|WLZ-|YAL/i\n )\n return start > -1 || devices !== null\n}\n\nexport const isSafari = () => {\n // https://stackoverflow.com/questions/7944460/detect-safari-browser\n // This includes Chrome on IOS which seems to be Safari, So it's fully OK !\n const agent = window.navigator.userAgent\n return /^((?!chrome|android).)*safari/i.test(agent)\n}\n\nexport const isWebInspector = () => {\n // https://stackoverflow.com/questions/19877924/what-is-the-list-of-possible-values-for-navigator-platform-as-of-today\n // If we are in a web inspector, in our Nespresso context platform can be MacIntel or eventually Win32 for windows users\n const platform = window.navigator.platform\n return platform.indexOf('MacIntel') > -1 || platform.indexOf('Win32') > -1\n}\n","const createRefs = component => [...component.querySelectorAll('[data-ref]')].reduce(extract, {})\n\nconst extract = (refs, $ref) => {\n const { ref } = $ref.dataset\n\n // Check if ref is of type array\n const refArray = ref.match(/(\\w+)\\[(.+)\\]/)\n\n if (refArray !== null) {\n return getRefArray(refs, $ref, refArray)\n } else {\n return { ...refs, [$ref.dataset.ref]: $ref }\n }\n}\n\nconst getRefArray = (refs, $ref, [, name, index]) => {\n if (refs[name] === undefined) {\n refs[name] = []\n }\n refs[name][index] = $ref\n return refs\n}\n\nexport default createRefs\n","import viewportHelper from './viewport.helpers'\n\n/**\n * Resize image on the fly by Akamai\n * https://dsu-confluence.nestle.biz/x/06kaCQ\n * https://dsu-confluence.nestle.biz/display/EUXUI/Performance?preview=/152742355/152761429/IMPoliciesExtract-31072020.docx\n * @param {''|'carouselBannerNarrowMedium'|'carouselBannerWide'|'horizontalBannerNarrow'|'landscapeRecipeDetails'|'large'|'medium'|'portraitRecipeDetails'|'productPdpMainDefault'|'productPdpMain'|'productPdpSafeZone'|'product'|'recipeCard'|'registrationTechChoiceMediumLarge'|'resize_crop'|'small'} policy - IM Policy coming from Akamaï\n * @param {24|150|320|640|1024|2048|5000} width - IM Width size of the image\n * @returns {string} - Rules apply in a query string parameter\n */\nexport const getImpolicy = (policy = 'product', width = 160) => {\n const rules = []\n\n if (policy) {\n rules.push(`impolicy=${policy}`)\n }\n\n if (width) {\n rules.push(`imwidth=${width}`)\n }\n\n return `?${rules.join('&')}`\n}\n\n/**\n * Ask the right resolution depending on breakpoint, returns the closest one\n * No need to give a retina resolution, Akamai will return Retina automatically (you need to give the normal resolution)\n * @param {''|'medium'} policy - IM Policy coming from Akamaï, default is medium because it have the largest batch of resolutions\n * @param {''|'375'} mobileWidth - Mobile image width to be served | 375 default is full mobile screen width\n * @param {''|'1024'} tabletWidth - Tablet image width to be served | 1024 default is full tablet landscape screen width\n * @param {''|'1920'} desktopWidth - Desktop image width to be served | 1024 default is full tablet landscape screen width\n * @returns {string} - Rules to concatenate to your image url\n */\nexport const getResponsiveImpolicy = (\n policy = 'medium',\n mobileWidth = '375',\n tabletWidth = '1024',\n desktopWidth = '1920',\n retinaWidth = '3840'\n) => {\n if (viewportHelper.is.mobile) {\n return getImpolicy(policy, mobileWidth)\n } else if (viewportHelper.is.tablet) {\n return getImpolicy(policy, tabletWidth)\n } else if (viewportHelper.is.desktop) {\n return getImpolicy(policy, desktopWidth)\n } else {\n return getImpolicy(policy, retinaWidth)\n }\n}\n","export const STATE_DEFAULT = 'default'\nexport const STATE_SELECTED = 'selected'\nexport const STATE_DISABLED = 'disabled'\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport createRefs from '@kissui/helpers/src/refs.helpers'\nimport { lazyLoad, getHashLink } from '@kissui/helpers/src/utils'\nimport { getResponsiveImpolicy } from '@kissui/helpers/src/impolicy'\nimport { selectPromotion } from '@kissui/helpers/src/gtmEvents'\n\nimport { STATE_SELECTED, STATE_DISABLED } from './js/constants'\n\nclass Bubble extends HTMLElement {\n constructor() {\n super()\n this.classList.add('nb-bubble')\n }\n\n static get observedAttributes() {\n return ['state']\n }\n\n attributeChangedCallback(name) {\n if (name === 'state') {\n this.setState()\n }\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n this.refs = createRefs(this)\n this.initLazyLoad()\n this.initTracking()\n }\n\n initTracking() {\n const { label, campaign } = this.props\n\n const link = this.querySelector('a')\n\n if (link) {\n link.onclick = () => {\n selectPromotion({\n cta_name: label,\n ...campaign\n })\n }\n }\n }\n\n initLazyLoad() {\n let { src = '', src_retina = '' } = this.props.visual\n const { visual } = this.refs\n\n // If src_retina is not provided by markets, then takes the src as default\n if (src_retina === '') {\n src_retina = src\n }\n\n src_retina += getResponsiveImpolicy('small', '144', '160', '80', '160')\n src_retina += '&imdensity=1'\n\n if (visual && src_retina) {\n lazyLoad(visual, 'src', `${src_retina}`, src_retina)\n }\n }\n\n render() {\n const { label, link, state, a11y_scrollto = 'Scroll to' } = this.props\n const { linkNoHash, linkHash } = getHashLink(link)\n\n this.innerHTML = `\n ${\n state === STATE_DISABLED\n ? this.renderVisual()\n : `<a href=\"${linkHash}\" data-href=\"${linkNoHash}\" aria-label='${a11y_scrollto} ${label}'>\n ${this.renderVisual()}\n </a>`\n }\n\n ${this.renderLabel()}\n `\n\n this.link = this.querySelector('a')\n this.label = this.querySelector('span')\n state && this.setAttribute('state', state)\n this.setTheme()\n }\n\n setState() {\n const state = this.getAttribute('state')\n\n if (state === STATE_SELECTED) {\n this.link.setAttribute('aria-current', 'true')\n this.label.classList.add('t-xs-700-sl')\n this.label.classList.remove('t-xs-500-sl')\n } else {\n if (state !== STATE_DISABLED) {\n this.link.removeAttribute('aria-current')\n }\n\n this.label.classList.remove('t-xs-700-sl')\n this.label.classList.add('t-xs-500-sl')\n }\n }\n\n setTheme() {\n const { theme } = this.props\n\n if (theme && theme !== '') {\n this.style.setProperty('--placeholder-background', theme)\n }\n }\n\n renderVisual() {\n let { src = '', src_retina = '' } = this.props.visual\n const { state } = this.props\n\n if (src === '' && src_retina === '') {\n return ''\n }\n\n // Image is decorative, we can have alt=\"\" and aria-hidden should be true\n return `<img src=\"\" alt=\"\" aria-hidden=\"true\" data-ref=\"visual\" ${\n state === STATE_DISABLED ? 'class=\"is-disabled\"' : ''\n }/>`\n }\n\n renderLabel() {\n const { label, state } = this.props\n\n if (!label) {\n return\n }\n\n return `<span class=\"t-xs-500-sl ${\n state === STATE_DISABLED ? 'is-disabled' : ''\n }\">${label}</span>`\n }\n}\n\ncustomElements.get('nb-bubble') || customElements.define('nb-bubble', Bubble)\n\nexport default Bubble\n","/**\n * @typedef {Object} ObserverItem\n * @property {String} selector - target element selector\n * @property {Object} options - IntersectionObserver options\n * @property {Function} callback - function to call on threshold crossed\n */\n\nclass IntersectionObserverService {\n constructor() {\n this.observers = new Map()\n }\n\n /**\n * Creates a Map of ObserverItem objects, unique for each selector provided.\n * Each selector has its own configurable observer, target elements and callback.\n * Observers can be individually unobserved / destroyed.\n * @param {ObserverItem[]} observables\n */\n create(observables) {\n observables.forEach(({ selector, callback, options }) => {\n if (this.observers.has(selector)) {\n console.warn(`Observer for selector \"${selector}\" already exists`)\n return\n }\n\n const targets = document.querySelectorAll(selector)\n\n if (targets.length === 0) {\n console.warn(`No elements found for selector \"${selector}\"`)\n return\n }\n\n const observer = new IntersectionObserver(callback, options)\n targets.forEach(element => observer.observe(element))\n this.observers.set(selector, { observer, targets })\n })\n }\n\n /**\n * Unobserve for specified selector\n * @param {String} selector\n */\n unobserve(selector) {\n const entry = this.observers.get(selector)\n\n if (entry) {\n const { observer, targets } = entry\n targets.forEach(element => observer.unobserve(element))\n } else {\n console.warn(`No observer found for selector \"${selector}\"`)\n }\n }\n\n /**\n * Disconnect observer for specified selector\n * @param {String} selector\n */\n destroy(selector) {\n const entry = this.observers.get(selector)\n\n if (entry) {\n const { observer } = entry\n observer.disconnect()\n this.observers.delete(selector)\n } else {\n console.warn(`No observer found for selector \"${selector}\"`)\n }\n }\n\n /**\n * Disconnect all observers\n */\n destroyAll() {\n this.observers.forEach(entry => {\n entry.observer.disconnect()\n })\n\n this.observers.clear()\n }\n}\n\nexport default IntersectionObserverService\n","export default class Deferred {\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.reject = reject\n this.resolve = resolve\n })\n }\n}\n","import Deferred from './deferred'\n\nconst resolveScrollPosition = (scrollTo: HTMLElement | string | number, scrollPaddingTop = 140) => {\n if (typeof scrollTo === \"number\") {\n return scrollTo\n }\n\n const scrollToElement = typeof scrollTo === \"object\" ? scrollTo : document.querySelector(scrollTo)\n\n if (scrollToElement === null && typeof scrollTo === \"string\") {\n throw new Error(`error: No element found with the selector \"${scrollTo}\"`)\n }\n\n return window.scrollY + scrollToElement!.getBoundingClientRect().top - scrollPaddingTop\n}\n\nconst resolveScrollDuration = (scrollDuration: number, deltaScroll: number) => {\n const viewportHeight = window.innerHeight\n const bodyHeight = document.body.clientHeight\n\n if (deltaScroll > viewportHeight && bodyHeight - viewportHeight > 0) {\n return Math.abs(\n scrollDuration +\n scrollDuration * (Math.abs(deltaScroll) / (bodyHeight - viewportHeight))\n )\n }\n return scrollDuration\n}\n/**\n * Smooth scroll-to inspired by:\n * http://stackoverflow.com/a/24559613/728480\n */\nconst scrollTo = (scrollTo: HTMLElement | string | number = 0, options: { scrollPaddingTop?: number, scrollDuration?: number } = {}) => {\n const { scrollDuration: baseScrollDuration = 300 } = options\n const deferred = new Deferred()\n\n let scrollPosition: number = 0;\n\n try {\n scrollPosition = resolveScrollPosition(scrollTo, options.scrollPaddingTop)\n }\n catch (error) {\n console.error(error)\n return\n }\n\n let currentTime = 0\n const initialTimestamp = window.performance.now()\n const initialScroll = window.scrollY\n const deltaScroll = initialScroll - scrollPosition\n\n const scrollDuration = resolveScrollDuration(baseScrollDuration, deltaScroll)\n\n const finalTimestamp = initialTimestamp + scrollDuration\n\n function step() {\n const currentTimestamp = window.performance.now()\n if (currentTimestamp < finalTimestamp) {\n currentTime = (currentTimestamp - initialTimestamp) / scrollDuration\n currentTime = --currentTime * currentTime * currentTime + 1\n const moveStep = deltaScroll * currentTime\n window.scrollTo(0, scrollPosition + (deltaScroll - moveStep))\n window.requestAnimationFrame(step)\n } else {\n window.scrollTo(0, scrollPosition)\n setTimeout(() => deferred.resolve(undefined), 125)\n }\n return deferred.promise\n }\n\n window.requestAnimationFrame(step)\n return deferred.promise\n}\n\nexport default scrollTo\n","export const EVENT_NAVIGATION_SECTION_CHANGE = 'EVENT_NAVIGATION_SECTION_CHANGE'\n\n// In mobile / tablet / sticky we need a dynamic number of slides as it's a variable width\n// This 'auto' value is valid with new slider-natural, it calculates the available space and set automatically the good itemsPerSlide\nexport const NB_SLIDES_MOBILE = 'auto'\nexport const NB_SLIDES_TABLET = 'auto'\nexport const NB_SLIDES_DESKTOP = 9\nexport const NB_SLIDES_STICKY = 'auto'\n\nexport const INTERSECTION_RATIOS_SECTION = [0.2, 0.8]\n\nexport const BUBBLE_MOBILE_WIDTH = '104'\nexport const BUBBLE_TABLET_DESKTOP_WIDTH = '112'\nexport const GRADIENT_WIDTH = '8'\n\nexport const SLIDER_CONFIG_DEFAULT = {\n display_gradients: 'true',\n display_nav: 'false',\n overflow: 'false',\n placeholder_background: 'transparent',\n slide_min_height: 'auto',\n slider_gap: '0'\n}\n","import { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport eventsHelper from '@kissui/helpers/src/events.helpers'\nimport IntersectionObserverService from '@kissui/helpers/src/intersection-observer.service'\nimport createProps from '@kissui/helpers/src/props.helpers.js'\nimport createRefs from '@kissui/helpers/src/refs.helpers'\nimport scrollTo from '@kissui/helpers/src/scrollTo'\nimport { getHashLink, stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { COLOR_WHITE_1000 } from '../constants.mjs'\nimport eventsManager from './services/events.manager'\n\nimport { BREAKPOINT_M } from '@kissui/components'\nimport {\n BUBBLE_MOBILE_WIDTH,\n BUBBLE_TABLET_DESKTOP_WIDTH,\n EVENT_NAVIGATION_SECTION_CHANGE,\n GRADIENT_WIDTH,\n INTERSECTION_RATIOS_SECTION,\n NB_SLIDES_DESKTOP,\n NB_SLIDES_MOBILE,\n NB_SLIDES_STICKY,\n NB_SLIDES_TABLET,\n SLIDER_CONFIG_DEFAULT\n} from './data/constants'\n\nclass NavigationBubbles extends HTMLElement {\n constructor() {\n super()\n this.isMobile = window.innerWidth < BREAKPOINT_M\n // Used to prevent observer to fire a section change event\n // if navigation click already did it\n this.isScrolling = false\n this.scrollObserver = new IntersectionObserverService()\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.classList.add('nb-navigation-bubbles')\n this.sticky = this.isSticky()\n this.type = this.sticky ? 'Chip' : 'Bubble'\n this.isCenteredItems = this.props.is_centered_items ? 'true' : 'false'\n this.setAttribute('type', this.type.toLowerCase())\n this.setAttribute('is-centered-items', this.isCenteredItems)\n this.init()\n }\n\n isSticky() {\n if (!this.props) {\n return false\n }\n const { sticky = 'false' } = this.props\n return sticky === 'true'\n }\n\n init() {\n this.render()\n this.refs = createRefs(this)\n this.slider = this.querySelector('nb-slider-natural')\n this.eventsListeners = eventsManager(this).createListeners(this.slider)\n this.scrollObserver.create([\n {\n selector: '[data-id]',\n callback: this.onSectionChange,\n options: {\n threshold: INTERSECTION_RATIOS_SECTION,\n rootMargin: '-160px 0px 0px 0px'\n }\n }\n ])\n }\n\n render() {\n this.innerHTML = `${this.renderNavigation()}`\n }\n\n getSliderOptions() {\n return {\n flex_auto: this.sticky ? 'true' : 'false',\n gradients_color: this.sticky ? COLOR_WHITE_1000 : undefined,\n gradients_width: this.sticky ? GRADIENT_WIDTH : undefined,\n ...SLIDER_CONFIG_DEFAULT\n }\n }\n\n renderNavigation() {\n const {\n slider_id,\n a11y_slider_previous_button,\n a11y_slider_next_button,\n a11y_goto_slide = 'Goto slide',\n campaign\n } = this.props\n\n // Pass render function name by element type (Chip/Bubble)\n const list = this.renderList(`render${this.type}`)\n\n const sliderOptions = this.getSliderOptions()\n const sliderData = {\n options: {\n mobile: {\n items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_MOBILE,\n item_width: this.sticky ? 'auto' : BUBBLE_MOBILE_WIDTH,\n display_buttons: 'false',\n ...sliderOptions\n },\n tablet: {\n items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_TABLET,\n item_width: this.sticky ? 'auto' : BUBBLE_TABLET_DESKTOP_WIDTH,\n display_buttons: 'true',\n ...sliderOptions\n },\n desktop: {\n items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_DESKTOP,\n item_width: this.sticky ? 'auto' : BUBBLE_TABLET_DESKTOP_WIDTH,\n ...sliderOptions\n }\n },\n a11y_labels: {\n prev: a11y_slider_previous_button,\n next: a11y_slider_next_button,\n nav: a11y_goto_slide\n },\n campaign\n }\n\n const slider = `<nb-slider-natural\n id='${slider_id}'\n data=\"${stringifyForAttribute(sliderData)}\"\n data-ref=\"slider${this.type}\">\n ${list}\n </nb-slider-natural>`\n\n if (this.sticky) {\n return slider\n }\n\n return `<nb-container contrast=\"light\">${slider}</nb-container>`\n }\n\n renderList(renderFunction) {\n const { bubbles = [] } = this.props\n\n const output = bubbles\n .map(bubble => ({ ...bubble, campaign: this.props.campaign || undefined }))\n .map(bubble => this[renderFunction](bubble))\n .join('')\n\n return output\n }\n\n renderBubble(bubble) {\n let { link, campaign } = bubble\n if (!link) {\n return null\n }\n const { linkNoHash } = getHashLink(link)\n\n const bubbleWithCampaign = { ...bubble, campaign }\n\n return `\n <li>\n <nb-bubble data=\"${stringifyForAttribute(\n bubbleWithCampaign\n )}\" data-ref=\"bubbles[${linkNoHash}]\"></nb-bubble>\n </li>\n `\n }\n\n renderChip(chip) {\n const { link } = chip\n if (!link) {\n return null\n }\n const { linkNoHash, linkHash } = getHashLink(link)\n\n return `\n <li>\n <a href=\"${linkHash}\" data-href='${linkNoHash}' class=\"is-link\" tabindex=\"-1\" >\n <nb-chip\n background_image=\"${chip.visual.src}\"\n data-ref=\"chips[${linkNoHash}]\"\n rounded=\"false\"\n campaign_id=\"${chip.campaign?.id}\"\n campaign_name=\"${chip.campaign?.name}\"\n campaign_creative=\"${chip.campaign?.creative}\"\n campaign_position=\"${chip.campaign?.position}\"\n >\n ${chip.label}\n </nb-chip>\n </a>\n </li>\n `\n }\n\n // Called from events-manager.js, coupled code\n updateLayout() {\n this.geometry = this.getGeometry()\n }\n\n updateBubbles(sectionId) {\n const { bubbles = {} } = this.refs\n for (const bubbleId in bubbles) {\n const bubble = bubbles[bubbleId]\n const state = bubbleId === sectionId ? 'selected' : 'default'\n if (typeof bubble.setAttribute === 'function') {\n bubble.setAttribute('state', state)\n }\n }\n }\n\n updateChips(sectionId) {\n const { chips = {} } = this.refs\n for (const chipId in chips) {\n const chip = chips[chipId]\n const isChecked = chipId === sectionId ? 'true' : 'false'\n chip.setAttribute && chip.setAttribute('checked', isChecked)\n }\n }\n\n async updateSlider(sectionId, _index) {\n let index = _index\n const slider = await this.refs.sliderChip\n if (slider) {\n if (typeof _index === 'undefined') {\n const links = slider.querySelectorAll('a[data-href]')\n links.forEach((link, i) => {\n if (link.getAttribute('data-href') === sectionId) {\n index = i\n }\n })\n }\n if (index && slider && slider.goToSlide) {\n slider.goToSlide(index)\n }\n }\n }\n\n emit(event) {\n dispatchEvent({ element: this, ...event })\n }\n\n async scroll(link, index) {\n this.isScrolling = true\n const linkHref = link.getAttribute('data-href')\n const target = linkHref\n const { header, chips } = this.geometry\n\n // When clicking on first anchor we force height to 0 because sticky bar is usually not displayed yet\n const stickyBarHeight = index === 0 ? 0 : chips.height\n\n const scrollPaddingTop = header.top + header.height + stickyBarHeight\n const scrollOptions = { scrollPaddingTop }\n\n await scrollTo(`[data-id=\"${target}\"]`, scrollOptions)\n this.isScrolling = false\n\n // After scrolling visually, we need to give focus to the section for keyboard navigation\n const targetEl = document.querySelector(`[data-id=\"${target}\"]`)\n targetEl.focus({ preventScroll: true })\n }\n\n track() {\n //no-op as per https://nestle.atlassian.net/browse/DIGEX-12371?focusedCommentId=2903998\n }\n\n getGeometry() {\n const $header = document.querySelector('.Header__top')\n const $stickyBar = document.querySelector('nb-plp-sticky-bar')\n\n const headerRect = $header?.getBoundingClientRect() || { height: 0, y: 0 }\n const stickyBarRect = $stickyBar?.getBoundingClientRect() || { height: 0, y: 0 }\n\n return {\n header: { height: headerRect.height, top: headerRect.y },\n chips: { height: stickyBarRect.height, top: stickyBarRect.y }\n }\n }\n\n onSectionChange(entries) {\n const entry = entries[0]\n\n if (entry.isIntersecting && !this.isScrolling) {\n const { id = '' } = entry.target.dataset\n\n dispatchEvent({\n eventName: EVENT_NAVIGATION_SECTION_CHANGE,\n args: { sectionId: id || entry.target.getAttribute('data-id') }\n })\n }\n }\n\n disconnectedCallback() {\n eventsHelper.remove(this.eventsListeners)\n this.scrollObserver.destroy('[data-id]')\n }\n}\n\ncustomElements.get('nb-navigation-bubbles') ||\n customElements.define('nb-navigation-bubbles', NavigationBubbles)\n\nexport default NavigationBubbles\n","// TODO move the responsabiliy of the links to the correct component\nimport eventsHelper from '@kissui/helpers/src/events.helpers'\nimport { readEvent, dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nimport { EVENT_HEADER_POSITION_CHANGED, EVENT_SLIDER_READY } from '@kissui/components'\n\nimport { EVENT_NAVIGATION_SECTION_CHANGE } from '../data/constants'\n\nconst eventsManager = rootElement => {\n const bindSliderLinksEvents = slider => {\n // We need to wait for EVENT_SLIDER_READY before getting geometry for chips slider to have height\n rootElement.geometry = rootElement.getGeometry()\n\n const links = slider.querySelectorAll('a')\n\n for (const [index, link] of links.entries()) {\n link.addEventListener('click', onSliderLinkClick.bind(this, index))\n }\n }\n\n const onSliderLinkClick = (index, $event) => {\n $event.preventDefault()\n\n const link = $event.target.closest('a')\n\n if (link) {\n dispatchEvent({\n eventName: EVENT_NAVIGATION_SECTION_CHANGE,\n args: { sectionId: link.getAttribute('data-href'), index }\n })\n\n rootElement.scroll && rootElement.scroll(link, index)\n window.location.hash = link.getAttribute('data-href')\n\n let finalLabel = '',\n plpListLabel = '',\n bubbleLabel = ''\n if (rootElement.closest('nb-plp-sticky-bar')) {\n bubbleLabel = link.querySelector('nb-chip label span').textContent\n plpListLabel = rootElement.props.selected_nav_link_label || ''\n } else {\n plpListLabel = rootElement.props.selected_nav_link_label || ''\n if (link.nextElementSibling.textContent) {\n bubbleLabel = link.nextElementSibling.textContent\n } else {\n bubbleLabel = link.getAttribute('aria-label')\n }\n }\n finalLabel = plpListLabel ? `${plpListLabel} : ${bubbleLabel}` : `${bubbleLabel}`\n rootElement.track(finalLabel)\n }\n }\n\n const onSectionChange = $event => {\n const { sectionId, index } = readEvent($event)\n\n rootElement.updateBubbles && rootElement.updateBubbles(sectionId)\n rootElement.updateChips && rootElement.updateChips(sectionId)\n rootElement.updateSlider && rootElement.updateSlider(sectionId, index)\n }\n\n const createListeners = slider => {\n const eventListeners = []\n\n if (slider) {\n eventListeners.push({\n element: rootElement,\n type: EVENT_SLIDER_READY,\n listener: bindSliderLinksEvents.bind(this, slider),\n options: { once: true }\n })\n }\n eventListeners.push({\n element: window,\n type: EVENT_NAVIGATION_SECTION_CHANGE,\n listener: onSectionChange\n })\n eventListeners.push({\n element: window,\n type: EVENT_HEADER_POSITION_CHANGED,\n listener: rootElement.updateLayout.bind(rootElement)\n })\n\n eventsHelper.add(eventListeners)\n\n return eventListeners\n }\n\n return { createListeners }\n}\n\nexport default eventsManager\n","import { getDataLayer } from '@kissui/helpers/src/dataLayer'\n\nexport async function setPLPDataProvider() {\n window.getPLPData = window.getPLPData || getPLPData\n}\n\nexport async function getPLPData() {\n return await window.plpData\n}\n\nexport async function market() {\n return napi.market().read() // eslint-disable-line\n}\n\nexport function getCurrency() {\n return getDataLayer().currency\n}\n\nexport async function getPriceFormatter() {\n return napi.priceFormat() // eslint-disable-line\n}\n","const runningExperiments = new Set<string>()\n\nexport function runningExperiment(experiment: string): Boolean {\n return runningExperiments.has(experiment)\n}\n\nexport function enableExperiment(experiment: string): void {\n runningExperiments.add(experiment)\n console.info('Running experiments:', ...runningExperiments.values())\n}\n\nexport function disableExperiment(experiment: string): void {\n runningExperiments.delete(experiment)\n console.info('Running experiments:', ...runningExperiments.values())\n}\n\n// List Current experiments\nexport const EXPLICIT_FILTERS = 'EXPLICIT_FILTERS'\n","// MAIN ID BLOCKS\nexport const FILTER_MAIN_BLOCK_ID = 'filtersPLP'\nexport const SORT_MENU_ID = 'plp-sort-menu'\nexport const SORT_MENU_MOBILE_ID = 'plp-sort-menu-mobile'\nexport const POPIN_ID = 'plp-filter-popin'\nexport const NAVIGATION_MAIN_BLOCK_ID = 'navigationPLP'\nexport const PRODUCTS_LIST_MAIN_BLOCK_ID = 'productsListPLP'\nexport const PRODUCTS_RESULTS_MAIN_BLOCK_ID = 'productsResultsPLP'\nexport const PRODUCTS_RESULTS_HEADER_ID = 'productsResultsHeaderPLP'\nexport const FILTER_BUTTON = 'plp-filter-cta'\nexport const CB_RESULTS_TOTAL_ID = 'cb-results-total-id'\nexport const MY_RECOMMENDATIONS_ID = 'my-recommendations'\n\n// URL variable\nexport const QUERY_URL_PARAMETER_FILTERS = 'filters'\nexport const QUERY_URL_PARAMETER_SORT = 'sort'\n","/**\n filtersPLP:\n navigationPLP\n productsListPLP\n productsResultsPLP\n\n data-request: not mutable // not to be changed\n data-response: mutable // changed by the component\n\n\n Don't:\n const dict = {\n 'foo': 1,\n 'bar': 2\n}\n\n Better:\n const dict = new Map([\n ['foo', 1],\n ['bar', 2]\n ])\n\n dict.get('foo');\n dict.set('foo', 2);\n dict.has('baz');\n dict.keys()\n\n */\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { getPLPData, getPriceFormatter, market } from '@kissui/plp-data'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../config/experiments'\nimport { MY_RECOMMENDATIONS_ID } from '../config/constants'\n\n// todo cache data if not changes\nconst appData = {\n _productsFlat: undefined,\n sessionId: '',\n\n init: async function (plpType) {\n window.plpDataType = plpType\n window.getPLPData = window.getPLPData || getPLPData\n this.set('sessionId', (Math.random() + 1).toString(36).substring(7))\n this.set('filtersSelected', [])\n this.set('sortCurrent', {})\n this.set('sortOptions', [])\n this.set('options', {})\n\n return window.getPLPData()\n },\n\n async reload() {\n this.set('sessionId', (Math.random() + 1).toString(36).substring(7))\n this.set('products', [])\n this.set('filters', [])\n this.set('filtersSelected', [])\n this.set('options', {})\n\n this._productsFlat = undefined\n\n return window.getPLPData()\n },\n\n // review if this pattern about set & get it's ok (I don't think so, because should be unmutable)\n set: function (key, value) {\n this[key] = value\n },\n get: function (key) {\n return this[key] || null\n },\n initPriceFormatter: function () {\n return getPriceFormatter()\n },\n initCurrency: function () {\n return market()\n },\n filters: [],\n products: [],\n productsList: function () {\n return this.products\n },\n\n getProducts() {\n if (this._productsFlat && this._productsFlat.length) {\n return this._productsFlat\n }\n\n this._productsFlat = this.products.reduce((acc, product) => {\n return acc.concat(product.products)\n }, [])\n\n return this._productsFlat\n },\n\n productsListFiltered: function ({ withSort = true } = {}) {\n const selectedFilters = this.get('filtersSelected')\n const filterPredicate = runningExperiment(EXPLICIT_FILTERS)\n ? filterProductsByFilterType(selectedFilters)\n : filterProductsByAllFilters(selectedFilters)\n const filteredList = this.getProducts().filter(filterPredicate)\n const sortCurrent = this.get('sortCurrent') ?? {}\n\n return withSort ? sortProducts(filteredList, sortCurrent) : filteredList\n },\n productsFilteredCount: function () {\n return this.productsListFiltered({ withSort: false }).length\n },\n /*\n * todo: refactor this function\n * fireAll should be true always, it's only true to performance improvement\n * the solution should be in the subscription site, right now we are subscribe to all changes,\n * but this is wrong should be subscribed only to some changes of the store using a seed/key\n * */\n filtersUpdate: function (filterSelection, fireAll = true) {\n const filter = this.get('filters').find(f => f.key === filterSelection.key)\n\n if (!filter) {\n return\n }\n\n setFilterValue(\n this.get('filtersSelected'),\n filter,\n filterSelection.value,\n filterSelection.selected\n )\n\n if (runningExperiment(EXPLICIT_FILTERS)) {\n this.filterChipsUpdate()\n }\n\n fireAll && this.fire()\n },\n filtersUpdateMultiple(key, valueSelections = Map()) {\n const filter = this.get('filters').find(f => f.key === key)\n const filtersSelected = this.get('filtersSelected')\n\n valueSelections.forEach((selected, value) => {\n const selectedCurrently = filtersSelected.find(\n f => f.key === filter.key && filterValueIsEqual(f, value)\n )\n\n if (selectedCurrently && selected) return\n setFilterValue(filtersSelected, filter, value, selected)\n })\n\n this.filterChipsUpdate()\n this.fire()\n },\n filtersSelectedWithLabel: function () {\n return this.get('filtersSelected').map(filter => {\n const { key: filterKey, value: filterValue } = filter\n const foundFilter = this.get('filters').find(f => f.key === filterKey)\n const filterLabel = foundFilter?.values.find(v => v.value === filterValue)?.label\n return {\n categoryTitle: foundFilter?.title,\n label: filterLabel,\n key: filterKey,\n value: filterValue\n }\n })\n },\n filtersSelectedCount: function () {\n return this.get('filtersSelected')?.length ?? 0\n },\n // todo modify this flow because the serilized attributes shouldn't be necessary\n filtersSelectedSerialized: function () {\n const filters = [this.get('sortCurrent'), ...this.get('filtersSelected')]\n return stringifyForAttribute(filters)\n },\n filtersReset: function () {\n this.set('filtersSelected', [])\n this.get('filters').forEach(filter => {\n filter.values.forEach(value => {\n value.selected = false\n value.disabled = false\n })\n })\n const sortCurrent = this.get('sortOptions')\n sortCurrent?.length && this.set('sortCurrent', sortCurrent[0])\n\n if (runningExperiment(EXPLICIT_FILTERS)) {\n this.filterChipsUpdate()\n }\n\n this.fire()\n },\n filterChipsUpdate() {\n const selectedFilters = this.get('filtersSelected')\n const productsList = this.getProducts()\n this.get('filters').forEach(filter => {\n filter.values.forEach(filterChip => {\n // hide product counts\n filterChip.productCount = null\n\n // maintain filter's presence when other filters in same group are selected\n const withoutGroup = selectedFilters.filter(\n selected => selected.key !== filterChip.filterKey\n )\n const onlyFilterInGroup = [...withoutGroup, filterChip]\n const predicate = filterProductsByFilterType(onlyFilterInGroup)\n filterChip.disabled = !productsList.find(predicate)\n })\n })\n },\n\n observers: [],\n subscribe: function (fn) {\n this.observers.push(fn)\n },\n unsubscribe: function (fnToRemove) {\n this.observers = this.observers.filter(fn => {\n if (fn !== fnToRemove) {\n return fn\n }\n })\n },\n fire: function () {\n this.observers.forEach(fn => {\n fn.call()\n })\n }\n}\n\nexport default appData\n\nfunction doesProductMatchFilter(product, filter) {\n const filterValue = filter.value\n const productPropValue = product[filter.filterKey || filter.key]\n switch (typeof productPropValue) {\n case 'string':\n return productPropValue === filterValue\n case 'number':\n return JSON.parse(`[${filterValue}]`).includes(productPropValue)\n default: {\n if (filterValue === MY_RECOMMENDATIONS_ID) {\n const recommendationProducts = appData.get('recommendation')?.products ?? []\n return recommendationProducts.some(p => p.id === product.id)\n }\n\n // check array values or\n // default to false for nullish values\n return productPropValue?.includes(filterValue) || false\n }\n }\n}\n\nfunction groupFiltersByType(filters = []) {\n /*\n group selected filters by key, e.g.\n {\n intensity: [1, 2, 3],\n collection: [a, b, c],\n }\n */\n return filters.reduce((all, filter) => {\n const filterKey = filter.key\n const current = all[filterKey] || []\n return {\n ...all,\n [filterKey]: [...current, filter]\n }\n }, {})\n}\n\nfunction filterProductsByFilterType(filters) {\n const groups = groupFiltersByType(filters)\n const types = Object.keys(groups)\n return (product, index, products) => {\n /*\n does product match at least one filter in each group, e.g.\n {\n intensity: [1, 2, 3],\n collection: [a, b, c],\n }\n matches\n {\n product: { intensity: 1 },\n product: { collection: a },\n }\n */\n return types.every(type => {\n return !!groups[type].find(filter => {\n return (\n doesProductMatchFilter(product, filter) &&\n products.findIndex(p => p.id === product.id) === index // Deduplicates\n )\n })\n })\n }\n}\n\nfunction filterProductsByAllFilters(filters = []) {\n return (product, index, products) => {\n return (\n // check that the product matches every filter selected\n filters.every(filter => {\n return doesProductMatchFilter(product, filter)\n }) && products.findIndex(p => p.id === product.id) === index // Deduplicates\n )\n }\n}\n\nfunction filterValueIsEqual(filterValue, value) {\n return Array.isArray(filterValue.value)\n ? filterValue.value.join(',') === value\n : filterValue.value === value\n}\n\nfunction setFilterValue(filtersSelected, filter, value, selected) {\n filter.values.forEach(filterValue => {\n // todo refactor this function\n let valueIsEqual = filterValueIsEqual(filterValue, value)\n if (!valueIsEqual) {\n return\n }\n\n filterValue.selected = selected\n if (selected) {\n filtersSelected.push({\n key: filter.key,\n value: value,\n color: filterValue.color || null\n })\n } else {\n filtersSelected.splice(\n 0,\n filtersSelected.length,\n ...filtersSelected.filter(\n fSelected => !(fSelected.key === filter.key && fSelected.value === value)\n )\n )\n }\n })\n}\n\nfunction createSorter({ key, order }) {\n const isAscending = order === 'asc'\n\n return (a, b) => {\n if (a[key] < b[key]) {\n return isAscending ? -1 : 1\n }\n if (a[key] > b[key]) {\n return isAscending ? 1 : -1\n }\n return 0\n }\n}\n\nfunction sortProducts(products, { key, order }) {\n const sorter = createSorter({ key, order })\n return [\n ...products.filter(p => p.inStock).sort(sorter),\n ...products.filter(p => !p.inStock).sort(sorter)\n ]\n}\n","import { customEvent } from '@kissui/helpers/src/gtmEvents'\nimport zoneTracking from '@kissui/helpers/src/assets/js/zoneTracking'\nimport { FILTER_MAIN_BLOCK_ID } from '../config/constants'\nimport appData from './plp.data'\n\nconst updateQueryStringParameter = (uri, key, value) => {\n const re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i')\n const separator = uri.indexOf('?') !== -1 ? '&' : '?'\n return uri.match(re)\n ? uri.replace(re, '$1' + key + '=' + value + '$2')\n : uri + separator + key + '=' + value\n}\n\nexport const updateUrlVariable = (variable, queryArray) => {\n // we are removing the hash from the url\n const [path] = window.location.href.split('#')\n const value = encodeURIComponent(JSON.stringify(queryArray))\n const url = updateQueryStringParameter(path, variable, value)\n history.pushState(null, null, url)\n}\n\nexport const getUrlVariable = key => {\n const queryString = window.location.search\n const param = new URLSearchParams(queryString).get(key)\n\n if (!param) {\n return null\n }\n\n try {\n return JSON.parse(decodeURIComponent(param))\n } catch (err) {\n console.error('plp.actions-getUrlVariable: url parsing failed')\n return null\n }\n}\n\nconst defaultTracking = 'none selected'\n\nconst getSortTracking = data => {\n const { isSorted, sortKey, sortOrder } = data\n return `sort:${isSorted ? `${sortOrder}|${sortKey}` : defaultTracking}`\n}\n\nconst getFilterTracking = data => {\n const { isFiltered, filtersSelected } = data\n return `characteristics:${\n isFiltered\n ? // unique array of filter keys\n [...new Set(filtersSelected.map(filter => filter.key))].join(',')\n : defaultTracking\n }`\n}\n\nexport const trackInteraction = (data = {}) => {\n const { isSorted, isFiltered } = data\n const eventAction = 'PLP Filter click'\n\n if (!isSorted && !isFiltered) {\n customEvent({\n eventAction,\n eventLabel: defaultTracking\n })\n return\n }\n\n customEvent({\n eventAction,\n eventLabel: [getSortTracking(data), getFilterTracking(data)].join('|')\n })\n}\n\nexport const trackLoad = () => {\n const campaign = appData.get('campaign')\n const node = window.document.getElementById(FILTER_MAIN_BLOCK_ID)\n if (campaign) {\n zoneTracking(node, campaign)\n }\n}\n\nexport const cleanFilterDataXSS = (source, data) => {\n const cleanData = []\n data.forEach(item => {\n source.forEach(sourceItem => {\n if (sourceItem.key === item.key) {\n sourceItem.values.forEach(value => {\n if (item.value === value.value) {\n cleanData.push({\n key: sourceItem.key,\n value: value.value,\n selected: true\n })\n }\n })\n }\n })\n })\n\n return cleanData\n}\nexport const cleanSortDataXSS = (source, data) => {\n return [...source].filter(item => item.key === data.key && item.order === data.order)\n}\n","import { signal } from '@preact/signals'\nimport type { ModuleData } from './CremaService'\n\ntype ModuleName = 'ProductsList' | 'ProductDetails' | 'HeaderNavigation'\n\ntype PageStore = {\n [key: string]: string | undefined\n pageHtml?: string\n}\n\ntype SignalStore = {\n ProductsList: ModuleData\n ProductDetails: ModuleData\n HeaderNavigation: ModuleData\n}\n\ntype WindowCreamService = {\n pageStores: Map<string, PageStore>\n signalStore: SignalStore\n}\n\ndeclare global {\n interface Window {\n __crema_service__: WindowCreamService\n }\n}\n\n// Stored on window to allow sharing between page builder sections\n// Ideally this would be replaced by loading this service as a shared bundle in future\nwindow.__crema_service__ = window.__crema_service__ || {\n pageStores: new Map<string, PageStore>(),\n signalStore: {\n ProductsList: signal(undefined),\n ProductDetails: signal(undefined),\n HeaderNavigation: signal(undefined)\n }\n}\n\nconst pageStores = window.__crema_service__.pageStores\nconst signalStore = window.__crema_service__.signalStore\n\nexport function clear() {\n pageStores.clear()\n signalStore.ProductsList.value = undefined\n signalStore.ProductDetails.value = undefined\n signalStore.HeaderNavigation.value = undefined\n}\n\nexport function getPageHtml(url: string): string | undefined {\n const store = getStore(url)\n return store.pageHtml\n}\n\nexport function setPageHtml(url: string, html: string): void {\n const store = getStore(url)\n store.pageHtml = html\n}\n\nexport function getModuleData(moduleName: ModuleName): ModuleData {\n return signalStore[moduleName]\n}\n\nexport function setModuleData(moduleName: ModuleName, data: object | undefined): void {\n signalStore[moduleName].value = data\n}\n\nfunction getStore(url: string): PageStore {\n if (!pageStores.has(url)) {\n pageStores.set(url, {})\n }\n\n return pageStores.get(url) as PageStore\n}\n","import { Signal, batch } from '@preact/signals'\n\nimport * as store from './Store'\n\nconst parser = new DOMParser()\n\nexport type ModuleData<T = any> = Signal<Record<PropertyKey, T> | undefined>\n\nexport type HeaderNavigationMenuItem = {\n title: string,\n link: {\n url: string\n }\n}\n\nexport async function loadFromUrl(url: string, cacheOnly: boolean = false): Promise<void> {\n return batch(async () => {\n let html = store.getPageHtml(url)\n\n if (!html) {\n try {\n html = await fetchHtml(url)\n store.setPageHtml(url, html)\n } catch (error) {\n console.debug('Failed to load HTML', error)\n return\n }\n }\n\n if (!cacheOnly) {\n store.setModuleData('HeaderNavigation', parseModuleData(html, 'HeaderNavigationBar'))\n store.setModuleData('ProductsList', parseModuleData(html, 'ProductList'))\n store.setModuleData('ProductDetails', parseModuleData(html, 'ProductDetails'))\n }\n })\n}\n\nexport function loadFromPage(window: Window): void {\n batch(() => {\n const html = window.document.documentElement.innerHTML\n\n store.setModuleData('HeaderNavigation', parseModuleData(html, 'HeaderNavigationBar'))\n store.setModuleData('ProductsList', parseModuleData(html, 'ProductList'))\n store.setModuleData('ProductDetails', parseModuleData(html, 'ProductDetails'))\n\n // Only cache if we found either the PLP data or the PDP data\n if (\n store.getModuleData('HeaderNavigation').value &&\n (store.getModuleData('ProductsList').value ||\n store.getModuleData('ProductDetails').value)\n ) {\n store.setPageHtml(window.location.href, html)\n }\n })\n}\n\nexport function getProductsList(): ModuleData {\n return store.getModuleData('ProductsList')\n}\n\nexport function getProductDetails(): ModuleData {\n return store.getModuleData('ProductDetails')\n}\n\nexport function getHeaderNavigation(): ModuleData {\n return store.getModuleData('HeaderNavigation')\n}\n\nfunction parseModuleData(html: string, moduleName: string): ModuleData | undefined {\n try {\n const moduleScript = parseHtml(html, moduleName)\n return parseProductScript(moduleScript) as ModuleData\n } catch (error) {\n // Failed to parse module, but this could be expected if the module is not present\n return undefined\n }\n}\n\nasync function fetchHtml(url: string): Promise<string> {\n console.debug('Fetching HTML from', url)\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(`Failed to fetch from \"${url}\" - ${response.status}:${response.statusText}`)\n }\n\n const html = await response.text()\n\n return html\n}\n\nfunction parseHtml(html: string, moduleName: string): string {\n const document = parser.parseFromString(html, 'text/html')\n\n const scripts = document.querySelectorAll('script')\n for (const script of scripts) {\n const content = script.textContent ?? ''\n if (content.includes(`\"module\":\"${moduleName}\"`)) return content\n }\n\n throw new Error(`Failed to find module \"${moduleName}\"`)\n}\n\nfunction parseProductScript(script: string): object {\n const lines = script.split('\\n')\n for (const line of lines) {\n const trimmed = line.trim()\n if (trimmed.startsWith('window.ui.push(')) {\n const jsonString = trimmed.replace('window.ui.push(', '').slice(0, -2)\n return JSON.parse(jsonString)\n }\n }\n\n throw new Error('Failed to find UI data in script')\n}\n","import appData from './plp.data'\nimport {\n updateUrlVariable,\n getUrlVariable,\n trackInteraction,\n cleanFilterDataXSS,\n cleanSortDataXSS,\n trackLoad\n} from './plp.actions'\nimport { QUERY_URL_PARAMETER_FILTERS, QUERY_URL_PARAMETER_SORT } from '../config/constants'\nimport { getTrackingData } from '../helpers/tracking'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../config/experiments'\nimport { loadFromUrl, getProductsList, loadFromPage } from '@kissui/crema-service'\nimport { filterActionEvent, filterTrackingFromPlpFilters } from '@kissui/helpers/src/gtmEvents'\n\n// todo find a better way to do this\nlet plpData = {}\nlet appStates = {}\n// one solution is make promise inside of promise\nconst isSorted = data => {\n return (\n data.get('sortCurrent').key !== data.get('sortOptions')[0].key ||\n data.get('sortCurrent').order !== data.get('sortOptions')[0].order\n )\n}\n\nconst isFiltered = data => data.filtersSelectedCount() !== 0\n\nexport default {\n onload: {\n process: function (e, handlePostEvent) {\n const { plpType, appStatesHandler } = e.detail.value\n\n appStates = appStatesHandler\n\n // initialize the store\n const init = appData.init(plpType)\n appData.set('plpType', plpType || null)\n appData.set('innerWidth', window.innerWidth)\n appData.set('innerHeight', window.innerHeight)\n\n // get market data\n const currency = appData.initCurrency()\n const priceFormatter = appData.initPriceFormatter()\n\n Promise.all([init, currency, priceFormatter])\n .then(values => {\n plpData = values[0]\n appData.set('currency', values[1].currency)\n appData.set('priceFormatter', values[2])\n handlePostEvent(new CustomEvent('onloadSuccess'))\n })\n .catch(err => {\n console.error(err)\n handlePostEvent(new CustomEvent('onloadError', { detail: { err } }))\n })\n\n if (runningExperiment(EXPLICIT_FILTERS)) {\n loadFromPage(window)\n }\n }\n },\n onReload: {\n async process(e, handlePostEvent) {\n const { plpType, url } = e.detail.value\n\n let data\n try {\n await loadFromUrl(url)\n data = getProductsList().value\n } catch (err) {\n console.error(err)\n return handlePostEvent(new CustomEvent('onloadError', { detail: { err } }))\n }\n\n window.plpData = Promise.resolve({\n techno: 'unknown', // Only used by mocks?\n data\n })\n\n simulatePageChange(url)\n\n try {\n // Reinitialize the store\n const [_data, currency, priceFormatter] = await Promise.all([\n appData.reload(plpType),\n appData.initCurrency(),\n appData.initPriceFormatter()\n ])\n plpData = _data // NOTE: Getting this from the appData is rather redundant\n appData.set('plpType', plpType || null)\n appData.set('innerWidth', window.innerWidth)\n appData.set('innerHeight', window.innerHeight)\n appData.set('currency', currency.currency)\n appData.set('priceFormatter', priceFormatter)\n handlePostEvent(new CustomEvent('onloadSuccess'))\n appData.fire()\n } catch (error) {\n console.error(error)\n handlePostEvent(new CustomEvent('onloadError', { detail: { error } }))\n }\n }\n },\n onloadSuccess: {\n nextState: function (e) {\n return appStates.onloadSuccess(e)\n }\n },\n onloadError: {\n nextState: function (e) {\n return appStates.showError(e)\n }\n },\n onMergeData: {\n // triggered from plp.app.js\n async process(e, handlePostEvent) {\n const {\n filtersService,\n productService,\n dataSortService,\n pageBuilderProps,\n recommendationService\n } = e.detail.value\n\n const recommendationInstance = recommendationService(pageBuilderProps)\n const dataToMerge = productService(\n plpData,\n pageBuilderProps,\n recommendationInstance?.recommendation\n )\n\n mergeData(dataToMerge)\n\n // Here we merge the data in a lazy way, the first interation is the\n // half-recommended data, missing the loading of products, which, since\n // it comes from Martech, may take longer than the rest. Then, in order\n // not to block the rest, while the spinner is displayed, the mergeData\n // is loaded and processed again.\n if (recommendationInstance?.readyToLoadProducts?.()) {\n await recommendationInstance.loadProducts()\n const newData = productService(\n plpData,\n pageBuilderProps,\n recommendationInstance?.recommendation\n )\n appData.set('recommendation', recommendationInstance.recommendation)\n mergeData(newData)\n appData.fire()\n }\n\n function mergeData(data = {}) {\n mergeProductData(data, pageBuilderProps)\n mergeFilters(data, { pageBuilderProps, dataSortService, filtersService })\n setUrlOverrides()\n handleExperiments()\n trackLoad(pageBuilderProps)\n handlePostEvent(new CustomEvent('switchProductsPage'))\n }\n }\n },\n switchProductsPage: {\n nextState: function (e) {\n if (isSorted(appData) || isFiltered(appData)) {\n return appStates.readyForShowResults(e)\n } else {\n return appStates.readyForPlay(e)\n }\n }\n },\n onMergeDataError: {\n nextState: function (e) {\n return appStates.showError(e)\n }\n },\n onFilter: {\n process: (e, handlePostEvent) => {\n const filtersSelected = appData.get('filtersSelected')\n\n updateUrlVariable(QUERY_URL_PARAMETER_FILTERS, appData.get('filtersSelected'))\n updateUrlVariable(QUERY_URL_PARAMETER_SORT, {\n key: appData.get('sortCurrent').key,\n order: appData.get('sortCurrent').order\n })\n\n handlePostEvent(new CustomEvent('switchProductsPage'))\n\n // condition check to not send empty filter list, clear event is handled in different place\n if (runningExperiment(EXPLICIT_FILTERS) && filtersSelected.length) {\n filterActionEvent(\n 'filter apply',\n ...filterTrackingFromPlpFilters(filtersSelected),\n null,\n e.detail.value\n )\n }\n }\n },\n onSort: {\n process: (e, handlePostEvent) => {\n updateUrlVariable(QUERY_URL_PARAMETER_FILTERS, appData.get('filtersSelected'))\n updateUrlVariable(QUERY_URL_PARAMETER_SORT, {\n key: appData.get('sortCurrent').key,\n order: appData.get('sortCurrent').order\n })\n\n handlePostEvent(new CustomEvent('switchProductsPage'))\n\n trackInteraction({\n isSorted: isSorted(appData),\n isFiltered: isFiltered(appData),\n sortKey: appData.get('sortCurrent').key,\n sortOrder: appData.get('sortCurrent').order,\n filtersSelected: appData.get('filtersSelected')\n })\n }\n },\n onloadFilter: {\n process: function (e, handlePostEvent) {\n handlePostEvent(new CustomEvent('onloadFilterSuccess', { detail: { e } }))\n // handlePostEvent(new CustomEvent('onloadFilterError'))\n }\n },\n onloadFilterSuccess: {\n nextState: function (e) {\n return appStates.readyForFilter(e)\n }\n },\n onloadFilterError: {\n nextState: function (e) {\n return appStates.showError(e)\n }\n }\n}\n\nfunction simulatePageChange(url) {\n try {\n const urlObj = new URL(window.location)\n urlObj.pathname = url\n window.history.pushState({}, '', urlObj)\n // TODO: Most likely need to trigger the matching tracking call for a page load\n } catch (error) {\n console.error('Failed to simulate page change', error)\n }\n}\n\nfunction mergeProductData(data, pageBuilderProps) {\n appData.set('enabledTechnologies', data.enabledTechnologies)\n appData.set(\n 'currentTechnology',\n data.enabledTechnologies\n ?.filter(tech => tech.isSelected)[0]\n ?.id?.split('/')\n .at(-1) ?? null\n )\n\n appData.set('products', data.categories)\n appData.set('translations', data.translations)\n appData.set('nav_links', data.nav_links)\n appData.set('bubbles', data.bubbles)\n appData.set('hide_sort_and_filter', pageBuilderProps.options?.hide_sort_and_filter)\n appData.set('options', pageBuilderProps.options)\n appData.set('maxIntensity', data.maxIntensity)\n appData.set('campaign', getTrackingData(pageBuilderProps))\n}\n\nfunction mergeFilters(data, { pageBuilderProps, dataSortService, filtersService }) {\n const sort = dataSortService(pageBuilderProps)\n const filters = filtersService(\n appData.get('products'),\n pageBuilderProps,\n data.categoriesExtraData,\n data.translations,\n {\n priceFormatter: appData.get('priceFormatter'),\n currency: appData.get('currency')\n }\n )\n\n appData.set('filters', filters)\n appData.set('sortOptions', sort)\n appData.set('sortCurrent', sort[0])\n}\n\nfunction setUrlOverrides() {\n const urlFilters = getUrlVariable(QUERY_URL_PARAMETER_FILTERS)\n if (urlFilters && urlFilters.length > 0) {\n const filterData = cleanFilterDataXSS(appData.get('filters'), urlFilters)\n if (filterData.length > 0) {\n filterData.forEach((filter, index) => {\n const isLast = index === filterData.length - 1\n appData.filtersUpdate(filter, isLast)\n })\n }\n }\n\n const urlSort = getUrlVariable(QUERY_URL_PARAMETER_SORT)\n if (urlSort) {\n const sortData = cleanSortDataXSS(appData.get('sortOptions'), urlSort)\n if (sortData.length > 0) {\n appData.set('sortCurrent', sortData[0])\n }\n }\n}\n\nfunction handleExperiments() {\n if (runningExperiment(EXPLICIT_FILTERS)) {\n appData.filterChipsUpdate()\n\n const notCurrentTech = appData\n .get('enabledTechnologies')\n .find(tech => tech.url !== window.location.pathname)\n if (notCurrentTech) {\n loadFromUrl(notCurrentTech.url, true)\n }\n }\n}\n","export function getTrackingData(pageBuilderProps) {\n // Backward compatibility for when data was at root of object\n const {\n campaign_id,\n campaign_name,\n campaign_creative = null,\n campaign_position\n } = pageBuilderProps\n\n if (!campaign_creative) {\n const { campaign = null } = pageBuilderProps\n return campaign\n }\n\n return {\n id: campaign_id,\n name: campaign_name,\n position: campaign_position,\n creative: campaign_creative\n }\n}\n","import appEvents from './plp.events'\n\nexport default (customEventName, eventData, eventFn = null) => {\n stateTransitionsManager(\n new CustomEvent(customEventName, {\n detail: {\n value: eventData,\n fn: eventFn\n }\n })\n )\n}\n\nconst stateTransitionsManager = event => {\n appEvents[event.type]?.process(event, handlePostEvent)\n}\n\nconst handlePostEvent = e => {\n appEvents[e.type]?.nextState(e)\n}\n","import { EVENT_SORT_BY_CHANGE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.mobileDropDown.scss'\nimport appData from '../../../store/plp.data'\nimport { SORT_MENU_MOBILE_ID, SORT_MENU_ID } from '../../../config/constants'\nimport { escapeHtml } from '@kissui/helpers/src/utils'\n\nclass PlpFilterPopinMobileDropdown extends NespressoElement {\n #SORT_MENU_ID = SORT_MENU_MOBILE_ID\n\n constructor() {\n super()\n this.formatSortSeparator = '::'\n appData.subscribe(this.componentUpdated.bind(this))\n this.boundOnSortChange = this.onSortChange.bind(this)\n }\n\n onStart() {\n const data = document.getElementById(SORT_MENU_ID)?.getAttribute('data')\n if (data) {\n this.template = `\n <nb-dropdown\n id=\"${this.#SORT_MENU_ID}\"\n data-testId=\"plp-sort-menu-mobile\"\n data=\"${escapeHtml(data)}\"></nb-dropdown>`\n }\n }\n\n onReady() {\n this.sortButton = document.getElementById(this.#SORT_MENU_ID)\n this.sortButton?.addEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n }\n\n componentUpdated() {\n const { key, order } = appData.get('sortCurrent')\n this.sortButton?.setSelected(`${key}${this.formatSortSeparator}${order}`)\n }\n\n onSortChange(e) {\n const [key, order] = e.detail.selected.value.split(this.formatSortSeparator)\n appData.set('sortCurrent', { key, order })\n }\n\n onDestroy() {\n this.sortButton?.removeEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n appData.unsubscribe(this.componentUpdated)\n }\n}\n\ncustomElements.get('plp-filter-sort-mobile') ||\n customElements.define('plp-filter-sort-mobile', PlpFilterPopinMobileDropdown)\n\nexport default PlpFilterPopinMobileDropdown\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.content.scss'\nimport '../plp.filterImports'\nimport appData from '../../../store/plp.data'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../../../config/experiments'\n\nclass PlpFilterPopinContent extends NespressoElement {\n #filters = []\n\n constructor() {\n super()\n appData.subscribe(this.onStoreChanges.bind(this))\n }\n\n onStoreChanges() {\n if (runningExperiment(EXPLICIT_FILTERS)) {\n // Force re-init if the filters have changed\n if (this.#filters !== appData.get('filters')) {\n this.onStart()\n this.render(true)\n this.onReady()\n }\n }\n\n this.querySelectorAll('nb-chip').forEach(chip => {\n chip.setAttribute(\n 'disabled',\n '' + this.isDisabled(chip.dataset.filterKey, chip.dataset.filterValue)\n )\n chip.setAttribute(\n 'checked',\n '' + this.isChecked(chip.dataset.filterKey, chip.dataset.filterValue)\n )\n\n if (runningExperiment(EXPLICIT_FILTERS)) {\n const labelEl = chip.querySelector('label span')\n const label = this.getLabel(chip.dataset.filterKey, chip.dataset.filterValue)\n labelEl.textContent = label\n labelEl.setAttribute('phantom', label)\n }\n })\n }\n\n onStart() {\n this.#filters = appData.get('filters')\n\n this.template =\n this.#filters\n ?.map(filter => {\n return `${filter.renderBefore()}\n ${filter.values\n .map(value => {\n value.disabled = this.isDisabled(filter.key, value.value)\n return value.render()\n })\n .join('')}\n ${filter.renderAfter()}`\n })\n .join('') ?? ''\n }\n\n onReady() {\n this.querySelectorAll('nb-chip').forEach(chip => {\n chip.addEventListener('change', this.handleChipEvent)\n })\n }\n\n isDisabled = (type, value) =>\n appData.productsListFiltered({ withSort: false }).filter(product => {\n if (!product[type]) {\n return false\n }\n if (typeof product[type] === 'string') {\n return product[type] === value\n } else if (typeof product[type] === 'number' && typeof value === 'number') {\n return value === product[type]\n } else if (typeof product[type] === 'number') {\n return JSON.parse('[' + value + ']').includes(product[type])\n } else {\n return !!product[type].includes(value)\n }\n }).length === 0\n\n isChecked = (key, value) =>\n appData\n .get('filtersSelected')\n .filter(fSelected => fSelected.key === key && fSelected.value === value).length > 0\n\n getLabel(key, value) {\n let filterValue\n appData.get('filters').some(item => {\n if (item.key !== key) {\n return false\n }\n filterValue = item.values.find(itemValue => {\n if (typeof itemValue.value === 'string') {\n return itemValue.value === value\n } else if (typeof itemValue.value === 'number' && typeof value === 'number') {\n return value === itemValue.value\n } else if (typeof itemValue.value === 'number') {\n return JSON.parse('[' + value + ']').includes(itemValue.value)\n } else {\n return !!itemValue.value.includes(value)\n }\n })\n if (filterValue) {\n return true\n }\n })\n\n const count = filterValue?.productCount ? ` (${filterValue.productCount})` : ''\n return `${filterValue.label}${count}`\n }\n\n onDestroy() {\n appData.unsubscribe(this.onStoreChanges)\n\n this.querySelectorAll('nb-chip').forEach(chip => {\n chip.removeEventListener('change', this.handleChipEvent)\n })\n }\n\n handleChipEvent(e) {\n e.stopPropagation()\n\n const filter = {\n key: e.target.parentNode.dataset.filterKey,\n value: e.target.parentNode.dataset.filterValue,\n selected: e.target.checked, // todo only works for checkbox\n label: e.target.parentNode.dataset.filterLabel\n }\n\n appData.filtersUpdate(filter)\n }\n}\n\ncustomElements.get('plp-filter-popin-content') ||\n customElements.define('plp-filter-popin-content', PlpFilterPopinContent)\n\nexport default PlpFilterPopinContent\n","import { EVENT_POPIN_CLOSE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.footer.scss'\nimport appData from '../../../store/plp.data'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nconst CATEGORY_IDENTIFIER = '/cat/'\n\nclass PlpFilterPopinFooter extends NespressoElement {\n constructor() {\n super()\n appData.subscribe(this.componentUpdated.bind(this))\n }\n\n onStart() {\n const translations = appData.translations\n const { a11y_see_result_number_label } = this.props\n this.template = `\n <nb-link\n class=\"nb-filter-popin-reset-all\"\n size=\"large\"\n color=\"black\"\n style=\"visibility: hidden\"\n >\n ${translations['productlistrespblock.resetfilters.label']}\n </nb-link>\n <nb-cta\n class=\"nb-filter-popin-see-results\"\n variation=\"secondary\"\n style=\"visibility: hidden\"\n aria_label_after=\"${a11y_see_result_number_label}\"\n >\n </nb-cta>\n `\n }\n\n getA11ySeeResultsText() {\n const { see_result_number_label, see_result_number_label_one } = this.props\n const productsFilteredCount = appData.productsFilteredCount()\n const label =\n productsFilteredCount === 1 ? see_result_number_label_one : see_result_number_label\n return label?.replace('{resultsLength}', '' + productsFilteredCount)\n }\n\n onReady() {\n this.componentUpdated()\n this.querySelector('.nb-filter-popin-reset-all')?.addEventListener('click', () => {\n const filtersTracking = this.filtersTracking()\n customEvent({\n event_GA4: true,\n event: 'plp_filter',\n action_type: 'filter clear',\n filter_type: filtersTracking.types,\n filter_values: filtersTracking.values\n })\n appData.filtersReset()\n this.setAttribute('data-refresh', 'true')\n })\n this.querySelector('.nb-filter-popin-see-results')?.addEventListener('click', () => {\n window.dispatchEvent(new CustomEvent(EVENT_POPIN_CLOSE))\n const filtersTracking = this.filtersTracking()\n customEvent({\n event_GA4: true,\n event: 'plp_filter',\n action_type: 'filter apply',\n filter_type: filtersTracking.types,\n filter_values: filtersTracking.values\n })\n })\n }\n\n filtersTracking() {\n let types = []\n let values = []\n const filtersSelected = appData.get('filtersSelected')\n if (filtersSelected && filtersSelected.length) {\n for (let i = 0; i < filtersSelected.length; i++) {\n const filter = filtersSelected[i]\n const value =\n filter.value.indexOf(CATEGORY_IDENTIFIER) > -1\n ? filter.value.substring(\n filter.value.indexOf(CATEGORY_IDENTIFIER) + CATEGORY_IDENTIFIER.length\n )\n : filter.value\n if (types.indexOf(filter.key) > -1) {\n values[types.indexOf(filter.key)] += ',' + value\n } else {\n types.push(filter.key)\n values.push(value)\n }\n }\n }\n\n return {\n types: types.join('|'),\n values: values.join('|')\n }\n }\n\n componentUpdated() {\n const productsFilteredCount = appData.productsFilteredCount()\n const filtersSelectedCount = appData.filtersSelectedCount()\n\n const btnReset = this.querySelector('.nb-filter-popin-reset-all')\n const btnResult = this.querySelector('.nb-filter-popin-see-results')\n\n btnReset.style.visibility =\n filtersSelectedCount && filtersSelectedCount > 0 ? 'visible' : 'hidden'\n btnResult.style.visibility =\n productsFilteredCount && productsFilteredCount > 0 ? 'visible' : 'hidden'\n\n btnResult.querySelector('span').textContent = this.getA11ySeeResultsText()\n btnResult.querySelector('button').setAttribute('aria-label', this.getA11ySeeResultsText())\n }\n\n onDestroy() {\n appData.unsubscribe(this.onStoreChanges)\n }\n}\n\ncustomElements.get('plp-filter-popin-footer') ||\n customElements.define('plp-filter-popin-footer', PlpFilterPopinFooter)\n\nexport default PlpFilterPopinFooter\n","import { BREAKPOINT_M, EVENT_POPIN_CLOSED } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport handleAppEvent from '../../store'\nimport { FILTER_MAIN_BLOCK_ID, POPIN_ID } from '../../config/constants'\nimport appData from '../../store/plp.data'\nimport './plp.filter-popin.scss'\nimport './popin/plp.filter-popin.mobileDropDown'\nimport './popin/plp.filter-popin.content'\nimport './popin/plp.filter-popin.footer'\n\nclass PlpFilterPopin extends NespressoElement {\n onStart() {\n this.props = this._createProps(\n document.getElementById(FILTER_MAIN_BLOCK_ID).parentElement.attributes\n )\n\n const {\n see_result_number_label = 'See {resultsLength} Results',\n see_result_number_label_zero = 'No Result',\n see_result_number_label_one = 'See One Result',\n a11y_see_result_number_label = 'Close and validate filters'\n } = this.props.copywriting || this.props\n // todo: line above is backward compatibility fallback for coffee PLP projects without \"copywriting\"\n // Consider moving the backward compatibility into Coffee PLP DTO to avoid this in the code\n\n const isMobile =\n appData.innerWidth < BREAKPOINT_M\n ? '<plp-filter-sort-mobile></plp-filter-sort-mobile>'\n : ''\n\n this.template = `\n ${isMobile}\n <div class=\"mobileShadow\">\n <header>\n <h2 class=\"t-sm-700-sl\">${appData.translations['productlistrespblock.filter.label']}</h2>\n </header>\n <section>\n <plp-filter-popin-content\n ></plp-filter-popin-content>\n </section>\n <footer>\n <plp-filter-popin-footer\n see_result_number_label=\"${see_result_number_label}\"\n see_result_number_label_zero=\"${see_result_number_label_zero}\"\n see_result_number_label_one=\"${see_result_number_label_one}\"\n a11y_see_result_number_label=\"${a11y_see_result_number_label}\"\n ></plp-filter-popin-footer>\n </footer>\n </div>`\n }\n\n onReady() {\n window.addEventListener(EVENT_POPIN_CLOSED, this.eventPopinClsed)\n }\n\n onDestroy() {\n window.removeEventListener(EVENT_POPIN_CLOSED, this.eventPopinClsed)\n }\n\n eventPopinClsed(e) {\n e.stopPropagation()\n if (e.detail.id === POPIN_ID) {\n handleAppEvent('onFilter')\n }\n }\n}\n\ncustomElements.get('plp-filter-popin') || customElements.define('plp-filter-popin', PlpFilterPopin)\n\nexport default PlpFilterPopin\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport handleAppEvent from '../../store'\nimport './plp.filter-cta.scss'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nclass PlpFilterCta extends NespressoElement {\n bubbleElement = null\n\n static get observedAttributes() {\n return ['data-filter-counter']\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (newVal != null && newVal.length > 0 && newVal !== oldVal) {\n if (name === 'data-filter-counter') {\n this.updateBubbleCounter(newVal)\n }\n }\n }\n\n onStart() {\n this.template = `<nb-cta id='plp-filter' size='40' variation='plpFilter' icon_right='24/symbol/filter'>${this.props.cta_filter_label}</nb-cta>`\n }\n\n onReady() {\n document.getElementById('plp-filter').addEventListener('click', () => {\n handleAppEvent('onloadFilter', {})\n customEvent({\n event_GA4: true,\n event: 'plp_filter',\n action_type: 'filter open'\n })\n })\n\n this.buttonElement = this.querySelector('nb-cta button')\n this.bubbleElement = document.createElement('div')\n this.bubbleElement.classList.add('t-2xs-700-sl')\n this.bubbleElement.classList.add('bubbleCounter')\n this.bubbleElement.innerHTML = '0'\n this.firstChild.firstChild.appendChild(this.bubbleElement)\n }\n\n updateBubbleCounter(counter) {\n if (!this.bubbleElement) {\n return null\n }\n\n this.bubbleElement.innerHTML = counter\n counter === '0'\n ? this.buttonElement.classList.remove('bubbleActive')\n : this.buttonElement.classList.add('bubbleActive')\n }\n}\n\ncustomElements.get('plp-filter-cta') || customElements.define('plp-filter-cta', PlpFilterCta)\n\nexport default PlpFilterCta\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport './plp.filter-links.scss'\nimport './plp.filter-links-slider.scss'\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_SLIDER_READY } from '@kissui/components'\n\nconst SLIDER_NAV_LINKS_ID = 'slider_natural_nav_links'\n\nclass PlpFilterLinks extends NespressoElement {\n constructor() {\n super()\n this.boundReinitSlider = this.reinitSlider.bind(this)\n }\n\n onStart() {\n this.addEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n\n const sliderData = {\n options: {\n mobile: {\n items_per_slide: 'auto',\n item_width: 'auto',\n slide_min_height: '40',\n slider_gap: '0',\n display_buttons: 'false',\n display_nav: 'false',\n overflow: 'false',\n flex_auto: 'true',\n display_gradients: 'true',\n gradients_color: '#FFFFFF',\n gradients_width: '8',\n placeholder_background: 'transparent'\n },\n tablet: {\n items_per_slide: 'auto',\n item_width: 'auto',\n slide_min_height: '80',\n slider_gap: '0',\n display_buttons: 'true',\n display_nav: 'false',\n overflow: 'false',\n flex_auto: 'true',\n display_gradients: 'true',\n gradients_color: '#FFFFFF',\n placeholder_background: 'transparent'\n },\n desktop: {\n items_per_slide: 'auto',\n item_width: 'auto',\n slide_min_height: '80',\n slider_gap: '0',\n display_buttons: 'true',\n display_nav: 'false',\n overflow: 'false',\n flex_auto: 'true',\n display_gradients: 'true',\n gradients_color: '#FFFFFF',\n placeholder_background: 'transparent'\n }\n },\n a11y_labels: {\n prev: this.props.a11y_slider_previous_button,\n next: this.props.a11y_slider_next_button,\n nav: 'Go to slide'\n }\n }\n\n this.template = `<nb-slider-natural\n id='${SLIDER_NAV_LINKS_ID}'\n data=\"${stringifyForAttribute(sliderData)}\">\n ${this.renderLinksList()}\n </nb-slider-menu>`\n }\n\n renderLinksList() {\n const { navigation = [] } = this.props\n\n return navigation\n .map(\n ({\n link = '',\n icon_left = '',\n seo_label = '',\n tracking_label = '',\n label = '',\n selected = false\n }) =>\n `<li><nb-link\n link='${link}'\n size='large'\n phantom='true'\n color='black'\n selected=${selected}\n ${seo_label && `seo_label='${seo_label}'`}\n ${tracking_label && `tracking_label='${tracking_label}'`}\n ${icon_left && `icon_left='${icon_left}'`}\n >${label}</nb-link></li>`\n )\n .join('')\n }\n\n reinitSlider(e) {\n const { id } = readEvent(e)\n if (id !== SLIDER_NAV_LINKS_ID) {\n return\n }\n e.target.initSlider()\n }\n\n /*bindEvents() {\n this.unbindEvents()\n this.link.addEventListener('click', this.boundHandleClick)\n }\n\n unbindEvents() {\n this.link.removeEventListener('click', this.boundHandleClick)\n }*/\n\n disconnectedCallback() {\n this.removeEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n }\n}\n\ncustomElements.get('plp-filter-links') || customElements.define('plp-filter-links', PlpFilterLinks)\n\nexport default PlpFilterLinks\n","import { EVENT_SORT_BY_CHANGE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\n\nimport handleAppEvent from '../../store'\nimport appData from '../../store/plp.data'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { SORT_MENU_ID } from '../../config/constants'\nimport { FILTER_MAIN_BLOCK_ID } from '../../config/constants'\n\nclass PlpFilterSort extends NespressoElement {\n #SORT_MENU_ID = SORT_MENU_ID\n\n constructor() {\n super()\n this.formatSortSeparator = '::'\n appData.subscribe(this.componentUpdated.bind(this))\n this.boundOnSortChange = this.onSortChange.bind(this)\n }\n\n onStart() {\n this.props = this._createProps(\n document.getElementById(FILTER_MAIN_BLOCK_ID).parentElement.attributes\n )\n\n const {\n label_sort_by = 'Sort by',\n aa_description_sort_by = 'You can select different sorting values from this listbox. To interact with this listbox press SPACE or ENTER key.',\n aa_listbox_description_sort_by = 'You can navigate through the options using UP or DOWN arrows keys. To exit this listbox press ESCAPE key.',\n aa_select_description_sort_by = 'To select this option press SPACE or ENTER key.',\n label_close_sort_by = 'Close'\n } = this.props\n\n const options = appData.get('sortOptions').map(option => ({\n label: option.label,\n value: this._formatSortValue(option.key, option.order),\n checked: option.checked\n }))\n\n if (appData.get('sortCurrent').key !== appData.get('sortOptions')[0].key) {\n options.forEach(option => {\n option.checked =\n option.value ===\n this._formatSortValue(\n appData.get('sortCurrent').key,\n appData.get('sortCurrent').order\n )\n })\n }\n\n const data = {\n label: label_sort_by,\n aa_description: aa_description_sort_by,\n aa_listbox_description: aa_listbox_description_sort_by,\n aa_select_description: aa_select_description_sort_by,\n icon_option: '16/symbol/check',\n label_close: label_close_sort_by,\n options: options\n }\n\n this.template = `<nb-dropdown id=\"${this.#SORT_MENU_ID}\" data='${stringifyForAttribute(\n data\n )}'/>`\n }\n\n onReady() {\n this.sortButton = document.getElementById(this.#SORT_MENU_ID)\n this.sortButton?.addEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n }\n\n componentUpdated() {\n const { key, order } = appData.get('sortCurrent')\n this.sortButton?.setSelected(this._formatSortValue(key, order))\n }\n\n onSortChange(e) {\n const [key, order] = e.detail.selected.value.split(this.formatSortSeparator)\n appData.set('sortCurrent', { key, order })\n handleAppEvent('onSort')\n }\n\n onDestroy() {\n this.sortButton?.removeEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n appData.unsubscribe(this.componentUpdated)\n }\n\n _formatSortValue(key, order) {\n return `${key}${this.formatSortSeparator}${order}`\n }\n}\n\ncustomElements.get('plp-filter-sort') || customElements.define('plp-filter-sort', PlpFilterSort)\n\nexport default PlpFilterSort\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nimport './_plp.filter.main.scss'\nimport './plp.filter-cta'\nimport './plp.filter-links'\nimport './plp.filter-sort'\nimport appData from '../../store/plp.data'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nclass PlpFilter extends NespressoElement {\n static get observedAttributes() {\n return ['data-request', 'data-filter-counter']\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (newVal != null && newVal !== oldVal && newVal.length > 0) {\n if (name === 'data-request') {\n this.updateComponent()\n } else if (name === 'data-filter-counter') {\n document\n .getElementById('plp-filter-cta')\n .setAttribute('data-filter-counter', newVal)\n }\n }\n }\n\n onStart() {\n this.props = this._createProps(this.parentElement.attributes)\n this.classList.add('plp-filter')\n }\n\n updateComponent() {\n const nav_links = appData.get('nav_links')\n /* Some markets still using PB old PB export which has 4 campaign param instead of one campaign object.\n This change adds a fallback to work with both the cases. */\n const campaign = {\n id: this.props.campaign_id,\n creative: this.props.campaign_creative,\n name: this.props.campaign_name,\n position: this.props.campaign_position\n }\n\n const HTML = `\n <div class='plp-filter-restrict'>\n <plp-filter-cta\n id=\"plp-filter-cta\"\n cta_filter_label=\"${\n this.props.copywriting?.cta_filter_label || this.props.cta_filter_label\n }\"\n data-filter-counter=\"0\"\n ></plp-filter-cta>\n <plp-filter-links\n data = '${stringifyForAttribute({\n navigation: nav_links,\n a11y_slider_previous_button: this.props.a11y_slider_previous_button,\n a11y_slider_next_button: this.props.a11y_slider_next_button,\n campaign: this.props.campaign || campaign\n })}'\n ></plp-filter-links>\n <plp-filter-sort></plp-filter-sort>\n </div>`\n this.loadTemplate(HTML)\n this.filterLinks = this.querySelectorAll('nb-slider-natural nb-link a')\n this.bindEvents()\n }\n\n linkClick({ textContent }) {\n customEvent({\n eventAction: 'PLP Content Tab',\n eventLabel: textContent\n })\n }\n\n bindEvents() {\n this.unbindEvents()\n if (this.filterLinks?.length) {\n this.filterLinks.forEach(element => {\n const textContent = element.querySelector('span').textContent\n element.boundLinkClick = this.linkClick.bind(this, { textContent })\n element.addEventListener('click', element.boundLinkClick)\n })\n }\n }\n\n unbindEvents() {\n if (this.filterLinks?.length) {\n this.filterLinks.forEach(element => {\n element.removeEventListener('click', element.boundLinkClick)\n })\n }\n }\n}\n\ncustomElements.get('plp-filter') || customElements.define('plp-filter', PlpFilter)\n\nexport default PlpFilter\n","/* eslint-disable */\n\nconst stickyService = () => {\n let element = null\n let elementHeight = 0\n let stickyElementSelector = ''\n let magicIndex = 2 // FFS\n\n const initialize = (\n $element,\n $elementHeight = elementHeight,\n $stickyElementSelector = stickyElementSelector,\n $magicIndex = magicIndex\n ) => {\n element = $element\n elementHeight = $elementHeight\n stickyElementSelector = $stickyElementSelector\n magicIndex = $magicIndex\n element.setAttribute('sticky', 'false')\n element.classList.add('nb-sticky-container')\n updateSticky()\n bindEvent()\n }\n\n const updateSticky = () => {\n const sticky = element.getAttribute('sticky') || 'false'\n let offsetElement = 0\n let isReady = false\n let parent = {}\n for (var i = 0; i < element.parentElement.childNodes.length; i++) {\n if (\n element.parentElement.childNodes[i].tagName &&\n element.parentElement.childNodes[i].tagName === element.tagName\n ) {\n parent = element.parentElement.childNodes[i + magicIndex]\n if (parent) {\n // todo : why 80px here ? if it's header height it should take other banners in consideration ?\n offsetElement = parent.offsetTop - 80\n isReady = true\n }\n }\n if (isReady) {\n break\n }\n }\n // todo review this flow, it's when the sticky element is the first of the list of childrens\n if (isReady && offsetElement === 0) {\n offsetElement = element.parentElement.offsetTop + element.parentElement.offsetHeight\n }\n const boundary = window.scrollY - offsetElement\n const isSticky = boundary > 0\n\n if ((sticky === 'true') !== isSticky) {\n element.setAttribute('sticky', isSticky)\n if (elementHeight > 0) {\n document.body.style.paddingTop = isSticky ? elementHeight + 'px' : '0px'\n }\n }\n }\n\n const destroy = () => {\n unbindEvent()\n }\n\n const bindEvent = () => {\n window.addEventListener('scroll', updateSticky)\n }\n\n const unbindEvent = () => {\n window.removeEventListener('scroll', updateSticky)\n }\n\n const updatePosition = (offset = 0) => {\n let el = element\n if (stickyElementSelector !== '') {\n el = element.querySelector(stickyElementSelector)\n }\n if (!el) {\n return\n }\n\n const $header = document.querySelector('.Header__top')\n const headerRect = $header?.getBoundingClientRect() || { height: 0, y: 0 }\n const header = { height: headerRect.height, top: headerRect.y }\n\n const top = `${header.top + header.height + offset}px`\n el.style.top = top\n\n return 0\n }\n\n return { initialize, destroy, updatePosition }\n}\n\nconst service = stickyService()\n\nexport default service\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport appData from '../../store/plp.data'\n\nconst dataTransformNavLinks = navLinks => {\n return navLinks ? stringifyForAttribute({ navigation: navLinks }) : ''\n}\n\nconst dataTransformNavigationBubbles = ({\n bubbles,\n // todo remove ity\n // navigation_bubbles,\n a11y_slider_previous_button,\n a11y_slider_next_button,\n campaign,\n selected_nav_link_label\n}) => {\n return bubbles\n ? stringifyForAttribute({\n a11y_slider_previous_button,\n a11y_slider_next_button,\n bubbles: bubbles,\n customEventAction: 'PLP Content Tab',\n campaign,\n selected_nav_link_label\n })\n : ''\n}\n\nexport const render = (props, campaign) => {\n const { a11y_slider_previous_button, a11y_slider_next_button } = props\n const nav_links = appData.get('nav_links') || []\n const bubbles = appData.get('bubbles') || []\n const selected_nav_link = nav_links.find(nav_link => nav_link.selected)\n const selected_nav_link_label = selected_nav_link?.label\n\n const data_navigation_bubbles = dataTransformNavigationBubbles({\n bubbles,\n ...props,\n campaign,\n selected_nav_link_label\n })\n\n return `\n <nb-navigation-bubbles data='${data_navigation_bubbles}'></nb-navigation-bubbles>\n <nb-plp-sticky-bar\n data=\"${dataTransformNavLinks(nav_links)}\"\n a11y_slider_previous_button=\"${a11y_slider_previous_button}\"\n a11y_slider_next_button=\"${a11y_slider_next_button}\"\n navigation_bubbles=\"${data_navigation_bubbles}\"\n selected_nav_link_label=\"${selected_nav_link_label}\"\n ></nb-plp-sticky-bar>\n `\n}\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport stickyService from '@kissui/components/src/sticky/sticky.service'\nimport * as navigationBar from './plp.bar'\nimport './_plp.navigation.main.scss'\n\n/*\nSpecs:\n- [✓] Add sticky bar height 180\n- [✓] Add sticky bar on mobile, height 132px\n- [✓] If there is products filtered, remove the sticky bar\n */\n\nclass PlpNavigation extends NespressoElement {\n #isSticky = true\n\n onStart() {\n this.props = this._createProps(this.parentElement.attributes)\n\n // attribute magic-index is used in the sticky service to override the element picked as the \"below the fold\" point :-(\n const magicIndex = this.attributes.getNamedItem('magic-index')\n ? Number(this.attributes.getNamedItem('magic-index').value)\n : undefined\n\n this.#isSticky && stickyService.initialize(this, 0, 'nb-plp-sticky-bar', magicIndex)\n }\n\n static get observedAttributes() {\n return ['sticky', 'data-request']\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (newVal !== null && newVal !== oldVal && newVal.length) {\n if (name === 'sticky') {\n this.#isSticky && stickyService.updatePosition()\n }\n if (name === 'data-request') {\n this.updateComponent()\n }\n }\n }\n\n updateComponent() {\n /* Some markets still using PB old PB export which has 4 campaign param instead of one campaign object.\n This change adds a fallback to work with both the cases. */\n const campaign = {\n id: this.props.campaign_id,\n creative: this.props.campaign_creative,\n name: this.props.campaign_name,\n position: this.props.campaign_position\n }\n const HTML = navigationBar.render(\n this.props.copywriting ? this.props.copywriting : this.props,\n this.props.campaign || campaign,\n true\n )\n this.loadTemplate(HTML)\n }\n\n onDestroy() {\n this.#isSticky && stickyService.destroy()\n }\n}\n\ncustomElements.get('plp-navigation') || customElements.define('plp-navigation', PlpNavigation)\n\nexport default PlpNavigation\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport appData from '../../store/plp.data'\nimport handleAppEvent from '../../store'\n\nclass PlpResultsChip extends NespressoElement {\n onStart() {\n const { a11y_label, color, icon_right, label, variation } = this.props\n\n const colorHtml = color ? `<div class=\"chip-color\" style=\"background:${color}\"></div>` : ''\n\n this.template = `\n <nb-cta\n icon_right=\"${icon_right}\"\n variation=\"${variation}\"\n size=\"32\"\n aria_label=\"${a11y_label} ${label}\"\n >\n ${colorHtml}${label}\n </nb-cta>\n `\n }\n onReady() {\n const { value, type, label } = this.props\n this.addEventListener('click', () => {\n appData.filtersUpdate({\n key: type,\n label: label,\n selected: false,\n value: value\n })\n this.remove()\n handleAppEvent('onFilter')\n })\n }\n}\n\ncustomElements.get('plp-results-chip') || customElements.define('plp-results-chip', PlpResultsChip)\n\nexport default PlpResultsChip\n","import appData from '../../store/plp.data'\nimport './plp.results-chip'\nimport './plp.results-header.scss'\nimport { CB_RESULTS_TOTAL_ID } from '@kissui/apps/src/plp-core/config/constants'\n\nexport default (copywritingProps = {}) => {\n const {\n a11y_header_result_label_button = 'Reset filter',\n a11y_header_result_label_reset = 'Filters',\n a11y_header_result_label_results = 'With your filters activated, you have currently',\n header_result_label = 'Currently shopping by',\n header_result_label_reset = 'Reset all',\n header_result_label_results = 'Results',\n header_result_label_results_one = 'Result',\n header_result_label_results_zero = 'Results'\n } = copywritingProps\n\n const total = appData.productsFilteredCount()\n const filterLabels = appData.filtersSelectedCount() && appData.filtersSelectedWithLabel()\n const getResultLabel = () => {\n switch (total) {\n case 0:\n return header_result_label_results_zero\n case 1:\n return header_result_label_results_one\n default:\n return header_result_label_results\n }\n }\n\n return `\n <nb-container\n element_class=\"plp-results-header\"\n contrast=\"light\">\n ${\n filterLabels\n ? `<p class=\"t-sm-400-sl cb-title\">${header_result_label}\n <span class='sr-only'> ${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 AccessoryCategory extends Category {\n constructor(category, PageBuilderData) {\n super(category, PageBuilderData)\n }\n}\n","import { isLoggedIn } from '@kissui/helpers/src/dataLayer'\n\nexport default class Product {\n id = ''\n sku = ''\n longSku = ''\n name = ''\n name_custom = ''\n available = true\n description = null\n hidePrice = false\n image_alt_text = ''\n image = ''\n inStock = true\n internationalId = ''\n internationalName = ''\n legacyId = ''\n maxOrderQuantity = null\n packagingType = null\n price = null\n pushRatingEnabled = false\n ranges = []\n salesMultiple = null\n technologies = []\n type = ''\n unitQuantity = 50\n url = ''\n labels = []\n category_name = ''\n category = null\n highlighted = false\n strikethrough_price = ''\n additional_message = ''\n additional_message_icon = ''\n additional_message_link = {}\n api_override = null\n view_details_label = ''\n headline = ''\n\n constructor(product) {\n /* SKU */\n this.sku = product.internationalId || this.sku\n this.longSku = product.id || this.longSku\n this.id = product.id || this.id\n this.name = product.name || this.name\n this.name_custom = product.name_custom || this.name_custom\n this.available = product.available || this.available\n this.description = product.description || this.description\n this.hidePrice = isLoggedIn() ? false : product.hidePrice || this.hidePrice\n this.image_alt_text = product?.image?.altText || this.image_alt_text\n this.image = product?.image?.url || this.image\n this.inStock = product.inStock\n this.internationalId = product.internationalId || this.internationalId\n this.internationalName = product.internationalName || this.internationalName\n this.legacyId = product.legacyId || this.legacyId\n this.maxOrderQuantity = product.maxOrderQuantity || this.maxOrderQuantity\n this.packagingType = product.packagingType || this.packagingType\n this.price = product.price ?? this.price\n this.pushRatingEnabled = product.pushRatingEnabled || this.pushRatingEnabled\n this.ranges = product.ranges || this.ranges\n this.salesMultiple = product.salesMultiple || this.salesMultiple\n this.technologies = product.technologies || this.technologies\n this.type = product.type || this.type\n this.unitQuantity = product.unitQuantity || this.unitQuantity\n this.url = product.url || this.url\n this.highlighted = product.highlighted || this.highlighted\n this.strikethrough_price = product.strikethrough_price || this.strikethrough_price\n this.additional_message = product.additional_message || this.additional_message\n this.additional_message_icon =\n product.additional_message_icon || this.additional_message_icon\n this.additional_message_link =\n product.additional_message_link || this.additional_message_link\n this.api_override = product.api_override || this.api_override\n this.view_details_label = product.view_details_label || this.view_details_label\n this.headline = product.headline || this.headline\n this.labels = product.labels || this.labels\n\n // category_name\n const categoryId = product.categoryId ? product.categoryId.split('/') : ['']\n this.category_name = categoryId[categoryId.length - 1]\n this.category = product.category || this.category\n }\n}\n","import Product from '../../plp-core/models/Product.js'\n\nexport default class AccessoryProduct extends Product {\n collections = ''\n types = ''\n\n constructor(product) {\n super(product)\n\n this.collections = product.collections\n this.types = product.types\n\n this.sku = this.internationalId || ''\n this.longSku = this.id || ''\n }\n}\n","import { COFFEE_ORIGINAL, COFFEE_VERTUO, COFFEE_PRO } from '@kissui/components/src/constants.mjs'\n\nexport default (nav_links, enabledCremaTechnologies, PageBuilderData) => {\n // Do not change icon name. This is NC2 merger of menus from PB export and crema data\n const ORIGINAL_ICON = 'coffee'\n const VERTUO_ICON = 'gran-lungo-vertuo-capsule'\n const PRO_ICON = 'brand_coffee_capsule_pro'\n\n const { copywriting = {}, options = {} } = PageBuilderData\n\n const transformCremaTechnologiesToLink = technologies => {\n return technologies.map(({ id, url, name, isSelected }) => ({\n link: url,\n label: name,\n seo_label: name,\n icon_left: id ? getIconByTechnology(id.split('/').pop()) : '',\n selected: isSelected\n }))\n }\n const getIconByTechnology = technology => {\n switch (technology) {\n case COFFEE_VERTUO:\n return VERTUO_ICON\n case COFFEE_PRO:\n return PRO_ICON\n default:\n return COFFEE_ORIGINAL\n }\n }\n const filterDefaultTechnology = link => {\n if (\n link.icon_left !== ORIGINAL_ICON &&\n link.icon_left !== VERTUO_ICON &&\n link.icon_left !== PRO_ICON\n ) {\n return link\n }\n }\n\n const replaceCremaTechnologies = () => {\n if (!copywriting.all_products_navigation_label) {\n return []\n }\n const selectedTechnology = enabledCremaTechnologies.find(t => t.isSelected)\n if (!selectedTechnology) {\n return []\n }\n return [\n {\n url: selectedTechnology.url,\n name: copywriting.all_products_navigation_label,\n isSelected: true\n }\n ]\n }\n\n let enabledTechnologies\n if (options.hide_technologies_in_navigation) {\n enabledTechnologies = replaceCremaTechnologies()\n } else {\n enabledTechnologies = enabledCremaTechnologies\n }\n\n if (!nav_links.length && enabledTechnologies.length) {\n return transformCremaTechnologiesToLink(enabledTechnologies)\n }\n\n if (!enabledTechnologies.length) {\n return nav_links\n }\n\n // Remove Page Builder data about technology links to use the one activated in Crema UI data\n const navLinksWithoutTechnology = [...nav_links].filter(filterDefaultTechnology)\n\n return [...transformCremaTechnologiesToLink(enabledTechnologies), ...navLinksWithoutTechnology]\n}\n","import { DEFAULT_BUBBLE_ICON } from '@kissui/components/src/constants.mjs'\nimport { isCategoryHidden } from '@kissui/helpers/src/cremaDataHelper'\n\nexport default (bubbles, productGroups, categories, recommendation) => {\n const productsGroup = productGroups\n .filter(el => !isCategoryHidden(el.categoryId)) // For AB testing\n .map(el => el.categoryId)\n const bubblesFilteredAndSorted = []\n\n const bubblesMathProductsGroup = bubbles\n .map(bubble => {\n const normalizedBubble = {\n ...bubble,\n link: bubble.link.replace('#', '')\n }\n\n if (productsGroup.includes(normalizedBubble.link)) {\n return normalizedBubble\n }\n })\n .filter(ele => typeof ele !== 'undefined')\n\n productsGroup.forEach(categoryId => {\n const bubble = bubblesMathProductsGroup.find(({ link }) => link === categoryId)\n if (bubble) {\n bubblesFilteredAndSorted.push(bubble)\n } else {\n const cremaCategory = categories.find(category => category.id === categoryId)\n if (cremaCategory) {\n const { name, id, icon } = cremaCategory\n const cremaBubble = {\n link: id,\n tracking_label: name,\n label: name,\n visual: {\n src: icon?.url || DEFAULT_BUBBLE_ICON,\n alt: icon?.altText || name\n }\n }\n bubblesFilteredAndSorted.push(cremaBubble)\n }\n }\n })\n\n if (recommendation) {\n bubblesFilteredAndSorted.unshift({\n link: recommendation.id,\n tracking_label: recommendation.name,\n label: recommendation.name,\n visual: {\n src: recommendation.background_desktop,\n alt: recommendation.name\n }\n })\n }\n\n return bubblesFilteredAndSorted\n}\n","/**\n * Modifies the structure to make it easier to use in components\n * Applies all the data customization mixing Page builder with HMC data\n * @param {object} plpData : original PLP data\n */\nimport navigationLinks from './NavigationLinks'\nimport navigationBubbles from './NavigationBubbles'\nimport { getLabels, isCategoryHidden } from '@kissui/helpers/src/cremaDataHelper'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\n\nconst MAX_INTENSITY_FALLBACK = 15\n\n/**\n * Prior to HMC supporting labels natively the hack was to use a category with the data\n * about the label held as JSON data in the description. This function will parse the\n * descriptions for each label once and store them as an object.\n */\nconst parseLabels = labels => {\n labels.forEach(label => {\n try {\n label.parsedData = JSON.parse(label.description)\n } catch (e) {\n console.error(\n 'Wrong JSON format in HMC label categories',\n label.id,\n label.description,\n e\n )\n return\n }\n })\n}\n\n/**\n * Labels data is now available natively in the HMC data. If any labels are specified in the\n * HMC data then this should overwrite the existing functionality. To allow support for both\n * the \"labels from categories\" should continue to be used if HMC data is not specified.\n *\n * Adds labels property to products containing each label's category data (JSON\n * parsed description property) assigned to it.\n * Labels are categories that have the label base category as parent.\n * To apply a label on a given product, the label has to contain the product.\n * This function has to clean the productGroups as well by removing the label ones\n *\n * @param eCommerceData\n */\nconst addLabels = ({ categories, productGroups, products }) => {\n // Labels are already present in the products, skip.\n // This can happen after merging lazy data like recommendations\n if (products.some(product => product.labels?.length)) {\n return\n }\n\n // Use HMC data, if available, create labels with data from highlightLabels\n products.forEach(product => {\n if (product.highlightLabels?.length) {\n product.labels = product.highlightLabels.map(label => ({\n name: label.text,\n color: label.textColor,\n bgColor: label.backgroundColor\n }))\n }\n })\n\n // Backward compatibility, fall back to using HMC categories if no native HMC labels are specified\n const labels = getLabels(categories)\n parseLabels(labels)\n\n const labelGroups = productGroups.filter(group =>\n labels.some(label => label.id === group.categoryId)\n )\n\n labelGroups.forEach(group => {\n const label = labels.find(__label => __label.id === group.categoryId)\n if (!label.parsedData) {\n // Data could not be parsed so skip this label\n return\n }\n group.productIds.forEach(productId => {\n const prod = products.find(product => product.id === productId)\n if (!prod || prod.highlightLabels?.length > 0) {\n // Product not found or has native HMC labels\n return\n }\n prod.labels = prod.labels || []\n prod.labels.push(label.parsedData)\n })\n })\n\n //remove label categories from productGroups\n labelGroups.forEach(labelGroup => {\n const indexToRemove = productGroups.findIndex(\n productGroup => productGroup.categoryId === labelGroup.categoryId\n )\n productGroups.splice(indexToRemove, 1)\n })\n}\n\nexport default (\n plpData,\n PageBuilderData,\n Category,\n Product,\n colorFilterFunction,\n recommendation\n) => {\n if (!plpData.data) {\n return\n }\n\n let { categories, productGroups, enabledTechnologies, products } =\n plpData.data.configuration.eCommerceData\n\n productGroups = getOverridenProductGroups(recommendation, productGroups)\n applyRecommendationOverrides(recommendation, { Product, PageBuilderData })\n applyProductsOverrides(products, PageBuilderData)\n addLabels({ categories, productGroups, products })\n\n // Don't filter the products until after the labels have been applied\n if (colorFilterFunction) {\n products = colorFilterFunction(products)\n }\n\n const overriddenCategories = applyCategoryOverrides(categories, productGroups, products, {\n PageBuilderData,\n Category,\n Product\n })\n\n return {\n categories: recommendation\n ? [recommendation, ...overriddenCategories]\n : overriddenCategories,\n translations: plpData.data.configuration.translations,\n enabledTechnologies,\n nav_links: navigationLinks(\n getPBProperty(PageBuilderData, 'nav_links'),\n enabledTechnologies,\n PageBuilderData\n ),\n bubbles: navigationBubbles(\n getPBProperty(PageBuilderData, 'navigation_bubbles.bubbles'),\n productGroups,\n categories,\n recommendation\n ),\n maxIntensity: {\n original: MAX_INTENSITY_FALLBACK,\n vertuo: MAX_INTENSITY_FALLBACK,\n ...(plpData.data.configuration?.props?.maxIntensity ?? {})\n },\n categoriesExtraData: recommendation ? [recommendation, ...categories] : categories\n }\n}\n\n/**\n * Get a property from the Page Builder data taking into\n * account the old/new schema\n */\nfunction getPBProperty(PageBuilderData, key) {\n return key.split('.').reduce(\n (acc, current) => acc?.[current],\n // Backward compatibility to old schema\n PageBuilderData?.copywriting ? PageBuilderData.copywriting : PageBuilderData\n )\n}\n\nfunction applyProductsOverrides(products, PageBuilderData) {\n products.forEach(product => {\n product.view_details_label = getPBProperty(PageBuilderData, 'view_details_label')\n\n if (isLoggedIn()) {\n // The hide price attribute from Crema UI actually means \"hide price for anonymous users\"\n product.hidePrice = false\n }\n\n const pbProduct = PageBuilderData?.products?.find?.(\n pbProductData => pbProductData.sku && pbProductData.sku === product.legacyId\n )\n\n if (!pbProduct) {\n return\n }\n\n const apiOverride = pbProduct.api_override || product.api_override\n\n // Apply page builder overrides\n Object.assign(product, {\n highlighted: pbProduct.highlighted,\n strikethrough_price: pbProduct.strikethrough_price,\n additional_message: pbProduct.additional_message,\n additional_message_icon: pbProduct.additional_message_icon,\n additional_message_link: pbProduct.additional_message_link || {},\n display_machine_range_name: pbProduct.display_machine_range_name || false,\n name_custom: pbProduct.name_custom || '',\n ...(apiOverride\n ? {\n image: {\n url: apiOverride?.image || product.image?.url\n },\n name: apiOverride?.name || product.name,\n headline: apiOverride?.headline || product.headline,\n description: apiOverride?.description || product.description,\n api_override: apiOverride\n }\n : {})\n })\n })\n}\n\nfunction applyCategoryOverrides(\n categories,\n productGroups,\n products,\n { PageBuilderData, Category, Product }\n) {\n return categories\n .map(category => {\n const extraData = getPBProperty(PageBuilderData, 'categories').find(\n catData => catData.category_id === category.id\n )\n\n const categoryObj = new Category(category, extraData)\n\n productGroups.forEach(productGroup => {\n if (\n isCategoryHidden(productGroup.categoryId) ||\n productGroup.categoryId !== category.id\n )\n return\n\n productGroup.productIds.forEach(productID => {\n const product = products.find(p => p.id === productID)\n if (product) {\n product.categoryId = category.id\n product.category =\n categories.find(c => c.id === product.ranges?.[0]) || null\n const productObj = new Product(product, PageBuilderData)\n categoryObj.products.push(productObj)\n }\n })\n })\n\n return categoryObj.isProductCategory() ? categoryObj : null\n })\n .filter(Boolean)\n}\n\nfunction getOverridenProductGroups(recommendation, productGroups) {\n return recommendation\n ? [\n {\n categoryId: recommendation.id,\n productIds: recommendation.products.map(product => product.legacyId)\n },\n ...productGroups\n ]\n : productGroups\n}\n\nfunction applyRecommendationOverrides(recommendation, { Product, PageBuilderData }) {\n if (!recommendation) {\n return\n }\n\n recommendation.products = recommendation.products.map(p => new Product(p, PageBuilderData))\n}\n","import AccessoryCategory from '../models/accessory.category'\nimport AccessoryProduct from '../models/accessory.product'\nimport MainDTO from '../../plp-core/models/MainDTO'\n\nexport default (plpData, PageBuilderData) => {\n return MainDTO(plpData, PageBuilderData, AccessoryCategory, AccessoryProduct)\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\n/**\n * @param {{}} [_filter]\n */\nexport default class Filter {\n #type = ''\n #key = ''\n #iconFn = {}\n #filterFn = {}\n #title = ''\n #values = []\n #after = '</fieldset>'\n #before = `<fieldset aria-labelledby=\"{key}\"><legend id=\"{key}\" aria-hidden=\"true\" class='${\n viewportHelper.is.mobile ? 't-sm-700-sl' : 't-md-700-sl'\n }'>{title}</legend>`\n showalllabel = ''\n\n constructor(_filter = {}) {\n this.#type = _filter.type\n this.#key = _filter.key\n this.#iconFn = _filter.iconFn ? _filter.iconFn : null\n this.#filterFn = _filter.filterFn ? _filter.filterFn : null\n const title = _filter.title ? _filter.title.toLowerCase() : 'Filter'\n this.#title = title.charAt(0).toUpperCase() + title.slice(1)\n this.#before = _filter.before ? _filter.before : this.#before\n this.#after = _filter.after ? _filter.after : this.#after\n this.showalllabel = _filter.showalllabel ?? ''\n }\n\n set values(values) {\n this.#values = values\n }\n\n set after(after) {\n this.#after = after\n }\n\n get after() {\n return this.#after\n }\n\n get values() {\n return this.#values\n }\n\n get type() {\n return this.#type\n }\n\n get filterFn() {\n return this.#filterFn\n }\n\n get iconFn() {\n return this.#iconFn\n }\n\n get key() {\n return this.#key\n }\n\n get title() {\n return this.#title\n }\n\n renderBefore() {\n return this.#before.replace('{title}', this.#title).replaceAll('{key}', this.#key)\n }\n\n renderAfter() {\n return this.#after\n }\n\n pushValues(value) {\n this.#values.findIndex(x => x.value === value.value) === -1 && this.#values.push(value)\n }\n}\n","/**\n * Filter chip type\n */\nexport default class DefaultFilterChipType {\n #value = null\n #label = null\n #filterType = null\n #filterKey = null\n #icon = ''\n #color = ''\n #selected = false\n #disabled = false\n\n constructor({\n value,\n label,\n filterType,\n filterKey,\n icon = '',\n color = '',\n selected = false,\n disabled = false\n }) {\n if (!value) {\n console.error('DefaultFilterChipType: value is required')\n return\n }\n if (!label) {\n console.error('DefaultFilterChipType: label is required')\n return\n }\n if (!filterType) {\n console.error('DefaultFilterChipType: filterType is required')\n return\n }\n if (!filterKey) {\n console.error('DefaultFilterChipType: filterKey is required')\n return\n }\n\n this.#value = value\n this.#label = label\n this.#filterType = filterType\n this.#filterKey = filterKey\n this.#icon = icon\n this.#color = color\n this.#selected = selected\n this.#disabled = disabled\n\n this.productCount = null\n }\n\n set disabled(value) {\n this.#disabled = !!value\n }\n\n get disabled() {\n return this.productCount !== null ? this.productCount === 0 : this.#disabled\n }\n\n set selected(value) {\n this.#selected = !!value\n }\n\n get selected() {\n return this.#selected\n }\n\n get filterKey() {\n return this.#filterKey\n }\n\n get filterType() {\n return this.#filterType\n }\n\n get value() {\n return Array.isArray(this.#value) ? this.#value.join(',') : this.#value\n }\n\n get label() {\n return this.#label\n }\n\n get color() {\n return this.#color\n }\n\n get icon() {\n return this.#icon\n }\n\n // disabled=\"${isDisabled(e.type, v)}\"\n render() {\n const productCountLabel = this.productCount !== null ? ` (${this.productCount})` : ''\n\n return `<nb-chip\n id=\"${this.#filterKey}-${this.#value}\"\n data-filter-value=\"${this.#value}\"\n data-filter-key=\"${this.#filterKey}\"\n data-filter-label=\"${this.#label}\"\n checked=\"${this.#selected}\"\n disabled=\"${this.#disabled}\"\n ${this.#icon ? `icon=\"${this.#icon}\"` : ''}\n ${this.#color ? `color=\"${this.#color}\"` : ''}\n >${this.#label}${productCountLabel}</nb-chip>`\n }\n}\n","import Filter from './filter'\nimport DefaultFilterChipType from './types/DefaultFilterChipType'\n\nconst getCategoryData = (categories, id) => {\n // Restrict filter to NOT use categories containing the word \"label\"\n const findCategory = categories?.find(\n category => category.id === id && !category.id.includes('label')\n )\n return findCategory\n ? {\n // todo this icon should be fixed into the DTO product for all attributes\n icon: findCategory.icon?.icon,\n color: findCategory.cssColorCode ? findCategory.cssColorCode : null,\n label: findCategory.name\n }\n : null\n}\n\nexport default (filterDefinition, categories, categoriesData) => {\n if (!filterDefinition || !categories) {\n console.error('CREATE_FILTER_DEFINITION_CATEGORY_NOT_FOUND')\n return []\n }\n\n const filters = filterDefinition.map(filter => new Filter(filter))\n categories\n .reduce((acc, category) => acc.concat(category.products), [])\n .forEach(product => {\n filters.forEach(filter => {\n const filterKey = filter.key\n const filterType = filter.type\n const fieldValue = product[filterKey]\n typeof fieldValue === 'object'\n ? fieldValue.map(attribute => {\n const data = getCategoryData(categoriesData, attribute)\n if (data) {\n filter.pushValues(\n new DefaultFilterChipType({\n filterKey,\n filterType,\n value: attribute,\n icon: filter.iconFn?.(attribute),\n label: data.label,\n color: data.color ?? null\n })\n )\n }\n })\n : filter.pushValues(\n new DefaultFilterChipType({\n filterKey,\n filterType,\n value: fieldValue,\n icon: filter.iconFn?.(filterKey),\n label:\n typeof filter.filterFn === 'function'\n ? filter.filterFn(fieldValue)\n : fieldValue\n })\n )\n })\n })\n\n return filters\n}\n","import createFilter from '../../plp-core/filter/createFilter'\n\nexport const getMergedFilterData = (categories, PBprops, categoriesExtraData, translations) =>\n createFilter(\n [\n {\n type: 'default',\n key: 'collections',\n title: translations['productlistrespblock.filterlabels.collection']\n },\n {\n type: 'default',\n key: 'types',\n title: translations['productlistrespblock.filterlabels.type']\n }\n ],\n categories,\n categoriesExtraData,\n PBprops\n )\n","/**\n *\n * @param PBprops\n * @returns {[\n * {\n * checked: boolean,\n * id: string,\n * label: (string|*),\n * key: string,\n * order: asc|desc\n * }\n * ]}\n * Note: The first element is the default sort order\n * Note: The order of the sort array is important\n *\n */\nexport const getMergedSortData = PBprops => [\n {\n id: 'default',\n label: PBprops.dropdown_recommended_option_label,\n key: 'recommended',\n order: 'asc',\n checked: true\n },\n {\n id: 'sortPriceAscending',\n label: PBprops.dropdown_price_ascending_option_label,\n key: 'price',\n order: 'asc',\n checked: false\n },\n {\n id: 'sortPriceDescending',\n label: PBprops.dropdown_price_descending_option_label,\n key: 'price',\n order: 'desc',\n checked: false\n },\n {\n id: 'sortNameAscending',\n label: PBprops.dropdown_name_ascending_option_label || 'Name A-Z',\n key: 'name',\n order: 'asc',\n checked: false\n },\n {\n id: 'sortNameDescending',\n label: PBprops.dropdown_name_descending_option_label || 'Name Z-A',\n key: 'name',\n order: 'desc',\n checked: false\n }\n]\n","import appData from './plp.data'\nimport {\n POPIN_ID,\n FILTER_MAIN_BLOCK_ID,\n NAVIGATION_MAIN_BLOCK_ID,\n PRODUCTS_LIST_MAIN_BLOCK_ID,\n PRODUCTS_RESULTS_MAIN_BLOCK_ID,\n CB_RESULTS_TOTAL_ID\n} from '../config/constants'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { setAttributes } from '@kissui/helpers/src/utils'\n\nexport default {\n onloadSuccess: function () {\n const plpApp = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID).parentElement\n plpApp.setAttribute('data-loaded', appData.sessionId)\n },\n /**\n * State: list of products\n */\n readyForPlay: function () {\n const filter = document.getElementById(FILTER_MAIN_BLOCK_ID)\n const navigation = document.getElementById(NAVIGATION_MAIN_BLOCK_ID)\n const productList = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID)\n const productsResults = document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID)\n\n filter.setAttribute('data-request', appData.sessionId)\n filter.setAttribute('data-filter-counter', appData.filtersSelectedCount())\n navigation.setAttribute('data-request', appData.sessionId)\n productList.setAttribute('data-request', appData.sessionId)\n\n filter.style.display = 'block'\n\n navigation.style.display = 'block'\n\n productList.style.display = 'block'\n\n productsResults.style.display = 'none'\n\n if (appData.get('hide_sort_and_filter')) {\n filter.classList.add('hide-sort-and-filter')\n }\n\n document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID).style.display = 'none'\n },\n /**\n * State: list of products filtered\n */\n readyForShowResults: function () {\n const filter = document.getElementById(FILTER_MAIN_BLOCK_ID)\n const navigation = document.getElementById(NAVIGATION_MAIN_BLOCK_ID)\n const productList = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID)\n const productsResults = document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID)\n const cbResultsTotalText = document.getElementById(CB_RESULTS_TOTAL_ID)\n\n filter.style.display = 'block'\n filter.setAttribute('data-request', appData.sessionId)\n filter.setAttribute('data-filter-counter', appData.filtersSelectedCount())\n\n if (navigation) navigation.style.display = 'none'\n\n if (productList) productList.style.display = 'none'\n\n if (productsResults) {\n productsResults.setAttribute('data-request', appData.filtersSelectedSerialized())\n productsResults.style.display = 'block'\n }\n if (cbResultsTotalText) {\n cbResultsTotalText.textContent = appData.productsFilteredCount()\n }\n },\n /**\n * State: filter popin opened\n */\n readyForFilter: function () {\n // check if the popin is in the page\n let plpFilterPopin = document\n .getElementsByClassName('plp-app')[0]\n ?.querySelector(`#${POPIN_ID}`)\n\n if (!plpFilterPopin) {\n // todo test performance of this & new Popin()\n plpFilterPopin = setAttributes(\n document.createElement('nb-popin', {\n is: customElements.get('Popin')\n }),\n {\n 'data-request': appData.sessionId,\n id: POPIN_ID,\n popin_id: POPIN_ID,\n variation: 'before',\n bgcolor: 'white',\n heading: appData.translations['productlistrespblock.filter.label'],\n label_close: 'close',\n content:\n '<plp-filter-popin class=\"plp-filter-popin-content\"></plp-filter-popin>'\n }\n )\n document.getElementsByClassName('plp-app')[0]?.appendChild(plpFilterPopin)\n // todo wrong way to open the popin\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: POPIN_ID } })\n } else {\n // todo wrong way to open the popin\n plpFilterPopin.querySelector('plp-filter-popin').setAttribute('data-refresh', 'true')\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: POPIN_ID } })\n }\n },\n /**\n * State: shows the error\n */\n showError: function (e) {\n const errorMessage = e.detail.err || 'Error'\n console.error(errorMessage)\n }\n}\n","import PLPApp from '../plp-core/plp.app'\nimport { getMergedPLPData, getMergedFilterData, getMergedSortData } from './dataTransform'\nimport appStates from '../plp-core/store/plp.states'\n\nclass PLPAccessory extends PLPApp {\n constructor() {\n super()\n this.plpType = 'accessory'\n this.dataTransformService = getMergedPLPData\n this.dataFiltersService = getMergedFilterData\n this.dataSortService = getMergedSortData\n this.appStates = appStates\n }\n}\n\ncustomElements.get('nb-plp-accessory') || customElements.define('nb-plp-accessory', PLPAccessory)\n\nexport default PLPAccessory\n"],"names":["createProps","attributes","data","find","attribute","nodeName","getData","props","filter","reduce","all","attr","nodeValue","isNil","JSON","parse","error","console","log","obj","CardLabels","HTMLElement","constructor","super","this","labels","connectedCallback","render","direction","classList","add","length","innerHTML","renderLabels","map","label","name","bgColor","color","join","customElements","get","define","BREAKPOINT_TABLET","BREAKPOINT_M","EVENT_POPIN_OPEN","EVENT_POPIN_CLOSE","EVENT_POPIN_CLOSED","EVENT_POPIN_KEY_DOWN","EVENT_SLIDER_READY","EVENT_SORT_BY_CHANGE","EVENT_SWIPED_DOWN","CONTRAST_LIGHT","NespressoElement","template","_createProps","onStart","loadTemplate","onReady","forceAttributes","force","_diff","elem","_getNodeType","node","nodeType","tagName","toLowerCase","_getNodeContent","childNodes","textContent","domNodes","Array","prototype","slice","call","templateNodes","count","parentNode","removeChild","forEach","index","appendChild","cloneNode","replaceChild","templateContent","fragment","document","createDocumentFragment","templateHTML","str","DOMParser","parseFromString","body","disconnectedCallback","onDestroy","helper","is","innerWidth","vw","devicePixelRatio","window","mobile","mobile_tablet","tablet","desktop","retina","lt","ref","parseHTML","tmp","implementation","createHTMLDocument","makeId","result","characters","i","charAt","Math","floor","random","removeEmptyValues","findText","key","value","text","includes","getHashLink","link","linkHash","linkNoHash","indexOf","replace","lazyLoad","url","inViewPort","setAttribute","cb","img","Image","src","onload","onerror","Error","test","navigator","userAgent","agent","start","Number","substr","lazyBackgroundObserver","IntersectionObserver","entries","entry","isIntersecting","unobserve","target","observe","isOldIOS","stringifyForAttribute","escapeHtml","stringify","m","sanitizeString","toString","setAttributes","element","attrs","VARIATION_PLP","VARIATION_PDP","isPdp","variation","renderHeading","name_custom","finalName","headingLevel","getHeadingLevel","push","viewportHelper","renderLink","a11y_product_card","a11yProductName","ECAPI_TYPE_CAPSULE","ECAPI_TYPE_MACHINE","ECAPI_TYPE_ACCESSORY","ECAPI_TYPE_GIFT_CARD","TECHNOLOGY_CATEGORY_IDENTIFIER","getProduct","sku","napi","catalog","trimSku","getTechnologyName","productData","techno","technologies","substring","isBundled","sales_multiple","salesMultiple","isSalesMultipleGreaterThanOne","isUnitQuantityEqualToOne","unitQuantity","isSalesMultipleEqualToOne","isUnitQuantityGreaterThanOne","getFormattedPrice","async","price","priceFormatter","priceFormat","getPriceFormatter","currency","config","padl","namespace","dataLayer","app","html","short","getStrikethroughPriceElement","component","querySelector","renderStrikethroughPrice","strikethrough_price","strikethroughPrice","fetchStrikethroughPrice","then","payload","catch","e","style","display","getDataLayer","padlNamespace","getMarketCode","market","toLocaleLowerCase","getLangCode","page","pageInfo","language","isLoggedIn","user","renderAddToCart","activeLongSku","activeSku","category_name","contact_cta","hidePrice","longSku","position","rendererName","show_view_details","view_details_label","disableTracking","buttonSize","getButtonSize","cta_url","cta_label","contact_cta_text","contact_url_anchor","is_b2b","isArray","some","tech","checkForB2B","skuProp","activeLongSkuProp","disableTrackingProp","getComputedProps","b2bLoggedIn","remainingCases","b2bNotLoggedIn","LABEL_CATEGORY_NAME","LABEL_CATEGORY_NAME_MACHINE","COMMON_URL","ORGANIC_LOGO_IMG_EU","ORGANIC_LOGO_IMG_US","ORGANIC_LOGO_IMG_CA","ORGANIC_LOGO_IMG_BR","ORGANIC_LOGO_IMG_JP","ORGANIC_LOGO_IMG_BE","VERTUONEXT_LOGO_IMG","RAINFOREST_LOGO_IMG","SUSTAINABILITY_LOGO_IMG","Q_CERTIFICATION_ARABICA_LOGO_IMG","DESIGN_AWARD_2021_IMG","LOGO_IMG_MAP","fair_trade","is_organic","organicLogoImg","getOrganicLogo","only_vertuo_next","is_q_certified_arabica","is_rainforest","is_sustainable","is_design_award_2021","getLabels","categories","category","getCategoryRegEx","id","isLabel","categoryIdTail","RegExp","isCategoryHidden","categoryId","hideCategory","PLP_HIDE_CATEGORIES","findIndex","c","PLP_ONLY_SHOW_CATEGORIES","getMaxIntensity","INTENSITY_MAX_OL","getMergedProductCoffeeData","product","pageBuilderProductProps","pageBuilderProps","bundle_details","options","show_sleeve_price","isBundledResult","showCapsulePrice","price_per_capsule","final_price","bundled","type","round","getFinalPrice","option","intensity","capsuleProperties","max_intensity","show_capsule_price","apiOverride","pageBuilderData","images","headline","description","api_override","image","icon","main","VARIATION_CROSS_SELL","getCapsuleFeatures","acidity","bitterness","roastLevel","roast","getSkuQuickViewProp","popinId","skuData","componentType","mergedProductData","getMergedProductDataForComponentType","addToCartProps","getAddToCartProperties","isVariationOnPLP","getPlpQuickViewProps","getCrossSellQuickViewProps","matchedProduct","products","productPageBuilder","legacyId","getMergedProductData","variant","additional_message","additional_message_icon","additional_message_link","internationalId","unit_quantity","rangeData","label_range","rawPrice","image_alt_text","highlighted","dataTransformObjectProductType","getMergedProductMachineData","ratingsAndReviews","ratings","colors","max_colors","show_ratings","minimum_rating","getMergedProductAccessoryData","getMergedProductGiftCardData","_","default_image","getAddToCartProps","commonProps","label_capsules","capsule_price_label","capsule_price_syntax","show_sleeve","sleeve_syntax","number_of_sleeves","label_sleeves","label_sleeve","popin","popin_id","close","quick_view_plp","footer","intensity_label","a11y_intensity_max","cup_sizes","items","cupSizesDetails","aromatic_profile","capsuleProductAromatics","levels","pricing","add_to_cart","showSleeve","campaign","copywriting","sku_quick_view","pdpURLs","dispatchEvent","eventName","args","event","CustomEvent","detail","bubbles","Event","createEvent","initEvent","readEvent","emitCustomEvent","customEvent","cancelable","composed","eventsHelper","eventListeners","eventListener","addEventListener","listener","remove","removeEventListener","raisedByPB","raisedByWC","eventData","gtmDataObject","undefined","event_GA4","eventRaisedBy","event_raised_by","trackComponentInteraction","creative","actionType","internationalName","productType","technology","eventAction","component_name","action_type","item_id_event","item_name_event","item_category_event","item_technology_event","item_range_event","item_price_event","eventCategory","eventLabel","viewPromotion","ecommerce","Object","keys","ecommerceData","promotion_id","promotion_name","creative_slot","creative_name","handlePromoClick","cta_name","cleanedData","selectPromotion","getProductInfo","getProductPayload","actionField","unitPrice","inStock","item","split","pop","dimension44","dimension53","dimension54","dimension55","dimension56","dimension57","dimension192","brand","productImpression","list","p","productInfo","productPayload","currencyCode","impressions","productClick","click","filterActionEvent","filterType","filterValues","clickLocation","dataType","getExplicitFilterEventData","NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING","experiment_action","filter_type","filter_values","click_location","Sku","isQuickViewPlp","boundOnPDPLinkClick","onPDPLinkClick","bind","boundOnQuickViewOpen","onQuickViewOpen","clickMethod","setCardTheme","assign","getSleevePrice","checkHiddenPriceForLoggedInUser","show_view","renderVisual","renderHeader","renderInformation","renderQuickView","renderPricing","renderAction","renderFooter","bindEvent","renderHeaderDefault","renderLogos","alt_fair_trade","alt_organic","alt_vertuo_next","alt_rainforest","alt_sustainable","alt_q_certification_arabica","logos","renderVisualDefault","theme","hasAttribute","renderImage","renderClass","linkHref","trim","sleevePrice","hasPricePerSleeve","renderInformationDefault","renderLabelTechnology","label_technology","renderLabelRange","renderHeadline","is_headline_hidden","quick_view","tracking_list","tracking_position","campaign_creative","colorsSkusList","renderPricingDefault","isPortrait","renderPrice","giftcard_price","finalPrice","renderActionDefault","actionSlot","outerHTML","renderFooterDefault","renderAdditionalMessage","additionalMessageFinal","renderIcon","size","seo_label","productIndex","getAttribute","renderSkuQuickView","quickViewElement","handleVariation","yi","handlePLPVariation","createElement","heading","rs","handleCrossSellVariation","more_info","parentElement","newQuickViewElement","getSkuQuickViewData","preventDefault","unbindEvent","showQuickView","quickViewTextExists","quick_view_text","querySelectorAll","addStopPropagationEvent","removeStopPropagationEvent","selector","stopPropagationHandler","stopPropagation","bus","_bus","register","callback","fire","EventBus$1","Cta","observedAttributes","boundHandleClick","handleClick","slot","aria_label","aria_label_after","aria_label_before","contrast","icon_left","icon_right","label_update","link_new_tab","long_sku","transparent","ariaLabel","textClass","removeListeners","addListeners","track","event_id","qs_id","EventBus","openQuantitySelector","campaign_id","campaign_name","campaign_position","campaign_instance_index","tracking_slot_prefix","sku_data","ctaOrPopin","slotContent","instanceIndex","cta_name_value","tabbed_component","componentName","attributeChangedCallback","setTimeout","LAZYLOAD_CUSTOM","PROFILES","sizes","Img","__privateAdd","_initLazyLoad","_setImPolicyQuery","_getRetinaWidth","_getImpolicyProfile","_getClosests","_setCssProperties","_setCssProperty","__privateMethod","initLazyLoad_fn","file","lazyload","fetchpriority","setImPolicyQuery_fn","setCssProperties_fn","parentClass","firstElementChild","WeakSet","#initLazyLoad","#setImPolicyQuery","aspect_ratio","force_width","force_height","impolicy","width","offsetWidth","w","h","finalWidth","getRetinaWidth_fn","getImpolicyProfile_fn","#getRetinaWidth","#getImpolicyProfile","exactFound","closests","getClosests_fn","tempDiff","diff","closest","#getClosests","every","profile","found","el","#setCssProperties","object_fit","placeholder_color_light","placeholder_color_dark","error_message","setCssProperty_fn","#setCssProperty","setProperty","Link","setClassHelper","bindEvents","image_alt","renderButton","tracking_label","a11y_label_new_tab","selected","phantom","cta_link_type","sizeClass","sku_colors","quickView","linkOrPopin","unbindEvents","Viewport","observer","IntersectionObserverEntry","onChange","threshold","rootMargin","Element","observables","observable","requestIdleCallback","runTrack","zoneTracking","tracking","ZoneTracking","destroy","getIom","hasIntersectionObserver","isObjectEmpty","Container","initTracking","initLazyLoad","getBgImgUrl","lazy_load","background_mobile","background_tablet","background_desktop","background_retina","styles","background_color","classname","element_class","contrastDefault","hasBgImage","renderBg","d","r","Chip","checkbox","computedSlot","computeSlot","onclick","content","background_image","filter_label_AA","rounded","checked","disabled","checkedAttr","disabledAttr","inputId","hash","charCodeAt","makeHash","getElementsByTagName","newValue","recursiveSwitchAriaHidden","componentOpenState","parent","brothers","children","brother","removeAttribute","focusin","loop","contains","lastFocused","firstFocusable","lastFocusable","focus","setFirstAndLastFocusable","focusable","Dropdown","isOpen","buttonElement","onClickOutside","aa_description","element_id","element_name","renderSelected","renderOptions","buttonElementValue","dropdownMenu","selectedOption","aa_listbox_description","aa_select_description","icon_option","boundHandleLabelClick","handleLabelClick","boundHandleMobileClose","handleMobileClose","boundFocus","boundFocusin","boundKeyNav","keyNav","toogleDropdown","selectedOptionId","dataset","reRender","selectedlabel","setSelected","dispatchChange","tmpSelected","open","switchAriaModal","openingSource","activeElement","prevOption","nextOption","firstOption","lastOption","prevSibling","previousElementSibling","nextSibling","nextElementSibling","ProductTracking","range","noImpression","getPLPCategory","getPLPData","configuration","eCommerceData","getCategoriesWithPlpData","cupSizes","flavors","ranges","Promise","categoryData","isTechnologyCategory","getCategories","supercategories","superCategory","getCategory","code","buildGTMProductObject","capitalize","s","toUpperCase","dimension130","productSelections","impressionsOnScrollData","dimension43","parseInt","AddToCart","elementID","addToCartCounter","isWindowNapiActive","getConfig","pushButton","getElementById","ui","module","productId","activated","resolve","productTracking","getProductData","getSkuKey","plpData","allKeys","currentKeyIndex","__publicField","_AddToCart","SLIDER_CHIPS_ID","PlpStickyBar","boundReinitSlider","reinitSlider","boundLinkClick","linkClick","dropdownButtons","navigation","navigation_bubbles","renderLinksSelect","renderChipsSlider","dropdown","navigationBubble","links","a11y_slider_previous_button","a11y_slider_next_button","selected_nav_link_label","forceSliderWidth","dropdownWidth","navigationBubbleWidth","initSlider","currentTarget","location","href","swipeEvents","stopEl","nwcSwipeEvents","scrollTopArray","scrollLeftArray","scrollTop","scrollLeft","memorizeStartElScrollPositions","startEl","timeDown","Date","now","touches","clientX","clientY","xDiff","yDiff","xDown","yDown","xUp","yUp","defaultVertical","innerHeight","defaultHorizontal","swipeThresholdVertical","getNearestAttribute","swipeThresholdHorizontal","swipeTimeout","timeDiff","eventType","changedTouches","abs","checkScrollCondition","dir","touchType","xStart","xEnd","yStart","yEnd","isScrollable","scrollHeight","clientHeight","scrollWidth","clientWidth","attributeName","defaultValue","documentElement","attributeValue","String","Overlay","overlay","getElementsByClassName","STATE_OPEN","SCROLL_LOCK","Popin","ariaModal","isVideo","boundOpen","boundClose","boundEscapeClose","escapeClose","oldValue","hasEvent","subheading","bgcolor","label_close","heading_class","heading_id","checkIsVideo","parseBool","tempEl","addLock","removeLock","cancelBubble","openVideoPopin","swipeDown","swipeOverlayTogglePlayPause","boundSwipeDown","swipeOverlay","boundSwipeOverlayTogglePlayPause","CardLogos","logos_list","param","appendLogo","apply","logo","alt","hasLogo","logosList","logoName","slidesContainer","next","prev","colours","SliderMenu$1","boundNextClick","onNextClick","boundPrevClick","onPrevClick","onLinkClick","boundTouchEnd","onTouchEnd","disableAutoScroll","_entriesBounds","_element","_slides","_options","last_known_scroll_position","ticking","navBarTravelDirection","navBarTravelling","navBarTravelDistance","scrollAmount","buildIHM","setOverflowAttribute","initializeIndicatorPosition","_root","_container","_pnIndicator","_containerSlidesContent","hasContainer","constants","wrapItems","insertBefore","createIndicator","child","randId","tag","className","div","elements","from","pnAdvancerLeft","pnAdvancerRight","goToElement","goToSlide","showContent","contentId","deselectAllLinkBut","distance","boundingClientRect","scroll","left","behavior","sideScroll","speed","step","slideTimer","setInterval","clearInterval","moveIndicator","determineOverflow","container","containerMetrics","getBoundingClientRect","containerMetricsRight","right","containerMetricsLeft","contentMetrics","contentMetricsRight","contentMetricsLeft","textPosition","transform","link_plp_category_padding_x","backgroundColor","onResize","clearListeners","kill","intersection","disconnect","root","isInViewport","entryBound","SliderMenu","randomId","sliderMenu","boundOnResize","onLoad","debouncedOnResize","debounce","func","time","timer","clearTimeout","loadSwiper","SliderMenuLib","li","firstChild","itemTypes","itemDisplay","rootElement","slider","onNavigationClick","SliderNatural","_waitForSliderToBeSized","_set","_getOption","_setProperties","_render","_renderButtons","_renderButton","_renderNav","_renderBullet","_renderCounter","_renderGradients","_renderSafariFix","_calculateItemsPerSlide","_getSliderPositions","_setCss","_setCssSlideWidth","_setCssSlideMinHeight","_setCssSliderGap","_setCssFlexAuto","_setCssPlaceholder","_setCssItemsPerSlide","_applyCenteredLayout","_updateStates","_updateStatesScroll","_setActiveButtons","_setActiveBullet","_setCounter","_setActiveSlides","_gotoDefaultPosition","_onScroll","_getOpacityParams","_setOpacity","_switchBullets","_onPrevClick","_onNextClick","_onNavClick","_dispatchReady","_bindEvent","_unbindEvent","defaultPosition","displayButtons","displayNav","displayCounter","displayGradients","itemsPerSlide","overflow","overflowOpacity","flexAuto","onPrevClick_fn","onNextClick_fn","boundNavClick","onNavClick_fn","boundScroll","onScroll_fn","render_fn","testId","setProperties_fn","loops","waitForSliderToBeSized_fn","dispatchReady_fn","finally","wait","slidesElements","itemNumber","set_fn","item_width","items_per_slide","calculateItemsPerSlide_fn","setCssSlideWidth_fn","setCssItemsPerSlide_fn","setCssFlexAuto_fn","maxSlides","renderButtons_fn","renderNav_fn","renderCounter_fn","renderGradients_fn","applyCenteredLayout_fn","getSliderPositions_fn","getOpacityParams_fn","setOpacity_fn","updateStates_fn","bindEvent_fn","gotoDefaultPosition_fn","renderSafariFix_fn","updateSlider","instantly","currentIndex","carousel","scrollTo","sliderPositions","unbindEvent_fn","#waitForSliderToBeSized","reject","#set","normalisedValue","getOption_fn","convertToCamelCase","arr","match","low","k","#getOption","isNaN","parseFloat","#setProperties","a11y_labels","wrapper","property","buttonsContrast","setCssSlideMinHeight_fn","setCssSliderGap_fn","setCssPlaceholder_fn","#render","#renderButtons","prevButton","nextButton","renderButton_fn","#renderButton","pos","renderInCounter","buttonContrast","isPrev","buttonEl","counter","prepend","append","#renderNav","nav","bullets","renderBullet_fn","navElements","#renderBullet","#renderCounter","#renderGradients","gradientsWidth","setCss_fn","gradientsColor","#renderSafariFix","isSafari","safariFix","safariFixWidth","paddingCorrection","sliderGap","#calculateItemsPerSlide","itemWidth","#getSliderPositions","maxScroll","firstItemOffsetLeft","offsetLeft","#setCss","isRem","#setCssSlideWidth","itemWidthAuto","#setCssSlideMinHeight","slideMinHeight","#setCssSliderGap","#setCssFlexAuto","#setCssPlaceholder","placeholderBackground","#setCssItemsPerSlide","#applyCenteredLayout","#updateStates","setActiveButtons_fn","setActiveBullet_fn","setCounter_fn","setActiveSlides_fn","updateStatesScroll_fn","#updateStatesScroll","#setActiveButtons","#setActiveBullet","#setCounter","#setActiveSlides","tempIndex","#gotoDefaultPosition","#onScroll","isScrolling","carouselScrollLeft","switchBullets_fn","#getOpacityParams","getComputedStyle","getPropertyValue","itemWidthAdjusted","#setOpacity","scrollX","itemX","percentage","opacityPercentage","finalOpacity","#switchBullets","alreadyScrolled","#onPrevClick","#onNextClick","#onNavClick","#dispatchReady","#bindEvent","#unbindEvent","createRefs","extract","refs","$ref","refArray","getRefArray","getImpolicy","policy","rules","STATE_DISABLED","Bubble","setState","src_retina","visual","getResponsiveImpolicy","mobileWidth","tabletWidth","desktopWidth","retinaWidth","state","a11y_scrollto","renderLabel","setTheme","IntersectionObserverService","observers","Map","create","has","warn","targets","set","delete","destroyAll","clear","Deferred","promise","scrollDuration","baseScrollDuration","deferred","scrollPosition","resolveScrollPosition","scrollPaddingTop","scrollToElement","scrollY","top","currentTime","initialTimestamp","performance","deltaScroll","resolveScrollDuration","viewportHeight","bodyHeight","finalTimestamp","requestAnimationFrame","currentTimestamp","moveStep","EVENT_NAVIGATION_SECTION_CHANGE","NB_SLIDES_STICKY","INTERSECTION_RATIOS_SECTION","SLIDER_CONFIG_DEFAULT","display_gradients","display_nav","placeholder_background","slide_min_height","slider_gap","NavigationBubbles","isMobile","scrollObserver","sticky","isSticky","isCenteredItems","is_centered_items","init","eventsListeners","bindSliderLinksEvents","geometry","getGeometry","onSliderLinkClick","$event","sectionId","finalLabel","plpListLabel","bubbleLabel","onSectionChange","updateBubbles","updateChips","createListeners","once","updateLayout","eventsManager","renderNavigation","getSliderOptions","flex_auto","gradients_color","gradients_width","slider_id","a11y_goto_slide","renderList","sliderOptions","sliderData","display_buttons","renderFunction","bubble","renderBubble","bubbleWithCampaign","renderChip","chip","bubbleId","chips","chipId","isChecked","_index","sliderChip","emit","header","stickyBarHeight","height","scrollOptions","preventScroll","$header","$stickyBar","headerRect","y","stickyBarRect","runningExperiments","Set","runningExperiment","experiment","EXPLICIT_FILTERS","FILTER_MAIN_BLOCK_ID","SORT_MENU_ID","POPIN_ID","NAVIGATION_MAIN_BLOCK_ID","PRODUCTS_LIST_MAIN_BLOCK_ID","PRODUCTS_RESULTS_MAIN_BLOCK_ID","CB_RESULTS_TOTAL_ID","MY_RECOMMENDATIONS_ID","QUERY_URL_PARAMETER_FILTERS","QUERY_URL_PARAMETER_SORT","appData","_productsFlat","sessionId","plpType","plpDataType","reload","initPriceFormatter","initCurrency","read","filters","productsList","getProducts","acc","concat","productsListFiltered","withSort","selectedFilters","filterPredicate","filterProductsByFilterType","doesProductMatchFilter","filterProductsByAllFilters","filteredList","sortCurrent","order","sorter","isAscending","a","b","createSorter","sort","sortProducts","productsFilteredCount","filtersUpdate","filterSelection","fireAll","f","setFilterValue","filterChipsUpdate","filtersUpdateMultiple","valueSelections","filtersSelected","filterValueIsEqual","filtersSelectedWithLabel","filterKey","filterValue","foundFilter","filterLabel","values","v","categoryTitle","title","filtersSelectedCount","filtersSelectedSerialized","filtersReset","filterChip","productCount","predicate","subscribe","fn","unsubscribe","fnToRemove","productPropValue","groups","current","groupFiltersByType","types","splice","fSelected","updateUrlVariable","variable","queryArray","path","updateQueryStringParameter","uri","re","separator","encodeURIComponent","pushState","getUrlVariable","queryString","search","URLSearchParams","decodeURIComponent","defaultTracking","getSortTracking","isSorted","sortKey","sortOrder","getFilterTracking","isFiltered","__crema_service__","pageStores","signalStore","ProductsList","signal","ProductDetails","HeaderNavigation","setPageHtml","getStore","pageHtml","getModuleData","moduleName","setModuleData","parser","loadFromUrl","cacheOnly","batch","store","debug","response","fetch","ok","status","statusText","fetchHtml","parseModuleData","moduleScript","scripts","script","parseHtml","lines","line","trimmed","startsWith","jsonString","parseProductScript","appStates","appEvents","process","handlePostEvent","appStatesHandler","err","loadFromPage","onReload","urlObj","URL","pathname","history","simulatePageChange","_data","onloadSuccess","nextState","onloadError","showError","onMergeData","filtersService","productService","dataSortService","recommendationService","recommendationInstance","mergeData","recommendation","readyToLoadProducts","loadProducts","newData","enabledTechnologies","isSelected","at","translations","nav_links","hide_sort_and_filter","maxIntensity","getTrackingData","mergeProductData","categoriesExtraData","mergeFilters","urlFilters","filterData","cleanFilterDataXSS","source","cleanData","sourceItem","isLast","urlSort","sortData","cleanSortDataXSS","setUrlOverrides","notCurrentTech","handleExperiments","trackLoad","switchProductsPage","readyForShowResults","readyForPlay","onMergeDataError","onFilter","grouped","replaceAll","groupSelectedFilters","groupKeys","filterTrackingFromPlpFilters","onSort","trackInteraction","onloadFilter","onloadFilterSuccess","readyForFilter","onloadFilterError","handleAppEvent","customEventName","eventFn","stateTransitionsManager","_SORT_MENU_ID","WeakMap","formatSortSeparator","componentUpdated","boundOnSortChange","onSortChange","__privateGet","sortButton","_filters","isDisabled","onStoreChanges","labelEl","getLabel","__privateSet","renderBefore","renderAfter","handleChipEvent","itemValue","CATEGORY_IDENTIFIER","a11y_see_result_number_label","getA11ySeeResultsText","see_result_number_label","see_result_number_label_one","filtersTracking","btnReset","btnResult","visibility","see_result_number_label_zero","eventPopinClsed","arguments","bubbleElement","oldVal","newVal","updateBubbleCounter","cta_filter_label","SLIDER_NAV_LINKS_ID","renderLinksList","label_sort_by","aa_description_sort_by","aa_listbox_description_sort_by","aa_select_description_sort_by","label_close_sort_by","_formatSortValue","updateComponent","HTML","filterLinks","service","stickyService","elementHeight","stickyElementSelector","magicIndex","initialize","updateSticky","offsetElement","isReady","offsetTop","offsetHeight","paddingTop","$element","$elementHeight","$stickyElementSelector","$magicIndex","updatePosition","offset","nav_link","data_navigation_bubbles","dataTransformNavigationBubbles","customEventAction","navLinks","dataTransformNavLinks","_isSticky","getNamedItem","navigationBar","a11y_label","colorHtml","renderProduct","getSkuComponentByType","is_machine_b2b","_headerSelector","_resetSelector","shouldHideHeader","productListBkp","headerMarkup","copywritingProps","a11y_header_result_label_button","a11y_header_result_label_reset","a11y_header_result_label_results","header_result_label","header_result_label_reset","header_result_label_results","header_result_label_results_one","header_result_label_results_zero","total","filterLabels","getResultLabel","arraysAreEqual","outerhtml","hasFilters","listName","resetClick","categoryProducts","PLPApp","dataTransformService","dataFiltersService","propChanged","valueChanged","defineTemplate","enabledExperiments","enableExperiment","info","itemsPerRow","items_per_row","Category","PageBuilderData","_id","_name","_description","_products","_capacityLabel","_detailsIcon","_icon","_isLoadingProducts","_rangeLink","_subCategories","_superCategories","_url","_background_retina","_background_desktop","_background_mobile","_background_tablet","_contrast","_isSegment","capacityLabel","detailsIcon","rangeLink","subCategories","superCategories","isLoadingProducts","isProductCategory","AccessoryCategory","Product","available","maxOrderQuantity","packagingType","pushRatingEnabled","altText","AccessoryProduct","collections","navigationLinks","enabledCremaTechnologies","VERTUO_ICON","PRO_ICON","transformCremaTechnologiesToLink","getIconByTechnology","COFFEE_ORIGINAL","hide_technologies_in_navigation","replaceCremaTechnologies","all_products_navigation_label","selectedTechnology","t","navLinksWithoutTechnology","navigationBubbles","productGroups","productsGroup","bubblesFilteredAndSorted","bubblesMathProductsGroup","normalizedBubble","ele","cremaCategory","cremaBubble","unshift","addLabels","highlightLabels","textColor","parsedData","parseLabels","labelGroups","group","__label","productIds","prod","labelGroup","indexToRemove","productGroup","MainDTO","colorFilterFunction","getOverridenProductGroups","applyRecommendationOverrides","getPBProperty","pbProduct","pbProductData","display_machine_range_name","applyProductsOverrides","overriddenCategories","extraData","catData","category_id","categoryObj","productID","productObj","Boolean","applyCategoryOverrides","original","vertuo","getMergedPLPData","Filter","_filter","_type","_key","_iconFn","_filterFn","_title","_values","_after","_before","showalllabel","iconFn","filterFn","before","after","pushValues","x","DefaultFilterChipType","_value","_label","_filterType","_filterKey","_color","_selected","_disabled","productCountLabel","getMergedFilterData","PBprops","filterDefinition","categoriesData","fieldValue","getCategoryData","findCategory","cssColorCode","createFilter","getMergedSortData","dropdown_recommended_option_label","dropdown_price_ascending_option_label","dropdown_price_descending_option_label","dropdown_name_ascending_option_label","dropdown_name_descending_option_label","productList","productsResults","cbResultsTotalText","plpFilterPopin","errorMessage","PLPAccessory"],"mappings":"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"}