{"version":3,"file":"index.es.min.js","sources":["../../../packages/helpers/src/props.helpers.js","../../../packages/helpers/src/utils.ts","../../../packages/helpers/src/dataLayer.js","../../../packages/page-builder-sections/src/track-and-trace/config/constants.js","../../../packages/page-builder-sections/src/track-and-trace/track-and-trace.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 { 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","export const getDataLayer = () => {\n    return window[window?.padlNamespace]?.dataLayer\n}\n\nexport const getMarketCode = () => {\n    const dataLayer = getDataLayer()\n    if (!dataLayer) {\n        return 'ch'\n    }\n\n    return dataLayer.app.app.market.toLocaleLowerCase()\n}\n\nexport const getLangCode = () => {\n    const dataLayer = getDataLayer()\n    if (!dataLayer) {\n        return 'en'\n    }\n\n    return getDataLayer().page.page.pageInfo.language.toLocaleLowerCase()\n}\n\nexport const getSegmentCode = () => {\n    const dataLayer = getDataLayer()\n    if (!dataLayer) {\n        return 'B2C'\n    }\n\n    return getDataLayer().page.page.pageInfo.segmentBusiness\n}\n\nexport const isLoggedIn = () => {\n    const dataLayer = getDataLayer()\n    if (!dataLayer || !dataLayer.user) {\n        return false\n    }\n\n    return dataLayer.user.isLoggedIn\n}\n\nexport const interpolateMarketLang = (string, market, lang) => {\n    return string.replace('{market}', market).replace('{lang}', lang)\n}\n","export const constants = {\n    slugs: {\n        default: 'nespresso-widget',\n        B2B: {\n            at: {\n                de: '2dfba8646325',\n                en: 'f6ef46051ad6'\n            },\n            au: {\n                en: 'f15ad9dd869b'\n            },\n            ch: {\n                de: '52250d2a0ecb',\n                en: '3bc09e52e70d',\n                fr: '728f831b1501',\n                it: '40958f2c9b45'\n            },\n            nz: {\n                en: '1f88e21f38a0'\n            },\n            uk: {\n                en: '68947fa36919'\n            }\n        },\n        ar: {\n            en: 'cecd9be09bb4',\n            es: '461691a4a63b'\n        },\n        at: {\n            de: '76d662bdd77c',\n            en: '4b1b0530ce64'\n        },\n        au: {\n            en: '91a1259a9151'\n        },\n        be: {\n            en: '7df5ed6cbd3b',\n            fr: '1e376f64da00',\n            nl: 'd76469a95da8'\n        },\n        br: {\n            en: '8b4d3f283684',\n            pt: 'a48c901ced1a'\n        },\n        ca: {\n            en: 'dd240d331e63',\n            fr: 'c5c5088bc3e5'\n        },\n        ch: {\n            de: 'ebecb15e14af',\n            en: '7ac26892876a',\n            fr: '296c2eefad4d',\n            it: 'c26a3f63c31e'\n        },\n        cl: {\n            en: 'bb41f830cca6',\n            es: 'adf797d30dde'\n        },\n        co: {\n            en: '8c0793bd8e63',\n            es: '454deb4452ea'\n        },\n        cz: {\n            cs: '2ad4784b762b',\n            en: '17777c1cf3ce'\n        },\n        dk: {\n            da: '3f44704940c6',\n            en: '2e5a269b8f65'\n        },\n        fi: {\n            en: '87c149930a36',\n            fi: '6ccef21ad416'\n        },\n        gr: {\n            el: 'f828a6090cba',\n            en: '8a3847031895'\n        },\n        hk: {\n            en: '9630e1c278a4',\n            zh: '1e01467ce97f'\n        },\n        hu: {\n            en: '67c6a8a3c6b3',\n            hu: '570e9037a5f9'\n        },\n        it: {\n            en: 'ffef06a896b8',\n            it: 'cb9e60344b99'\n        },\n        kr: {\n            en: '4bacf8b8473e',\n            ko: '52eb17a93dae'\n        },\n        lu: {\n            de: 'd76469a95da8',\n            en: '7df5ed6cbd3b',\n            fr: '1e376f64da00'\n        },\n        mx: {\n            en: '91859b82ccee',\n            es: '61b7fc05402e'\n        },\n        nl: {\n            en: 'cbdc8652f329',\n            nl: 'e57587013285'\n        },\n        no: {\n            en: '8759084e9cb9',\n            no: 'f8e0ef1075bc'\n        },\n        nz: {\n            en: 'e32f91079949'\n        },\n        pt: {\n            en: 'nespresso-widget',\n            pt: 'a681ae0c82d6'\n        },\n        se: {\n            en: '6f2ec238150d',\n            se: 'de43b0edbe28'\n        },\n        sk: {\n            en: '0940d32fe85f',\n            sk: '1bdefc93c95a'\n        },\n        th: {\n            en: 'a2e74b80ccee',\n            th: '74818493c225'\n        },\n        uk: {\n            en: '588b8f537625'\n        }\n    }\n}\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { loadExternalScript } from '@kissui/helpers/src/utils'\nimport { getMarketCode, getLangCode, getSegmentCode } from '@kissui/helpers/src/dataLayer'\nimport { constants } from './config/constants'\n\nclass TrackAndTrace extends HTMLElement {\n    // 3rd party script, dynamically loads, creates and renders inputs and labels.\n    // This is a workaround that waits for the page to load, render, and then links the labels and inputs together, improving accessibility\n    observeDOMChanges() {\n        const observer = new MutationObserver(() => {\n            this.findAndProcessInputs()\n        })\n\n        const widgetRoot = document.getElementById('pp-widget-root')\n        if (widgetRoot) {\n            observer.observe(widgetRoot, {\n                childList: true,\n                subtree: true\n            })\n        } else {\n            console.warn('pp-widget-root not found.')\n        }\n\n        console.log('Inputs or labels not found yet')\n    }\n\n    findAndProcessInputs(\n        widgetRoot = document.querySelector(\n            '#pp-widget-root > div > div > div > div > div.sc-1n82xk-0.kxcGSn > form > div > div > div'\n        )\n    ) {\n        if (!widgetRoot) {\n            console.warn('Widget root not found.')\n            return\n        }\n\n        const input = widgetRoot.querySelector('div:nth-child(1) > input')\n        const label = widgetRoot.querySelector('label')\n        const inputTwo = widgetRoot.querySelector('div:nth-child(2) > input')\n        const labelTwo = widgetRoot.querySelector('div:nth-child(2) > label')\n\n        if (input) {\n            input.setAttribute('data-testid', 'order-id-input')\n        }\n        if (label) {\n            label.setAttribute('data-testid', 'order-id-label')\n        }\n        if (inputTwo) {\n            inputTwo.setAttribute('data-testid', 'order-id-inputTwo')\n        }\n        if (labelTwo) {\n            labelTwo.setAttribute('data-testid', 'order-id-labelTwo')\n        }\n\n        // If the input and labels can be found on the page, then link them together\n        if (input && label && inputTwo && labelTwo) {\n            if (!input.id) {\n                input.id = 'order_id_input'\n            }\n            label.setAttribute('for', input.id)\n\n            if (!inputTwo.id) {\n                inputTwo.id = 'order_id_input_two'\n            }\n            labelTwo.setAttribute('for', inputTwo.id)\n        } else {\n            console.log('Inputs or labels not yet found.')\n        }\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n        this.observeDOMChanges()\n    }\n\n    validateOrderId(orderId) {\n        const regex = /^[a-zA-Z0-9-_]+$/\n        return regex.test(orderId) ? orderId : ''\n    }\n\n    getOrderId() {\n        const QUERY_PARAMETER_ORDER_ID = 'orderid'\n\n        const urlParams = new URLSearchParams(window.location.search)\n        const rawOrderId = urlParams.get(QUERY_PARAMETER_ORDER_ID) || ''\n        const validatedOrderId = this.validateOrderId(rawOrderId)\n\n        return validatedOrderId ? `data-order-id=\"${validatedOrderId}\"` : ''\n    }\n\n    getSlug() {\n        const marketCode = getMarketCode()\n        const langCode = getLangCode()\n        const segmentCode = getSegmentCode()\n\n        const segmentBasedSlug = constants.slugs[segmentCode]?.[marketCode]?.[langCode]\n        const marketBasedSlug = constants.slugs[marketCode]?.[langCode]\n        const defaultSlug = constants.slugs.default\n\n        return segmentBasedSlug || marketBasedSlug || defaultSlug\n    }\n\n    render() {\n        const { layout, campaign } = this.props ?? {}\n        const {\n            contrast = 'light',\n            background_color = 'white_1000',\n            padding_top = 'pt9',\n            padding_bottom = 'pb9'\n        } = layout ?? {}\n        const { id, creative, name, position } = campaign || {}\n\n        let slug = this.getSlug()\n        if (!slug) {\n            console.info(\n                '\\n\\n%cTrack & Trace%c is not activated on your market, please activate it following this wiki.\\nhttps://dsu-confluence.nestle.biz/x/SuRLE\\n\\n',\n                'font-weight: bold;', // Bold style for 'Track & Trace'\n                '' // Reset style for the rest of the message\n            )\n\n            slug = constants.slugs.default\n        }\n\n        this.innerHTML = `\n            <nb-container\n                campaign_id=\"${id}\"\n                campaign_name=\"${name}\"\n                campaign_creative=\"${creative}\"\n                campaign_position=\"${position}\"\n                contrast=\"${contrast}\"\n                background_color=\"${background_color}\"\n                classname=\"${padding_top} ${padding_bottom}\">\n                <div\n                    id=\"pp-widget-root\"\n                    data-cms-slug=\"${slug}\"\n                    data-location-consent=false\n                    ${this.getOrderId()}\n                    ></div>\n            </nb-container>\n        `\n        this.callExternalService()\n    }\n\n    callExternalService() {\n        loadExternalScript({\n            src: 'https://tracking.parcelperform.com/pp-widget.js',\n            defer: true,\n            callback: () => {\n                this.observeDOMChanges()\n                this.findAndProcessInputs()\n            }\n        })\n    }\n}\n\ncustomElements.get('nb-track-and-trace') ||\n    customElements.define('nb-track-and-trace', TrackAndTrace)\nexport default TrackAndTrace\n"],"names":["isNil","obj","DOMParser","getDataLayer","window","padlNamespace","dataLayer","constants","default","B2B","at","de","en","au","ch","fr","it","nz","uk","ar","es","be","nl","br","pt","ca","cl","co","cz","cs","dk","da","fi","gr","el","hk","zh","hu","kr","ko","lu","mx","no","se","sk","th","TrackAndTrace","HTMLElement","observeDOMChanges","observer","MutationObserver","this","findAndProcessInputs","widgetRoot","document","getElementById","observe","childList","subtree","console","warn","log","querySelector","input","label","inputTwo","labelTwo","setAttribute","id","connectedCallback","props","attributes","data","find","attribute","nodeName","getData","filter","reduce","all","attr","nodeValue","JSON","parse","error","createProps","render","validateOrderId","orderId","test","getOrderId","rawOrderId","URLSearchParams","location","search","get","validatedOrderId","getSlug","marketCode","getMarketCode","app","market","toLocaleLowerCase","langCode","page","pageInfo","language","segmentCode","segmentBusiness","segmentBasedSlug","marketBasedSlug","defaultSlug","layout","campaign","contrast","background_color","padding_top","padding_bottom","creative","name","position","slug","info","innerHTML","callExternalService","loadExternalScript","src","callback","async","defer","module","script","createElement","type","onload","body","appendChild","customElements","define"],"mappings":"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"}