{"version":3,"file":"index.es.min.js","sources":["../../../packages/helpers/src/props.helpers.js","../../../packages/components/src/constants.mjs","../../../packages/helpers/src/viewport.helpers.ts","../../../packages/helpers/src/utils.ts","../../../packages/components/src/slider-natural/slider-natural.js","../../../packages/helpers/src/contrast.helpers.js","../../../packages/helpers/src/useragent.helpers.ts","../../../packages/helpers/src/assets/js/eventDispatch.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 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","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","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","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"],"names":["isNil","obj","CONTRAST_LIGHT","helper","is","innerWidth","vw","devicePixelRatio","window","mobile","BREAKPOINT_M","mobile_tablet","BREAKPOINT_TABLET","tablet","desktop","retina","lt","ref","DOMParser","SliderNatural","HTMLElement","constructor","__privateAdd","this","_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","contrast","defaultPosition","displayButtons","displayNav","displayCounter","displayGradients","itemsPerSlide","overflow","overflowOpacity","flexAuto","boundPrevClick","__privateMethod","onPrevClick_fn","bind","boundNextClick","onNextClick_fn","boundNavClick","onNavClick_fn","boundScroll","onScroll_fn","connectedCallback","slot","innerHTML","props","attributes","data","find","attribute","nodeName","getData","filter","reduce","all","attr","nodeValue","JSON","parse","error","console","log","createProps","render_fn","call","id","testId","length","result","characters","i","charAt","Math","floor","random","makeId","setProperties_fn","loops","waitForSliderToBeSized_fn","then","initSlider","dispatchReady_fn","catch","e","finally","wait","clearInterval","slidesElements","querySelectorAll","itemNumber","set_fn","options","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","index","instantly","goToSlide","parseInt","undefined","currentIndex","carousel","scrollTo","left","sliderPositions","behavior","disconnectedCallback","unbindEvent_fn","WeakSet","#waitForSliderToBeSized","Promise","resolve","reject","setInterval","offsetWidth","#set","key","value","normalisedValue","getOption_fn","convertToCamelCase","str","arr","match","map","m","low","toLowerCase","split","s","k","toUpperCase","join","#getOption","isNaN","parseFloat","#setProperties","a11y_labels","container","querySelector","wrapper","viewportHelper","property","classList","add","buttonsContrast","setAttribute","setCssSlideMinHeight_fn","setCssSliderGap_fn","setCssPlaceholder_fn","#render","#renderButtons","prevButton","nextButton","remove","renderButton_fn","#renderButton","pos","renderInCounter","creative","name","position","campaign","buttonContrast","isPrev","buttonEl","document","createElement","setAttributes","element","attrs","variation","size","icon_right","label","campaign_creative","campaign_id","campaign_name","campaign_position","counter","prepend","append","#renderNav","nav","bullets","renderBullet_fn","appendChild","navElements","#renderBullet","#renderCounter","#renderGradients","gradientsWidth","setCss_fn","gradientsColor","#renderSafariFix","isSafari","agent","navigator","userAgent","test","safariFix","safariFixWidth","paddingCorrection","sliderGap","BROWSER_CONTEXT","style","setProperty","#calculateItemsPerSlide","itemWidth","scrollWidth","#getSliderPositions","maxScroll","firstItemOffsetLeft","offsetLeft","forEach","push","#setCss","isRem","#setCssSlideWidth","itemWidthAuto","clientWidth","#setCssSlideMinHeight","slideMinHeight","#setCssSliderGap","#setCssFlexAuto","#setCssPlaceholder","placeholderBackground","#setCssItemsPerSlide","#applyCenteredLayout","#updateStates","setActiveButtons_fn","setActiveBullet_fn","setCounter_fn","setActiveSlides_fn","updateStatesScroll_fn","#updateStatesScroll","#setActiveButtons","#setActiveBullet","item","#setCounter","textContent","#setActiveSlides","tempIndex","removeAttribute","#gotoDefaultPosition","#onScroll","isScrolling","clearTimeout","setTimeout","carouselScrollLeft","round","scrollLeft","indexOf","switchBullets_fn","#getOpacityParams","getComputedStyle","getPropertyValue","itemWidthAdjusted","#setOpacity","scrollX","itemX","percentage","opacityPercentage","finalOpacity","firstElementChild","#switchBullets","alreadyScrolled","#onPrevClick","#onNextClick","#onNavClick","target","dataset","#dispatchReady","dispatchEvent","eventName","args","Error","event","CustomEvent","detail","bubbles","Event","createEvent","initEvent","#bindEvent","addEventListener","#unbindEvent","removeEventListener","customElements","get","define"],"mappings":"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"}