{"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        '&': '&amp;',\n        '<': '&lt;',\n        '>': '&gt;',\n        '\"': '&quot;',\n        \"'\": '&#039;'\n    } as { [s: string]: string }\n\n    return text.replace(/[&<>\"']/g, (m) => map[m])\n}\n\n/**\n * Because setting attributes escapes more than the characters above and then preact also\n * escapes text we need a more complete way of unescaping all html entities (not just the ones\n * above)\n */\nconst domParser = new DOMParser()\nexport const unescapeHtml = (text: string) => {\n    return domParser.parseFromString(text, \"text/html\").body.textContent\n}\n\nexport const sanitizeString = (data: {}) => {\n    if (!data) {\n        return ''\n    }\n\n    return data.toString().replace(/\"/g, '&quot;').replace(/'/g, '&apos;')\n}\n\nexport const stripTags = (s: string) => {\n    return (s || '').replace(/(<([^>]+)>)/gi, '')\n}\n\nexport const setAttributes = (element: Element, attrs: Record<string, any>) => {\n    for (let key in attrs) {\n        element.setAttribute(key, attrs[key])\n    }\n    return element\n}\n\nexport const getMetaContent = (metaName: string) => {\n    const metaTag = document.querySelector(`meta[name=${metaName}]`)\n    if (!metaTag) {\n        return ''\n    }\n    return metaTag.getAttribute('content')\n}\n\nexport const isObjectEmpty = (obj: {}) => {\n    return Object.keys(obj).length === 0\n}\n","import 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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"}