{"version":3,"file":"index.es.min.js","sources":["../../../packages/helpers/src/props.helpers.js","../../../packages/components/src/constants.mjs","../../../packages/components/src/add-to-cart-standalone/components/qs/constants.js","../../../packages/helpers/src/assets/js/eventDispatch.js","../../../packages/helpers/src/swipeEvents.ts","../../../packages/helpers/src/assets/js/scopedKeyboardNav.js","../../../packages/components/src/add-to-cart-standalone/components/qs/components/overlay.js","../../../packages/helpers/src/viewport.helpers.ts","../../../packages/components/src/add-to-cart-standalone/components/qs/qs.js","../../../packages/components/src/add-to-cart-standalone/add-to-cart-standalone.js","../../../packages/helpers/src/catalog.js","../../../packages/components/src/add-gift-card/add-gift-card.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","export const MAX_WIDTH_CONTAINER = 1160\n\nexport const BREAKPOINT_XL = 1920\nexport const BREAKPOINT_TABLET = 1024\nexport const BREAKPOINT_L = 996\nexport const BREAKPOINT_M = 768\nexport const BREAKPOINT_S = 750\nexport const BREAKPOINT_XS = 375\n\nexport const CTA_PRIMARY = 'primary'\nexport const CTA_PRIMARY_TRANSPARENT = 'primary_transparent'\nexport const CTA_SUBTLE = 'subtle'\nexport const CTA_LINK = 'link'\nexport const CTA_LINK_UNDERLINE = 'link-underline'\nexport const CTA_LINK_GOLD = 'link-gold'\nexport const CTA_LINK_ADD_TO_CART_SMALL = 'AddToCart_small'\nexport const CTA_LINK_ADD_TO_CART_LARGE = 'AddToCart_large'\n\nexport const EVENT_TAB_CHANGE = 'EVENT_TAB_CHANGE'\n\nexport const EVENT_VIDEO = 'WEB_COMPONENT_VIDEO'\nexport const EVENT_POPIN_OPEN = 'WEB_COMPONENT_POPIN_OPEN'\nexport const EVENT_POPIN_OPENED = 'WEB_COMPONENT_POPIN_OPENED'\nexport const EVENT_POPIN_CLOSE = 'WEB_COMPONENT_POPIN_CLOSE'\nexport const EVENT_POPIN_CLOSED = 'WEB_COMPONENT_POPIN_CLOSED'\nexport const EVENT_POPIN_CLOSE_CLICK = 'WEB_COMPONENT_POPIN_CLOSE_CLICK'\nexport const EVENT_POPIN_KEY_DOWN = 'keydown'\nexport const EVENT_POPIN_FORM_TOGGLE_TITLE = 'WEB_COMPONENT_POPIN_FORM_TOGGLE_TITLE'\nexport const EVENT_CTA_CLICK = 'WEB_COMPONENT_CTA_CLICK'\nexport const EVENT_HERO_REORDER_OPEN = 'WEB_COMPONENT_HERO_REORDER_OPEN'\nexport const EVENT_HERO_REORDER_CLOSE = 'WEB_COMPONENT_HERO_REORDER_CLOSE'\nexport const EVENT_QUICKVIEW_OPEN = 'WEB_COMPONENT_QUICKVIEW_OPEN'\nexport const EVENT_QS_OPEN = 'WEB_COMPONENT_QS_OPEN'\nexport const EVENT_QS_OPENED = 'WEB_COMPONENT_QS_OPENED'\nexport const EVENT_QS_CLOSE = 'WEB_COMPONENT_QS_CLOSE'\nexport const EVENT_QS_CLOSED = 'WEB_COMPONENT_QS_CLOSED'\nexport const EVENT_QS_CLOSE_CLICK = 'WEB_COMPONENT_QS_CLOSE_CLICK'\nexport const EVENT_QS_KEY_DOWN = 'keydown'\nexport const EVENT_ADD_TO_CART = 'WEB_COMPONENT_ADD_TO_CART'\nexport const EVENT_CART_UPDATED = 'WEB_COMPONENT_CART_UPDATED'\nexport const EVENT_VIDEO_TOGGLE = 'WEB_COMPONENT_VIDEO_TOGGLE'\nexport const VIDEO_ON_HOVER = 'VIDEO_ON_HOVER'\nexport const VIDEO_ON_OUT = 'VIDEO_ON_OUT'\nexport const EVENT_DETAIL_OPEN = 'WEB_COMPONENT_DETAIL_OPEN'\nexport const EVENT_SLIDER_READY = 'WEB_COMPONENT_SLIDER_READY'\nexport const EVENT_SLIDE_CHANGE = 'WEB_COMPONENT_SLIDE_CHANGE'\nexport const EVENT_OVERLAY_OPEN = 'WEB_COMPONENT_OVERLAY_OPEN'\nexport const EVENT_OVERLAY_CLOSE = 'WEB_COMPONENT_OVERLAY_CLOSE'\nexport const EVENT_OVERLAY_CLICKED = 'WEB_COMPONENT_OVERLAY_CLICKED'\nexport const EVENT_OPEN_PRODUCT_AR_CLICKED = 'OPEN_PRODUCT_AR_CLICKED'\nexport const EVENT_SORT_BY_CHANGE = 'WEB_COMPONENT_SORT_BY_CHANGE'\n\nexport const EVENT_BUBBLE_SELECTED = 'EVENT_BUBBLE_SELECTED'\nexport const EVENT_RECO_TOOL_OPTION_CLICKED = 'EVENT_RECO_TOOL_OPTION_CLICKED'\nexport const WEB_COMPONENT_PROJECTS_LOADED = 'WEB_COMPONENT_PROJECTS_LOADED'\nexport const WEB_COMPONENT_ANCHOR_LOADED = 'WEB_COMPONENT_ANCHOR_LOADED'\n\nexport const EVENT_SWIPED_UP = 'swiped-up'\nexport const EVENT_SWIPED_DOWN = 'swiped-down'\nexport const EVENT_SWIPED_LEFT = 'swiped-left'\nexport const EVENT_SWIPED_RIGHT = 'swiped-right'\n\nexport const EVENT_HEADER_POSITION_CHANGED = 'EVENT_HEADER_POSITION_CHANGED'\n\nexport const keys = { ESC: 'Escape' }\n\nexport const ADD_TO_CART_MODIFIER_MINI = 'mini'\nexport const ADD_TO_CART_MODIFIER_DEFAULT = ADD_TO_CART_MODIFIER_MINI\n\nexport const COFFEE_ORIGINAL = 'original'\nexport const COFFEE_VERTUO = 'vertuo'\nexport const COFFEE_PRO = 'pro'\nexport const COFFEE_OL = 'OL'\nexport const COFFEE_VL = 'VL'\nexport const INTENSITY_MAX_OL = 14\nexport const INTENSITY_MAX_VL = 12\nexport const DEFAULT_BUBBLE_ICON = ''\n\nexport const NUMBER_PRODUCTS_SLIDER = 8\nexport const NUMBER_FEATURES_PDP = 8\n\nexport const ALIGNMENT = ['center', 'left', 'right']\nexport const POSITION = ['top', 'right', 'bottom', 'left']\nexport const TRANSLATION_ADD_TO_CART = 'Add to cart'\nexport const TRANSLATION_UPDATE_BASKET = 'Update basket'\n\nexport const TIME_INSTANT = 1\nexport const TIME_FAST = 300\nexport const TIME_MEDIUM = 600\nexport const TIME_SLOW = 1200\n\nexport const APP_APPLE_LINK = {\n default: 'https://apps.apple.com/us/app/nespresso/id342879434',\n us: 'https://apps.apple.com/us/app/nespresso-new/id1609639566',\n uk: 'https://apps.apple.com/gb/app/nespresso-new/id1609639566'\n}\nexport const APP_ANDROID_LINK =\n 'https://play.google.com/store/apps/details?id=com.nespresso.activities'\nexport const APP_HUAWEI_LINK = 'https://appgallery.huawei.com/app/C102571517'\n\nexport const SRC_PAGE_PLP = 'plp'\nexport const SRC_PAGE_PDP = 'pdp'\n\nexport const PLP_TYPE_COFFEE = 'coffee'\nexport const PLP_TYPE_MACHINE = 'machine'\nexport const PLP_TYPE_ACCESSORY = 'accessory'\nexport const CALLEO_API_DOMAIN = 'https://www.contact.nespresso.com/'\n\n// SCSS RELATED\n// Todo : should be shared by JS and SCSS\nexport const BROWSER_CONTEXT = 16 // 1rem = 16px\nexport const COLOR_WHITE_1000 = '#FFFFFF' // Do not change for #FFF shortcut, it will break slider-natural gradients !\n\nexport const CONTRAST_DARK = 'dark'\nexport const CONTRAST_LIGHT = 'light'\n\nexport const B2B_CONTACT_FORM_POPIN_ID = 'b2b-contact-form-popin-id'\nexport const B2B_CONTACT_FORM_POPIN_SRC_SEARCH = 'coveo-search'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO = 'sku-main-info'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO_AUTO = 'sku-main-info-auto'\n\nexport const ASPECT_RATIO_16_9 = '16/9'\nexport const ASPECT_RATIO_1_1 = '1/1'\n\nexport const NESPRESSO_PRODUCTION_DOMAIN = 'https://www.nespresso.com'\nexport const NESPRESSO_ROLLOUT_DOMAIN = 'https://nc2-env-rollout.nespresso.com'\n\nexport const EVENT_QUIZ_ON_GO_BACK = 'WEB_COMPONENT_EVENT_QUIZ_ON_GO_BACK'\nexport const EVENT_QUIZ_SUBMIT = 'WEB_COMPONENT_EVENT_QUIZ_SUBMIT'\n","export const QUANTITY_SELECTOR_ID = 'quantity-selector-id'\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","/*!\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","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 './overlay.scss'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_QS_CLOSE, TIME_INSTANT, TIME_SLOW } from '@kissui/components'\n\nconst open = (id, isTransparent = false) => {\n const overlay = document.createElement('div')\n overlay.classList.add('nb-overlay')\n if (isTransparent) {\n overlay.classList.add('isTransparent')\n }\n overlay.addEventListener('click', () => {\n dispatchEvent({ eventName: EVENT_QS_CLOSE, args: { id: 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 { 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","import { readEvent, dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport swipeEvents from '@kissui/helpers/src/swipeEvents'\nimport createProps from '@kissui/helpers/src/props.helpers'\nimport {\n recursiveSwitchAriaHidden,\n setFirstAndLastFocusable,\n focusin\n} from '@kissui/helpers/src/assets/js/scopedKeyboardNav'\nimport {\n EVENT_QS_OPEN,\n EVENT_QS_CLOSE,\n EVENT_QS_CLOSED,\n EVENT_QS_KEY_DOWN,\n EVENT_SWIPED_DOWN,\n EVENT_ADD_TO_CART,\n TIME_FAST\n} from '@kissui/components'\nimport Overlay from './components/overlay'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { QUANTITY_SELECTOR_ID } from './constants'\n\nconst STATE_OPEN = 'isOpen'\nconst SCROLL_LOCK = 'scroll-lock'\n\nclass Qs extends HTMLElement {\n constructor() {\n super()\n this.props = {}\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 this.boundSwipeDown = this.swipeDown.bind(this)\n this.boundNumericKeypress = this.numericKeypress.bind(this)\n this.boundValueChanged = this.valueChanged.bind(this)\n this.boundAddToCart = this.addToCart.bind(this)\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n const { id } = this.props\n this.setAttribute('id', id || QUANTITY_SELECTOR_ID)\n\n this.style.display = 'none'\n this.ariaModal = false\n this.oldValue = ''\n\n this.render()\n }\n\n disconnectedCallback() {\n Overlay.close()\n if (!this.hasEvent) {\n return\n }\n this.unbindEvent()\n }\n\n render() {\n if (this.hasEvent) {\n this.unbindEvent()\n }\n\n const {\n a11y_qs_label,\n a11y_qs_description,\n a11y_predefined_quantity,\n a11y_predefined_description,\n a11y_custom_quantity,\n a11y_custom_description,\n label_choose_quantity,\n label_button_ok,\n step,\n max\n } = this.props\n\n // FYI : The role is dialog, not alertdialog (only used for alerts / warnings ...)\n this.setAttribute('role', 'dialog')\n\n // Set the popin aria-hidden by default\n this.setAttribute('aria-hidden', 'true')\n\n this.innerHTML = `\n <form aria-label=\"${a11y_qs_label}\" aria-description=\"${a11y_qs_description}\">\n <fieldset aria-label=\"${a11y_predefined_quantity}\" aria-description=\"${a11y_predefined_description}\">\n ${this.renderItems()}\n </fieldset>\n <fieldset class=\"custom\" aria-label=\"${a11y_custom_quantity}\" aria-description=\"${a11y_custom_description}\">\n <div>\n <input id=\"other_quantity\" type=\"number\" min=\"0\" step=\"${step}\" max=\"${max}\" aria-label=\"${label_choose_quantity}\" pattern=\"[0-9]*\"/>\n <label for=\"other_quantity\" aria-hidden=\"true\" class=\"t-2xs-500-sl\">${label_choose_quantity}</label>\n </div>\n <button type=\"button\" class=\"t-sm-400-caps\">${label_button_ok}</button>\n </fieldset>\n </form>\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.firstButtonElement = this.querySelector('ul li:first-child button')\n this.buttonElements = this.querySelectorAll('ul button')\n this.inputElement = this.querySelector('input')\n this.buttonOK = this.querySelector('.custom button')\n this.bindEvent()\n }\n\n renderItems() {\n const { quantities = [] } = this.props\n\n const renderedItems = quantities.reduce(\n (output, item) => `${output}${this.renderItem(item)}`,\n ''\n )\n\n return `<ul>${renderedItems}</ul>`\n }\n\n renderItem(item) {\n const { a11y_add_label } = this.props\n return `<li><button aria-label=\"${a11y_add_label} ${item}\" value=\"${item}\" type=\"button\" class=\"t-2xs-500-sl\">${item}</button></li>`\n }\n\n addLock() {\n if (viewportHelper.is.mobile) {\n document.documentElement.classList.add(SCROLL_LOCK)\n }\n Overlay.open(this.id, true)\n }\n\n removeLock() {\n if (viewportHelper.is.mobile) {\n document.documentElement.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 brothers and brothers of parent until body\n recursiveSwitchAriaHidden(this, this.ariaModal)\n }\n\n setOpeningPosition() {\n const parentRect = this.parentNode.getBoundingClientRect()\n const estimatedWidth = 380 // Tested to be ISO to IT addToCart (was 280)\n\n if (parentRect.top < estimatedWidth) {\n this.classList.add('open-bottom')\n } else {\n this.classList.remove('open-bottom')\n }\n\n if (document.body.scrollWidth - parentRect.right < estimatedWidth) {\n this.classList.add('open-left')\n } else {\n this.classList.remove('open-left')\n }\n\n if (parentRect.left < estimatedWidth) {\n this.classList.add('open-right')\n } else {\n this.classList.remove('open-right')\n }\n }\n\n open(e) {\n if (this.isOpen) {\n return\n }\n\n // Get sku and price from event args\n const event = readEvent(e)\n if (event.id !== this.id) {\n return\n }\n\n this.isOpen = true\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 if (!viewportHelper.is.mobile) {\n this.setOpeningPosition()\n }\n this.addLock()\n this.setAttribute('aria-hidden', 'false')\n\n return new Promise(resolve => {\n setTimeout(() => {\n this.classList.add(STATE_OPEN)\n resolve()\n }, TIME_FAST)\n })\n }\n\n close() {\n if (!this.isOpen) {\n return\n }\n\n this.isOpen = false\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\n this.removeLock()\n this.setAttribute('aria-hidden', 'true')\n this.classList.remove(STATE_OPEN)\n\n dispatchEvent({\n eventName: EVENT_QS_CLOSED,\n args: { id: this.id },\n element: this\n })\n }\n\n focus() {\n this.removeEventListener('transitionend', this.boundFocus)\n\n if (this.isOpen) {\n this.firstButtonElement.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()\n }\n }\n\n swipeDown() {\n if (this.isOpen) {\n this.close()\n }\n }\n\n numericKeypress(e) {\n // Force to enter only numeric values + allow only a maximum of characters to be ISO as max number of chars\n if (!/\\d/i.test(e.key) || e.target.value.length + 1 > this.props.max.length) {\n e.preventDefault()\n }\n }\n\n valueChanged(e) {\n // This is to hide label used as placeholder\n if (e.target.value !== '') {\n e.target.classList.add('filled')\n } else {\n e.target.classList.remove('filled')\n }\n\n // If the field value is above max quantity\n if (e.target.value > this.props.max) {\n e.target.value = this.props.max\n }\n }\n\n async addToCart(e) {\n let qty = e.target.value\n if (e.target === this.buttonOK) {\n qty = this.inputElement.value\n if (qty === '') {\n return\n }\n }\n\n dispatchEvent({\n eventName: EVENT_ADD_TO_CART,\n args: { quantity: qty },\n element: this\n })\n\n this.close()\n }\n\n bindEvent() {\n this.hasEvent = true\n window.addEventListener(EVENT_QS_OPEN, this.boundOpen)\n window.addEventListener(EVENT_QS_CLOSE, this.boundClose)\n document.addEventListener(EVENT_QS_KEY_DOWN, this.boundEscapeClose)\n\n // Buttons AddToCart\n this.buttonElements.forEach(element => {\n element.boundAddToCart = this.addToCart.bind(element)\n element.addEventListener('click', this.boundAddToCart)\n })\n\n // Input number\n if (this.inputElement) {\n this.inputElement.addEventListener('keypress', this.boundNumericKeypress)\n this.inputElement.addEventListener('change', this.boundValueChanged)\n }\n\n // Button OK\n if (this.buttonOK) {\n this.buttonOK.addEventListener('click', this.boundAddToCart)\n }\n\n // Swipe\n if (viewportHelper.is.mobile) {\n swipeEvents(window, document, this)\n document.addEventListener(EVENT_SWIPED_DOWN, this.boundSwipeDown)\n this.hasSwipeEvent = true\n }\n }\n\n unbindEvent() {\n window.removeEventListener(EVENT_QS_OPEN, this.boundOpen)\n window.removeEventListener(EVENT_QS_CLOSE, this.boundClose)\n document.removeEventListener(EVENT_QS_KEY_DOWN, this.boundEscapeClose)\n\n // Buttons AddToCart\n this.buttonElements.forEach(element => {\n element.removeEventListener('click', this.boundAddToCart)\n })\n\n // Input number\n if (this.inputElement) {\n this.inputElement.removeEventListener('keypress', this.boundNumericKeypress)\n this.inputElement.removeEventListener('change', this.boundValueChanged)\n }\n\n // Button OK\n if (this.buttonOK) {\n this.buttonOK.removeEventListener('click', this.boundAddToCart)\n }\n\n // Swipe\n if (this.hasSwipeEvent) {\n document.removeEventListener(EVENT_SWIPED_DOWN, this.boundSwipeDown)\n this.hasSwipeEvent = false\n }\n this.hasEvent = false\n }\n}\n\ncustomElements.get('nb-qs') || customElements.define('nb-qs', Qs)\nexport default Qs\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { EVENT_QS_OPEN, EVENT_ADD_TO_CART, EVENT_QS_CLOSED } from '@kissui/components'\nimport { QUANTITY_SELECTOR_ID } from './components/qs/constants'\nimport { dispatchEvent, readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { getProduct } from '@kissui/helpers/src/catalog'\nimport './components/qs'\n\nclass AddToCartStandalone extends HTMLElement {\n constructor() {\n super()\n this.props = {}\n this.boundOnAddToCart = this.onAddToCart.bind(this)\n this.boundOnCartUpdated = this.onCartUpdated.bind(this)\n this.boundOnQSClosed = this.onQSClosed.bind(this)\n this.qsId = null\n this.inStock = true\n }\n\n connectedCallback() {\n try {\n this.props = createProps(this.attributes)\n } catch (e) {\n console.error(`AddToCartStandalone: data attribute isn't formatted properly`)\n }\n\n const { sku } = this.props\n this.qsId = `${QUANTITY_SELECTOR_ID}-${sku.replace(/[^\\w\\s]/gi, '-')}`\n this.render()\n\n this.onPostRender().then(() => {\n this.onRenderReady()\n })\n }\n\n render() {\n const { size = 'large', label_add_to_cart, label_update_cart } = this.props\n const { __INITIAL_CONFIG__: { translations = {} } = {} } = window\n\n const btnText = translations['global.addtobag.button.add'] || label_add_to_cart\n const btnUpdate = translations['global.addtobag.button.update'] || label_update_cart\n\n this.classList.add('nb-addToCart')\n this.innerHTML = `\n <nb-cta\n variation=\"primary\"\n icon_right=\"24/symbol/plus\"\n add_to_cart=\"${size}\"\n label_update=\"${btnUpdate}\"\n qs_id=\"${this.qsId}\">\n ${btnText}\n </nb-cta>\n `\n\n this.buttonElement = this.querySelector('nb-cta')\n }\n\n async onPostRender() {\n this.inStock = await Promise.resolve(this.props.in_stock ?? this.checkStock())\n this.readCurrentCart()\n if (!this.inStock) {\n this.querySelector('nb-cta').setAttribute('disabled', '')\n }\n }\n\n async checkStock() {\n if (!window.napi) {\n return\n }\n const { inStock } = await getProduct(this.props.sku)\n return inStock\n }\n\n readCurrentCart() {\n if (!window.napi) {\n return\n }\n\n const { sku } = this.props\n\n window.napi\n .cart()\n .read()\n .then(products => {\n const productMatch = products.find(product => product.productId.indexOf(sku) > -1)\n this.updateQuantity(productMatch?.quantity ?? 0)\n })\n }\n\n performAddToCart(quantity) {\n const { sku } = this.props\n return window.CartManager.updateItem(sku, quantity, null, null)\n }\n\n async onAddToCart(e) {\n if (!window.CartManager) {\n return\n }\n\n let { quantity } = readEvent(e)\n quantity = parseInt(quantity, 10)\n\n // TODO: check online add, remove, change quantity\n try {\n await this.performAddToCart(quantity)\n this.updateQuantity(quantity)\n } catch (e) {\n console.error(e)\n }\n }\n\n updateQuantity(value) {\n if (value === parseInt(this.buttonElement.getAttribute('quantity'), 10)) {\n return\n }\n this.buttonElement.setAttribute('quantity', value)\n }\n\n onCartUpdated() {\n this.readCurrentCart()\n }\n\n onQSClosed() {\n this.removeEventListener(EVENT_ADD_TO_CART, this.boundOnAddToCart)\n if (this.qsElement) {\n this.qsElement.removeEventListener(EVENT_QS_CLOSED, this.boundOnQSClosed)\n }\n }\n\n openQuantitySelector() {\n this.renderQuantitySelector()\n if (!this.contains(this.qsElement)) {\n // Change the DOM position only if we are opening a QS in another button\n this.qsElement.close()\n this.appendChild(this.qsElement)\n }\n this.addEventListener(EVENT_ADD_TO_CART, this.boundOnAddToCart)\n this.qsElement.addEventListener(EVENT_QS_CLOSED, this.boundOnQSClosed)\n dispatchEvent({\n eventName: EVENT_QS_OPEN,\n args: { id: this.qsId }\n })\n }\n\n renderQuantitySelector() {\n this.qsElement = this.querySelector(`#${this.qsId}`)\n if (this.qsElement !== null) {\n return\n }\n\n const { quantity_selector } = this.props\n this.qsElement = document.createElement('nb-qs')\n const data = {\n id: this.qsId,\n a11y_qs_label: quantity_selector.a11y_qs_label,\n a11y_qs_description: quantity_selector.a11y_qs_description,\n a11y_predefined_quantity: quantity_selector.a11y_predefined_quantity,\n a11y_predefined_description: quantity_selector.a11y_predefined_description,\n a11y_add_label: quantity_selector.a11y_add_label,\n quantities: quantity_selector.quantities,\n step: quantity_selector.step,\n max: quantity_selector.max,\n a11y_custom_quantity: quantity_selector.a11y_custom_quantity,\n a11y_custom_description: quantity_selector.a11y_custom_description,\n label_choose_quantity: quantity_selector.label_choose_quantity,\n label_button_ok: quantity_selector.label_button_ok\n }\n this.qsElement.setAttribute('data', JSON.stringify(data))\n }\n\n onRenderReady() {\n this.bindEvent()\n }\n\n bindUpdateCart() {\n if (window.napi && window.napi.data) {\n try {\n window.napi.data().on('cart.*', this.boundOnCartUpdated)\n } catch (e) {\n console.error(e)\n }\n }\n }\n\n bindEvent() {\n this.unbindEvent()\n this.bindUpdateCart()\n\n if (this.buttonElement && this.inStock) {\n this.boundQuantitySelectorClick = this.openQuantitySelector.bind(this)\n this.buttonElement.addEventListener('click', this.boundQuantitySelectorClick)\n }\n }\n\n unbindEvent() {\n this.removeEventListener(EVENT_ADD_TO_CART, this.boundOnAddToCart)\n\n if (this.buttonElement && this.inStock) {\n this.buttonElement.removeEventListener('click', this.boundQuantitySelectorClick)\n }\n\n if (this.qsElement) {\n this.qsElement.removeEventListener(EVENT_QS_CLOSED, this.boundOnQSClosed)\n }\n\n if (window.napi && window.napi.data) {\n window.napi.data().off('cart.*', this.boundOnCartUpdated)\n }\n }\n\n disconnectedCallback() {\n this.unbindEvent()\n }\n}\n\ncustomElements.get('nb-add-to-cart-standalone') ||\n customElements.define('nb-add-to-cart-standalone', AddToCartStandalone)\n\nexport default AddToCartStandalone\n","import { COFFEE_VERTUO } from '@kissui/components/src/constants.mjs'\nimport { getCurrency } from './getCurrency'\nexport { getCurrency } from './getCurrency'\n\nexport const ECAPI_TYPE_CAPSULE = 'capsule'\nexport const ECAPI_TYPE_MACHINE = 'machine'\nexport const ECAPI_TYPE_ACCESSORY = 'accessory'\nexport const ECAPI_TYPE_GIFT_CARD = 'giftcard'\n\nconst TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\nconst SLEEVE_OF_10 = 10\nconst SLEEVE_OF_7 = 7\n\nconst trimSku = sku => sku.replace(/[^a-z0-9- +./]/gi, '')\n\nexport const getLegacySKU = productId => productId.split('prod/').pop()\n\nexport const getPriceFormatter = async () => await window.napi.priceFormat()\n\nexport const getProduct = sku => window.napi.catalog().getProduct(trimSku(sku))\n\nexport function getTechnologyName(productData) {\n const techno = productData.technologies[0]\n return techno.substring(\n techno.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) + TECHNOLOGY_CATEGORY_IDENTIFIER.length\n )\n}\n\nfunction isMultipleOf(quantity, multiple) {\n return quantity % multiple === 0\n}\n\nexport function getSleeveNumber(product, getTechnologyNameFn = getTechnologyName) {\n if (product.sales_multiple !== 1 && isMultipleOf(product.sales_multiple, SLEEVE_OF_10)) {\n // Sleeve of original or vertuo\n return product.sales_multiple / SLEEVE_OF_10\n }\n\n if (\n product.sales_multiple !== 1 &&\n getTechnologyNameFn(product) === COFFEE_VERTUO &&\n isMultipleOf(product.sales_multiple, SLEEVE_OF_7)\n ) {\n // Sleeve of vertuo\n return product.sales_multiple / SLEEVE_OF_7\n }\n\n if (product.sales_multiple === 1 && isMultipleOf(product.unitQuantity, SLEEVE_OF_10)) {\n // Bundle of original or vertuo\n return product.unitQuantity / SLEEVE_OF_10\n }\n\n if (\n product.sales_multiple === 1 &&\n getTechnologyNameFn(product) === COFFEE_VERTUO &&\n isMultipleOf(product.unitQuantity, SLEEVE_OF_7)\n ) {\n // Bundle of vertuo\n return product.unitQuantity / SLEEVE_OF_7\n }\n\n return NaN\n}\n\n/**\n * Guess if the product is part of a bundle.\n * This is determined by checking the 'sales_multiple' and 'unitQuantity' properties.\n */\nexport function isBundled(productData) {\n // TODO: this function should not change the productData, but some components still need it\n productData.sales_multiple = productData.sales_multiple || productData.salesMultiple\n\n const isSalesMultipleGreaterThanOne = productData.sales_multiple > 1\n const isUnitQuantityEqualToOne = productData.unitQuantity === 1\n const isSalesMultipleEqualToOne = productData.sales_multiple === 1\n const isUnitQuantityGreaterThanOne = productData.unitQuantity > 1\n\n // The product is not bundled if sales_multiple > 1 and unitQuantity = 1\n if (isSalesMultipleGreaterThanOne && isUnitQuantityEqualToOne) {\n return false\n }\n\n // The product is bundled if sales_multiple = 1 and unitQuantity > 1\n return isSalesMultipleEqualToOne && isUnitQuantityGreaterThanOne\n}\n\n/**\n * Replace an array of SKU with product data\n * Remove the element inside the list if sku fail. It prevents to get an empty item.\n * @param {Array.<String>} skus\n * @param getProductFn\n * @returns {Promise<Awaited<unknown>[]>}\n */\nexport function getProductAndClean(skus, getProductFn = getProduct, napi = window.napi) {\n const promises = []\n\n if (!napi) {\n return Promise.reject()\n }\n\n if (!Array.isArray(skus)) {\n skus = [skus]\n }\n\n // Load manually the product to delete SKU fail\n for (const sku of skus) {\n promises.push(\n getProductFn(sku)\n .then(data => skus.splice(skus.indexOf(sku), 1, data))\n .catch(() => {\n skus.splice(skus.indexOf(sku), 1)\n console.error(`getProduct fail on sku ${sku}`)\n })\n )\n }\n\n return Promise.all(promises)\n}\n\nexport const getFormattedPrice = async price => {\n const priceFormatter = await getPriceFormatter()\n const currency = getCurrency()\n\n return priceFormatter.html\n ? priceFormatter.html(currency, price)\n : priceFormatter.short(currency, price) || ''\n}\n\nexport const getProductCategories = async sku => {\n const productDetails = await getProduct(sku)\n const productCategories = productDetails ? productDetails.supercategories : []\n const productCategoriesNew = await Promise.all(\n productCategories.map(async categoryEncoded => {\n const productCategoryData = await window.napi.catalog().getCategory(categoryEncoded)\n return productCategoryData\n })\n )\n return productCategoriesNew\n}\n","import AddToCartStandalone from '@kissui/components/src/add-to-cart-standalone'\n\nclass AddGiftCard extends AddToCartStandalone {\n performAddToCart(quantity) {\n const { sku, price } = this.props\n return window.CartManager.updateGiftCard(sku, quantity, price)\n }\n}\n\ncustomElements.get('nb-add-gift-card') || customElements.define('nb-add-gift-card', AddGiftCard)\nexport default AddGiftCard\n"],"names":["createProps","attributes","data","find","attribute","nodeName","getData","props","filter","reduce","all","attr","nodeValue","isNil","JSON","parse","error","console","log","obj","EVENT_QS_OPEN","EVENT_QS_CLOSE","EVENT_QS_CLOSED","EVENT_QS_KEY_DOWN","EVENT_ADD_TO_CART","EVENT_SWIPED_DOWN","QUANTITY_SELECTOR_ID","dispatchEvent","eventName","args","element","window","Error","event","CustomEvent","detail","bubbles","Event","document","createEvent","initEvent","readEvent","e","swipeEvents","stopEl","nwcSwipeEvents","addEventListener","target","getAttribute","el","undefined","contains","scrollTopArray","scrollLeftArray","push","scrollTop","scrollLeft","parentNode","memorizeStartElScrollPositions","startEl","timeDown","Date","now","touches","clientX","clientY","xDiff","yDiff","xDown","yDown","xUp","yUp","defaultVertical","innerHeight","defaultHorizontal","innerWidth","swipeThresholdVertical","getNearestAttribute","swipeThresholdHorizontal","swipeTimeout","timeDiff","eventType","changedTouches","Math","abs","checkScrollCondition","eventData","dir","replace","touchType","xStart","xEnd","yStart","yEnd","cancelable","direction","result","i","isScrollable","scrollHeight","clientHeight","scrollWidth","clientWidth","attributeName","defaultValue","documentElement","attributeValue","String","parseInt","recursiveSwitchAriaHidden","elem","componentOpenState","parent","getElementsByTagName","brothers","children","brother","setAttribute","removeAttribute","Overlay","open","id","isTransparent","overlay","createElement","classList","add","body","appendChild","setTimeout","TIME_INSTANT","close","getElementsByClassName","length","remove","TIME_SLOW","helper","is","vw","devicePixelRatio","mobile","BREAKPOINT_M","mobile_tablet","BREAKPOINT_TABLET","tablet","desktop","retina","lt","ref","STATE_OPEN","SCROLL_LOCK","Qs","HTMLElement","constructor","super","this","boundOpen","bind","boundClose","boundEscapeClose","escapeClose","boundFocus","focus","boundFocusin","focusIn","boundSwipeDown","swipeDown","boundNumericKeypress","numericKeypress","boundValueChanged","valueChanged","boundAddToCart","addToCart","connectedCallback","style","display","ariaModal","oldValue","render","disconnectedCallback","hasEvent","unbindEvent","a11y_qs_label","a11y_qs_description","a11y_predefined_quantity","a11y_predefined_description","a11y_custom_quantity","a11y_custom_description","label_choose_quantity","label_button_ok","step","max","innerHTML","renderItems","focusable","querySelectorAll","firstFocusable","lastFocusable","lastFocused","setFirstAndLastFocusable","firstButtonElement","querySelector","buttonElements","inputElement","buttonOK","bindEvent","quantities","output","item","renderItem","a11y_add_label","addLock","viewportHelper","removeLock","switchAriaModal","setOpeningPosition","parentRect","getBoundingClientRect","top","right","left","isOpen","openingSource","activeElement","Promise","resolve","TIME_FAST","removeEventListener","loop","focusin","key","test","value","preventDefault","qty","quantity","forEach","hasSwipeEvent","customElements","get","define","AddToCartStandalone","boundOnAddToCart","onAddToCart","boundOnCartUpdated","onCartUpdated","boundOnQSClosed","onQSClosed","qsId","inStock","sku","onPostRender","then","onRenderReady","size","label_add_to_cart","label_update_cart","__INITIAL_CONFIG__","translations","btnText","btnUpdate","buttonElement","in_stock","checkStock","readCurrentCart","napi","catalog","getProduct","trimSku","cart","read","products","productMatch","product","productId","indexOf","updateQuantity","performAddToCart","CartManager","updateItem","qsElement","openQuantitySelector","renderQuantitySelector","quantity_selector","stringify","bindUpdateCart","on","boundQuantitySelectorClick","off","AddGiftCard","price","updateGiftCard"],"mappings":"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"}