@liquidcommercedev/rmn-sdk 1.4.3 → 1.4.4-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +74 -58
- package/dist/index.esm.js +74 -58
- package/dist/types/modules/spot/html/spot.element.service.d.ts +1 -1
- package/dist/types/modules/spot/html/spot.element.shadow-root.d.ts +2 -1
- package/dist/types/modules/spot/spot.constant.d.ts +1 -0
- package/dist/types/modules/spot/spot.html.service.d.ts +1 -1
- package/dist/types/modules/spot/spot.interface.d.ts +2 -1
- package/dist/types/rmn-client.d.ts +2 -2
- package/package.json +1 -1
- package/umd/liquidcommerce-rmn-sdk.min.js +1 -1
    
        package/dist/index.cjs
    CHANGED
    
    | @@ -15152,43 +15152,45 @@ class AuthService extends BaseApi { | |
| 15152 15152 | 
             
            }
         | 
| 15153 15153 |  | 
| 15154 15154 | 
             
            const SPOT_ELEMENT_TAG = 'spot-element';
         | 
| 15155 | 
            +
            const SPOT_ELEMENT_SLOT_NAME = `${SPOT_ELEMENT_TAG}-custom-content`;
         | 
| 15155 15156 | 
             
            const SPOTS_SELECTION_API_PATH = '/spots/selection';
         | 
| 15156 15157 | 
             
            const SPOT_EVENT_API_PATH = '/spots/event';
         | 
| 15157 15158 |  | 
| 15158 | 
            -
            const SPOT_ELEMENT_SHADOW_ROOT = (width, height,  | 
| 15159 | 
            +
            const SPOT_ELEMENT_SHADOW_ROOT = (width, height, hasCustomContent) => {
         | 
| 15159 15160 | 
             
                const style = document.createElement('style');
         | 
| 15161 | 
            +
                style.textContent = `
         | 
| 15162 | 
            +
                :host {
         | 
| 15163 | 
            +
                  display: block;
         | 
| 15164 | 
            +
                  position: relative;
         | 
| 15165 | 
            +
                  container-type: inline-size;
         | 
| 15166 | 
            +
                  overflow: hidden;
         | 
| 15167 | 
            +
                }
         | 
| 15168 | 
            +
                :host([fluid="true"]) {
         | 
| 15169 | 
            +
                  width: 100%;
         | 
| 15170 | 
            +
                  height: 100%;
         | 
| 15171 | 
            +
                }
         | 
| 15172 | 
            +
                :host([fluid="false"]) {
         | 
| 15173 | 
            +
                  width: ${width}px;
         | 
| 15174 | 
            +
                  height: ${height}px;
         | 
| 15175 | 
            +
                }
         | 
| 15176 | 
            +
              `;
         | 
| 15160 15177 | 
             
                const wrapper = document.createElement('div');
         | 
| 15161 15178 | 
             
                wrapper.className = 'wrapper';
         | 
| 15162 | 
            -
                 | 
| 15163 | 
            -
             | 
| 15164 | 
            -
             | 
| 15165 | 
            -
             | 
| 15166 | 
            -
             | 
| 15167 | 
            -
             | 
| 15168 | 
            -
                     | 
| 15169 | 
            -
                    : | 
| 15170 | 
            -
             | 
| 15171 | 
            -
             | 
| 15172 | 
            -
                     | 
| 15173 | 
            -
             | 
| 15174 | 
            -
                        width: ${width}px;
         | 
| 15175 | 
            -
                        height: ${height}px;
         | 
| 15176 | 
            -
                    }
         | 
| 15179 | 
            +
                const slot = document.createElement('slot');
         | 
| 15180 | 
            +
                slot.name = SPOT_ELEMENT_SLOT_NAME;
         | 
| 15181 | 
            +
                if (!hasCustomContent) {
         | 
| 15182 | 
            +
                    style.textContent += `
         | 
| 15183 | 
            +
                  :host .wrapper {
         | 
| 15184 | 
            +
                    position: absolute;
         | 
| 15185 | 
            +
                    top: 0;
         | 
| 15186 | 
            +
                    left: 0;
         | 
| 15187 | 
            +
                    width: 100%;
         | 
| 15188 | 
            +
                    height: 100%;
         | 
| 15189 | 
            +
                    overflow: hidden;
         | 
| 15190 | 
            +
                  }
         | 
| 15177 15191 | 
             
                `;
         | 
| 15178 | 
            -
                if (hasCustomHtmlElement) {
         | 
| 15179 | 
            -
                    return { style, wrapper };
         | 
| 15180 15192 | 
             
                }
         | 
| 15181 | 
            -
                style | 
| 15182 | 
            -
                    .wrapper {
         | 
| 15183 | 
            -
                        position: absolute;
         | 
| 15184 | 
            -
                        top: 0;
         | 
| 15185 | 
            -
                        left: 0;
         | 
| 15186 | 
            -
                        width: 100%;
         | 
| 15187 | 
            -
                        height: 100%;
         | 
| 15188 | 
            -
                        overflow: hidden;
         | 
| 15189 | 
            -
                    }
         | 
| 15190 | 
            -
                `;
         | 
| 15191 | 
            -
                return { style, wrapper };
         | 
| 15193 | 
            +
                return { style, wrapper, slot };
         | 
| 15192 15194 | 
             
            };
         | 
| 15193 15195 |  | 
| 15194 15196 | 
             
            const GFONT_PRECONNECT = () => `
         | 
| @@ -16053,7 +16055,7 @@ function rbCollectionBannerWithoutTextBlockTemplate(spot) { | |
| 16053 16055 | 
             
              `;
         | 
| 16054 16056 | 
             
            }
         | 
| 16055 16057 |  | 
| 16056 | 
            -
            const STYLES$6 = ({ textColor = '# | 
| 16058 | 
            +
            const STYLES$6 = ({ textColor = '#ffffff', ctaTextColor = textColor, ctaBorderColor = ctaTextColor, primaryImage, mobilePrimaryImage = primaryImage, }) => `
         | 
| 16057 16059 | 
             
                <style>
         | 
| 16058 16060 | 
             
                    :host {
         | 
| 16059 16061 | 
             
                        min-width: 320px;
         | 
| @@ -16496,7 +16498,7 @@ function rbHomepageHeroTwoTileTemplate(spot) { | |
| 16496 16498 | 
             
              `;
         | 
| 16497 16499 | 
             
            }
         | 
| 16498 16500 |  | 
| 16499 | 
            -
            const STYLES$3 = ({ textColor = '# | 
| 16501 | 
            +
            const STYLES$3 = ({ textColor = '#ffffff', ctaTextColor = textColor, ctaBorderColor = ctaTextColor, primaryImage, mobilePrimaryImage = primaryImage, }) => `
         | 
| 16500 16502 | 
             
              <style>
         | 
| 16501 16503 | 
             
                :host {
         | 
| 16502 16504 | 
             
                  min-width: 320px;
         | 
| @@ -16617,7 +16619,7 @@ function rbLargeCategoryImageToutTemplate(spot) { | |
| 16617 16619 | 
             
              `;
         | 
| 16618 16620 | 
             
            }
         | 
| 16619 16621 |  | 
| 16620 | 
            -
            const STYLES$2 = ({ textColor = '# | 
| 16622 | 
            +
            const STYLES$2 = ({ textColor = '#ffffff', primaryImage, mobilePrimaryImage = primaryImage, }) => `
         | 
| 16621 16623 | 
             
              <style>
         | 
| 16622 16624 | 
             
                :host {
         | 
| 16623 16625 | 
             
                  min-width: 320px;
         | 
| @@ -16686,7 +16688,7 @@ function rbNavigationBannerTemplate(spot) { | |
| 16686 16688 | 
             
              `;
         | 
| 16687 16689 | 
             
            }
         | 
| 16688 16690 |  | 
| 16689 | 
            -
            const STYLES$1 = ({ textColor = '# | 
| 16691 | 
            +
            const STYLES$1 = ({ textColor = '#ffffff', primaryImage, mobilePrimaryImage = primaryImage, }) => `
         | 
| 16690 16692 | 
             
              <style>
         | 
| 16691 16693 | 
             
                :host {
         | 
| 16692 16694 | 
             
                  min-width: 165px;
         | 
| @@ -16739,7 +16741,7 @@ function rbSmallCategoryImageToutTemplate(spot) { | |
| 16739 16741 | 
             
              `;
         | 
| 16740 16742 | 
             
            }
         | 
| 16741 16743 |  | 
| 16742 | 
            -
            const STYLES = ({ textColor = '# | 
| 16744 | 
            +
            const STYLES = ({ textColor = '#000000', backgroundColor = 'transparent', primaryImage, mobilePrimaryImage = primaryImage, }) => `
         | 
| 16743 16745 | 
             
              <style>
         | 
| 16744 16746 | 
             
                :host {
         | 
| 16745 16747 | 
             
                  min-width: 165px;
         | 
| @@ -16889,16 +16891,20 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined | |
| 16889 16891 | 
             
                class CustomSpotElement extends HTMLElement {
         | 
| 16890 16892 | 
             
                    constructor() {
         | 
| 16891 16893 | 
             
                        super();
         | 
| 16894 | 
            +
                        this.hasCustomContent = false;
         | 
| 16895 | 
            +
                        this.handleClick = this.handleClick.bind(this);
         | 
| 16892 16896 | 
             
                        this.attachShadow({ mode: 'open' });
         | 
| 16893 16897 | 
             
                    }
         | 
| 16894 16898 | 
             
                    connectedCallback() {
         | 
| 16895 | 
            -
                        this. | 
| 16899 | 
            +
                        this.hasCustomContent = Boolean(this.customContent);
         | 
| 16900 | 
            +
                        this.addEventListener('click', this.handleClick);
         | 
| 16896 16901 | 
             
                        this.setupIntersectionObserver();
         | 
| 16897 16902 | 
             
                        this.render();
         | 
| 16898 16903 | 
             
                    }
         | 
| 16899 16904 | 
             
                    disconnectedCallback() {
         | 
| 16900 16905 | 
             
                        var _a;
         | 
| 16901 16906 | 
             
                        (_a = this.observer) === null || _a === void 0 ? void 0 : _a.disconnect();
         | 
| 16907 | 
            +
                        this.removeEventListener('click', this.handleClick);
         | 
| 16902 16908 | 
             
                    }
         | 
| 16903 16909 | 
             
                    attributeChangedCallback(_name, oldValue, newValue) {
         | 
| 16904 16910 | 
             
                        if (oldValue !== newValue) {
         | 
| @@ -16908,14 +16914,26 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined | |
| 16908 16914 | 
             
                    render() {
         | 
| 16909 16915 | 
             
                        if (!this.shadowRoot || !this.data)
         | 
| 16910 16916 | 
             
                            return;
         | 
| 16911 | 
            -
                        const { style, wrapper } = SPOT_ELEMENT_SHADOW_ROOT(this.data.width, this.data.height,  | 
| 16912 | 
            -
                         | 
| 16913 | 
            -
             | 
| 16917 | 
            +
                        const { style, wrapper, slot } = SPOT_ELEMENT_SHADOW_ROOT(this.data.width, this.data.height, this.hasCustomContent);
         | 
| 16918 | 
            +
                        this.shadowRoot.replaceChildren(style, slot);
         | 
| 16919 | 
            +
                        if (this.hasCustomContent) {
         | 
| 16920 | 
            +
                            this.setCustomContent();
         | 
| 16914 16921 | 
             
                        }
         | 
| 16915 | 
            -
                         | 
| 16922 | 
            +
                        if (!this.hasCustomContent) {
         | 
| 16916 16923 | 
             
                            wrapper.innerHTML = GET_SPOT_TEMPLATE_HTML_STRING(this.data);
         | 
| 16924 | 
            +
                            this.shadowRoot.appendChild(wrapper);
         | 
| 16917 16925 | 
             
                        }
         | 
| 16918 | 
            -
             | 
| 16926 | 
            +
                    }
         | 
| 16927 | 
            +
                    setCustomContent() {
         | 
| 16928 | 
            +
                        const wrapper = document.createElement('div');
         | 
| 16929 | 
            +
                        wrapper.setAttribute('slot', SPOT_ELEMENT_SLOT_NAME);
         | 
| 16930 | 
            +
                        if (typeof this.customContent === 'string') {
         | 
| 16931 | 
            +
                            wrapper.innerHTML = this.customContent;
         | 
| 16932 | 
            +
                        }
         | 
| 16933 | 
            +
                        if (this.customContent instanceof HTMLElement) {
         | 
| 16934 | 
            +
                            wrapper.appendChild(this.customContent);
         | 
| 16935 | 
            +
                        }
         | 
| 16936 | 
            +
                        this.appendChild(wrapper);
         | 
| 16919 16937 | 
             
                    }
         | 
| 16920 16938 | 
             
                    setupIntersectionObserver() {
         | 
| 16921 16939 | 
             
                        const options = {
         | 
| @@ -16932,21 +16950,21 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined | |
| 16932 16950 | 
             
                        }, options);
         | 
| 16933 16951 | 
             
                        this.observer.observe(this);
         | 
| 16934 16952 | 
             
                    }
         | 
| 16953 | 
            +
                    handleClick() {
         | 
| 16954 | 
            +
                        this.registerEvent(exports.RMN_SPOT_EVENT.CLICK);
         | 
| 16955 | 
            +
                    }
         | 
| 16935 16956 | 
             
                    async registerEvent(event) {
         | 
| 16936 16957 | 
             
                        var _a, _b;
         | 
| 16937 16958 | 
             
                        if (!this.data)
         | 
| 16938 16959 | 
             
                            return;
         | 
| 16939 16960 | 
             
                        const shouldRedirectOnClick = this.getAttribute(ENUM_SPOT_ELEMENT_ATTRIBUTE.REDIRECT_ON_CLICK) === 'true';
         | 
| 16940 | 
            -
                        const  | 
| 16961 | 
            +
                        const eventUrl = (_b = (_a = this.data.events.find((e) => e.event === event)) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : '';
         | 
| 16941 16962 | 
             
                        try {
         | 
| 16942 16963 | 
             
                            const options = {
         | 
| 16943 16964 | 
             
                                method: 'POST',
         | 
| 16944 | 
            -
                                redirect: 'manual',
         | 
| 16965 | 
            +
                                redirect: event === exports.RMN_SPOT_EVENT.CLICK && shouldRedirectOnClick ? 'follow' : 'manual',
         | 
| 16945 16966 | 
             
                            };
         | 
| 16946 | 
            -
                             | 
| 16947 | 
            -
                                options.redirect = 'follow';
         | 
| 16948 | 
            -
                            }
         | 
| 16949 | 
            -
                            const normalizedUrl = this.normalizeUrl(url);
         | 
| 16967 | 
            +
                            const normalizedUrl = this.normalizeUrl(eventUrl);
         | 
| 16950 16968 | 
             
                            const response = await fetch(normalizedUrl, options);
         | 
| 16951 16969 | 
             
                            if (response.ok && event === exports.RMN_SPOT_EVENT.CLICK && shouldRedirectOnClick) {
         | 
| 16952 16970 | 
             
                                window.location.href = this.getRedirectUrlFromPayload(normalizedUrl);
         | 
| @@ -16963,16 +16981,13 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined | |
| 16963 16981 | 
             
                        return url.replace(/https?:\/\/[^/]+\/[^?]+/, `${rmnUrl}`);
         | 
| 16964 16982 | 
             
                    }
         | 
| 16965 16983 | 
             
                    getRedirectUrlFromPayload(url) {
         | 
| 16966 | 
            -
                        var _a;
         | 
| 16984 | 
            +
                        var _a, _b;
         | 
| 16967 16985 | 
             
                        const base64String = (_a = new URL(url).searchParams.get('e')) !== null && _a !== void 0 ? _a : '';
         | 
| 16968 16986 | 
             
                        try {
         | 
| 16969 | 
            -
                            const  | 
| 16970 | 
            -
                             | 
| 16971 | 
            -
                                return obj.ur;
         | 
| 16972 | 
            -
                            }
         | 
| 16973 | 
            -
                            return '';
         | 
| 16987 | 
            +
                            const data = JSON.parse(atob(base64String));
         | 
| 16988 | 
            +
                            return (_b = data.ur) !== null && _b !== void 0 ? _b : '';
         | 
| 16974 16989 | 
             
                        }
         | 
| 16975 | 
            -
                        catch ( | 
| 16990 | 
            +
                        catch (_c) {
         | 
| 16976 16991 | 
             
                            return '';
         | 
| 16977 16992 | 
             
                        }
         | 
| 16978 16993 | 
             
                    }
         | 
| @@ -16993,7 +17008,7 @@ class SpotHtmlService { | |
| 16993 17008 | 
             
                 * @param {ISpot} spot - The spot data.
         | 
| 16994 17009 | 
             
                 * @param {ICreateSpotElementConfig} config - The configuration object.
         | 
| 16995 17010 | 
             
                 * @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
         | 
| 16996 | 
            -
                 * @param {ICreateSpotElementConfig. | 
| 17011 | 
            +
                 * @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
         | 
| 16997 17012 | 
             
                 * @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
         | 
| 16998 17013 | 
             
                 *
         | 
| 16999 17014 | 
             
                 * @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
         | 
| @@ -17012,8 +17027,9 @@ class SpotHtmlService { | |
| 17012 17027 | 
             
                    element.setAttribute(ENUM_SPOT_ELEMENT_ATTRIBUTE.REDIRECT_ON_CLICK, shouldRedirectOnClick.toString());
         | 
| 17013 17028 | 
             
                    // Share the spot data with the element
         | 
| 17014 17029 | 
             
                    element.data = spot;
         | 
| 17015 | 
            -
                     | 
| 17016 | 
            -
             | 
| 17030 | 
            +
                    // Set custom content
         | 
| 17031 | 
            +
                    if (config === null || config === void 0 ? void 0 : config.customContent) {
         | 
| 17032 | 
            +
                        element.customContent = config.customContent;
         | 
| 17017 17033 | 
             
                    }
         | 
| 17018 17034 | 
             
                    return element;
         | 
| 17019 17035 | 
             
                }
         | 
| @@ -17097,7 +17113,7 @@ class LiquidCommerceRmnClient { | |
| 17097 17113 | 
             
                 * @param {ISpot} spot - The spot data.
         | 
| 17098 17114 | 
             
                 * @param {ICreateSpotElementConfig} config - The configuration object.
         | 
| 17099 17115 | 
             
                 * @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
         | 
| 17100 | 
            -
                 * @param {ICreateSpotElementConfig. | 
| 17116 | 
            +
                 * @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
         | 
| 17101 17117 | 
             
                 * @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
         | 
| 17102 17118 | 
             
                 *
         | 
| 17103 17119 | 
             
                 * @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
         | 
| @@ -17129,7 +17145,7 @@ async function RmnClient(apiKey, config) { | |
| 17129 17145 | 
             
             * @param {ISpot} spot - The spot data.
         | 
| 17130 17146 | 
             
             * @param {ICreateSpotElementConfig} config - The configuration object.
         | 
| 17131 17147 | 
             
             * @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
         | 
| 17132 | 
            -
             * @param {ICreateSpotElementConfig. | 
| 17148 | 
            +
             * @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
         | 
| 17133 17149 | 
             
             * @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
         | 
| 17134 17150 | 
             
             *
         | 
| 17135 17151 | 
             
             * @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
         | 
    
        package/dist/index.esm.js
    CHANGED
    
    | @@ -15150,43 +15150,45 @@ class AuthService extends BaseApi { | |
| 15150 15150 | 
             
            }
         | 
| 15151 15151 |  | 
| 15152 15152 | 
             
            const SPOT_ELEMENT_TAG = 'spot-element';
         | 
| 15153 | 
            +
            const SPOT_ELEMENT_SLOT_NAME = `${SPOT_ELEMENT_TAG}-custom-content`;
         | 
| 15153 15154 | 
             
            const SPOTS_SELECTION_API_PATH = '/spots/selection';
         | 
| 15154 15155 | 
             
            const SPOT_EVENT_API_PATH = '/spots/event';
         | 
| 15155 15156 |  | 
| 15156 | 
            -
            const SPOT_ELEMENT_SHADOW_ROOT = (width, height,  | 
| 15157 | 
            +
            const SPOT_ELEMENT_SHADOW_ROOT = (width, height, hasCustomContent) => {
         | 
| 15157 15158 | 
             
                const style = document.createElement('style');
         | 
| 15159 | 
            +
                style.textContent = `
         | 
| 15160 | 
            +
                :host {
         | 
| 15161 | 
            +
                  display: block;
         | 
| 15162 | 
            +
                  position: relative;
         | 
| 15163 | 
            +
                  container-type: inline-size;
         | 
| 15164 | 
            +
                  overflow: hidden;
         | 
| 15165 | 
            +
                }
         | 
| 15166 | 
            +
                :host([fluid="true"]) {
         | 
| 15167 | 
            +
                  width: 100%;
         | 
| 15168 | 
            +
                  height: 100%;
         | 
| 15169 | 
            +
                }
         | 
| 15170 | 
            +
                :host([fluid="false"]) {
         | 
| 15171 | 
            +
                  width: ${width}px;
         | 
| 15172 | 
            +
                  height: ${height}px;
         | 
| 15173 | 
            +
                }
         | 
| 15174 | 
            +
              `;
         | 
| 15158 15175 | 
             
                const wrapper = document.createElement('div');
         | 
| 15159 15176 | 
             
                wrapper.className = 'wrapper';
         | 
| 15160 | 
            -
                 | 
| 15161 | 
            -
             | 
| 15162 | 
            -
             | 
| 15163 | 
            -
             | 
| 15164 | 
            -
             | 
| 15165 | 
            -
             | 
| 15166 | 
            -
                     | 
| 15167 | 
            -
                    : | 
| 15168 | 
            -
             | 
| 15169 | 
            -
             | 
| 15170 | 
            -
                     | 
| 15171 | 
            -
             | 
| 15172 | 
            -
                        width: ${width}px;
         | 
| 15173 | 
            -
                        height: ${height}px;
         | 
| 15174 | 
            -
                    }
         | 
| 15177 | 
            +
                const slot = document.createElement('slot');
         | 
| 15178 | 
            +
                slot.name = SPOT_ELEMENT_SLOT_NAME;
         | 
| 15179 | 
            +
                if (!hasCustomContent) {
         | 
| 15180 | 
            +
                    style.textContent += `
         | 
| 15181 | 
            +
                  :host .wrapper {
         | 
| 15182 | 
            +
                    position: absolute;
         | 
| 15183 | 
            +
                    top: 0;
         | 
| 15184 | 
            +
                    left: 0;
         | 
| 15185 | 
            +
                    width: 100%;
         | 
| 15186 | 
            +
                    height: 100%;
         | 
| 15187 | 
            +
                    overflow: hidden;
         | 
| 15188 | 
            +
                  }
         | 
| 15175 15189 | 
             
                `;
         | 
| 15176 | 
            -
                if (hasCustomHtmlElement) {
         | 
| 15177 | 
            -
                    return { style, wrapper };
         | 
| 15178 15190 | 
             
                }
         | 
| 15179 | 
            -
                style | 
| 15180 | 
            -
                    .wrapper {
         | 
| 15181 | 
            -
                        position: absolute;
         | 
| 15182 | 
            -
                        top: 0;
         | 
| 15183 | 
            -
                        left: 0;
         | 
| 15184 | 
            -
                        width: 100%;
         | 
| 15185 | 
            -
                        height: 100%;
         | 
| 15186 | 
            -
                        overflow: hidden;
         | 
| 15187 | 
            -
                    }
         | 
| 15188 | 
            -
                `;
         | 
| 15189 | 
            -
                return { style, wrapper };
         | 
| 15191 | 
            +
                return { style, wrapper, slot };
         | 
| 15190 15192 | 
             
            };
         | 
| 15191 15193 |  | 
| 15192 15194 | 
             
            const GFONT_PRECONNECT = () => `
         | 
| @@ -16051,7 +16053,7 @@ function rbCollectionBannerWithoutTextBlockTemplate(spot) { | |
| 16051 16053 | 
             
              `;
         | 
| 16052 16054 | 
             
            }
         | 
| 16053 16055 |  | 
| 16054 | 
            -
            const STYLES$6 = ({ textColor = '# | 
| 16056 | 
            +
            const STYLES$6 = ({ textColor = '#ffffff', ctaTextColor = textColor, ctaBorderColor = ctaTextColor, primaryImage, mobilePrimaryImage = primaryImage, }) => `
         | 
| 16055 16057 | 
             
                <style>
         | 
| 16056 16058 | 
             
                    :host {
         | 
| 16057 16059 | 
             
                        min-width: 320px;
         | 
| @@ -16494,7 +16496,7 @@ function rbHomepageHeroTwoTileTemplate(spot) { | |
| 16494 16496 | 
             
              `;
         | 
| 16495 16497 | 
             
            }
         | 
| 16496 16498 |  | 
| 16497 | 
            -
            const STYLES$3 = ({ textColor = '# | 
| 16499 | 
            +
            const STYLES$3 = ({ textColor = '#ffffff', ctaTextColor = textColor, ctaBorderColor = ctaTextColor, primaryImage, mobilePrimaryImage = primaryImage, }) => `
         | 
| 16498 16500 | 
             
              <style>
         | 
| 16499 16501 | 
             
                :host {
         | 
| 16500 16502 | 
             
                  min-width: 320px;
         | 
| @@ -16615,7 +16617,7 @@ function rbLargeCategoryImageToutTemplate(spot) { | |
| 16615 16617 | 
             
              `;
         | 
| 16616 16618 | 
             
            }
         | 
| 16617 16619 |  | 
| 16618 | 
            -
            const STYLES$2 = ({ textColor = '# | 
| 16620 | 
            +
            const STYLES$2 = ({ textColor = '#ffffff', primaryImage, mobilePrimaryImage = primaryImage, }) => `
         | 
| 16619 16621 | 
             
              <style>
         | 
| 16620 16622 | 
             
                :host {
         | 
| 16621 16623 | 
             
                  min-width: 320px;
         | 
| @@ -16684,7 +16686,7 @@ function rbNavigationBannerTemplate(spot) { | |
| 16684 16686 | 
             
              `;
         | 
| 16685 16687 | 
             
            }
         | 
| 16686 16688 |  | 
| 16687 | 
            -
            const STYLES$1 = ({ textColor = '# | 
| 16689 | 
            +
            const STYLES$1 = ({ textColor = '#ffffff', primaryImage, mobilePrimaryImage = primaryImage, }) => `
         | 
| 16688 16690 | 
             
              <style>
         | 
| 16689 16691 | 
             
                :host {
         | 
| 16690 16692 | 
             
                  min-width: 165px;
         | 
| @@ -16737,7 +16739,7 @@ function rbSmallCategoryImageToutTemplate(spot) { | |
| 16737 16739 | 
             
              `;
         | 
| 16738 16740 | 
             
            }
         | 
| 16739 16741 |  | 
| 16740 | 
            -
            const STYLES = ({ textColor = '# | 
| 16742 | 
            +
            const STYLES = ({ textColor = '#000000', backgroundColor = 'transparent', primaryImage, mobilePrimaryImage = primaryImage, }) => `
         | 
| 16741 16743 | 
             
              <style>
         | 
| 16742 16744 | 
             
                :host {
         | 
| 16743 16745 | 
             
                  min-width: 165px;
         | 
| @@ -16887,16 +16889,20 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined | |
| 16887 16889 | 
             
                class CustomSpotElement extends HTMLElement {
         | 
| 16888 16890 | 
             
                    constructor() {
         | 
| 16889 16891 | 
             
                        super();
         | 
| 16892 | 
            +
                        this.hasCustomContent = false;
         | 
| 16893 | 
            +
                        this.handleClick = this.handleClick.bind(this);
         | 
| 16890 16894 | 
             
                        this.attachShadow({ mode: 'open' });
         | 
| 16891 16895 | 
             
                    }
         | 
| 16892 16896 | 
             
                    connectedCallback() {
         | 
| 16893 | 
            -
                        this. | 
| 16897 | 
            +
                        this.hasCustomContent = Boolean(this.customContent);
         | 
| 16898 | 
            +
                        this.addEventListener('click', this.handleClick);
         | 
| 16894 16899 | 
             
                        this.setupIntersectionObserver();
         | 
| 16895 16900 | 
             
                        this.render();
         | 
| 16896 16901 | 
             
                    }
         | 
| 16897 16902 | 
             
                    disconnectedCallback() {
         | 
| 16898 16903 | 
             
                        var _a;
         | 
| 16899 16904 | 
             
                        (_a = this.observer) === null || _a === void 0 ? void 0 : _a.disconnect();
         | 
| 16905 | 
            +
                        this.removeEventListener('click', this.handleClick);
         | 
| 16900 16906 | 
             
                    }
         | 
| 16901 16907 | 
             
                    attributeChangedCallback(_name, oldValue, newValue) {
         | 
| 16902 16908 | 
             
                        if (oldValue !== newValue) {
         | 
| @@ -16906,14 +16912,26 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined | |
| 16906 16912 | 
             
                    render() {
         | 
| 16907 16913 | 
             
                        if (!this.shadowRoot || !this.data)
         | 
| 16908 16914 | 
             
                            return;
         | 
| 16909 | 
            -
                        const { style, wrapper } = SPOT_ELEMENT_SHADOW_ROOT(this.data.width, this.data.height,  | 
| 16910 | 
            -
                         | 
| 16911 | 
            -
             | 
| 16915 | 
            +
                        const { style, wrapper, slot } = SPOT_ELEMENT_SHADOW_ROOT(this.data.width, this.data.height, this.hasCustomContent);
         | 
| 16916 | 
            +
                        this.shadowRoot.replaceChildren(style, slot);
         | 
| 16917 | 
            +
                        if (this.hasCustomContent) {
         | 
| 16918 | 
            +
                            this.setCustomContent();
         | 
| 16912 16919 | 
             
                        }
         | 
| 16913 | 
            -
                         | 
| 16920 | 
            +
                        if (!this.hasCustomContent) {
         | 
| 16914 16921 | 
             
                            wrapper.innerHTML = GET_SPOT_TEMPLATE_HTML_STRING(this.data);
         | 
| 16922 | 
            +
                            this.shadowRoot.appendChild(wrapper);
         | 
| 16915 16923 | 
             
                        }
         | 
| 16916 | 
            -
             | 
| 16924 | 
            +
                    }
         | 
| 16925 | 
            +
                    setCustomContent() {
         | 
| 16926 | 
            +
                        const wrapper = document.createElement('div');
         | 
| 16927 | 
            +
                        wrapper.setAttribute('slot', SPOT_ELEMENT_SLOT_NAME);
         | 
| 16928 | 
            +
                        if (typeof this.customContent === 'string') {
         | 
| 16929 | 
            +
                            wrapper.innerHTML = this.customContent;
         | 
| 16930 | 
            +
                        }
         | 
| 16931 | 
            +
                        if (this.customContent instanceof HTMLElement) {
         | 
| 16932 | 
            +
                            wrapper.appendChild(this.customContent);
         | 
| 16933 | 
            +
                        }
         | 
| 16934 | 
            +
                        this.appendChild(wrapper);
         | 
| 16917 16935 | 
             
                    }
         | 
| 16918 16936 | 
             
                    setupIntersectionObserver() {
         | 
| 16919 16937 | 
             
                        const options = {
         | 
| @@ -16930,21 +16948,21 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined | |
| 16930 16948 | 
             
                        }, options);
         | 
| 16931 16949 | 
             
                        this.observer.observe(this);
         | 
| 16932 16950 | 
             
                    }
         | 
| 16951 | 
            +
                    handleClick() {
         | 
| 16952 | 
            +
                        this.registerEvent(RMN_SPOT_EVENT.CLICK);
         | 
| 16953 | 
            +
                    }
         | 
| 16933 16954 | 
             
                    async registerEvent(event) {
         | 
| 16934 16955 | 
             
                        var _a, _b;
         | 
| 16935 16956 | 
             
                        if (!this.data)
         | 
| 16936 16957 | 
             
                            return;
         | 
| 16937 16958 | 
             
                        const shouldRedirectOnClick = this.getAttribute(ENUM_SPOT_ELEMENT_ATTRIBUTE.REDIRECT_ON_CLICK) === 'true';
         | 
| 16938 | 
            -
                        const  | 
| 16959 | 
            +
                        const eventUrl = (_b = (_a = this.data.events.find((e) => e.event === event)) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : '';
         | 
| 16939 16960 | 
             
                        try {
         | 
| 16940 16961 | 
             
                            const options = {
         | 
| 16941 16962 | 
             
                                method: 'POST',
         | 
| 16942 | 
            -
                                redirect: 'manual',
         | 
| 16963 | 
            +
                                redirect: event === RMN_SPOT_EVENT.CLICK && shouldRedirectOnClick ? 'follow' : 'manual',
         | 
| 16943 16964 | 
             
                            };
         | 
| 16944 | 
            -
                             | 
| 16945 | 
            -
                                options.redirect = 'follow';
         | 
| 16946 | 
            -
                            }
         | 
| 16947 | 
            -
                            const normalizedUrl = this.normalizeUrl(url);
         | 
| 16965 | 
            +
                            const normalizedUrl = this.normalizeUrl(eventUrl);
         | 
| 16948 16966 | 
             
                            const response = await fetch(normalizedUrl, options);
         | 
| 16949 16967 | 
             
                            if (response.ok && event === RMN_SPOT_EVENT.CLICK && shouldRedirectOnClick) {
         | 
| 16950 16968 | 
             
                                window.location.href = this.getRedirectUrlFromPayload(normalizedUrl);
         | 
| @@ -16961,16 +16979,13 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined | |
| 16961 16979 | 
             
                        return url.replace(/https?:\/\/[^/]+\/[^?]+/, `${rmnUrl}`);
         | 
| 16962 16980 | 
             
                    }
         | 
| 16963 16981 | 
             
                    getRedirectUrlFromPayload(url) {
         | 
| 16964 | 
            -
                        var _a;
         | 
| 16982 | 
            +
                        var _a, _b;
         | 
| 16965 16983 | 
             
                        const base64String = (_a = new URL(url).searchParams.get('e')) !== null && _a !== void 0 ? _a : '';
         | 
| 16966 16984 | 
             
                        try {
         | 
| 16967 | 
            -
                            const  | 
| 16968 | 
            -
                             | 
| 16969 | 
            -
                                return obj.ur;
         | 
| 16970 | 
            -
                            }
         | 
| 16971 | 
            -
                            return '';
         | 
| 16985 | 
            +
                            const data = JSON.parse(atob(base64String));
         | 
| 16986 | 
            +
                            return (_b = data.ur) !== null && _b !== void 0 ? _b : '';
         | 
| 16972 16987 | 
             
                        }
         | 
| 16973 | 
            -
                        catch ( | 
| 16988 | 
            +
                        catch (_c) {
         | 
| 16974 16989 | 
             
                            return '';
         | 
| 16975 16990 | 
             
                        }
         | 
| 16976 16991 | 
             
                    }
         | 
| @@ -16991,7 +17006,7 @@ class SpotHtmlService { | |
| 16991 17006 | 
             
                 * @param {ISpot} spot - The spot data.
         | 
| 16992 17007 | 
             
                 * @param {ICreateSpotElementConfig} config - The configuration object.
         | 
| 16993 17008 | 
             
                 * @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
         | 
| 16994 | 
            -
                 * @param {ICreateSpotElementConfig. | 
| 17009 | 
            +
                 * @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
         | 
| 16995 17010 | 
             
                 * @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
         | 
| 16996 17011 | 
             
                 *
         | 
| 16997 17012 | 
             
                 * @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
         | 
| @@ -17010,8 +17025,9 @@ class SpotHtmlService { | |
| 17010 17025 | 
             
                    element.setAttribute(ENUM_SPOT_ELEMENT_ATTRIBUTE.REDIRECT_ON_CLICK, shouldRedirectOnClick.toString());
         | 
| 17011 17026 | 
             
                    // Share the spot data with the element
         | 
| 17012 17027 | 
             
                    element.data = spot;
         | 
| 17013 | 
            -
                     | 
| 17014 | 
            -
             | 
| 17028 | 
            +
                    // Set custom content
         | 
| 17029 | 
            +
                    if (config === null || config === void 0 ? void 0 : config.customContent) {
         | 
| 17030 | 
            +
                        element.customContent = config.customContent;
         | 
| 17015 17031 | 
             
                    }
         | 
| 17016 17032 | 
             
                    return element;
         | 
| 17017 17033 | 
             
                }
         | 
| @@ -17095,7 +17111,7 @@ class LiquidCommerceRmnClient { | |
| 17095 17111 | 
             
                 * @param {ISpot} spot - The spot data.
         | 
| 17096 17112 | 
             
                 * @param {ICreateSpotElementConfig} config - The configuration object.
         | 
| 17097 17113 | 
             
                 * @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
         | 
| 17098 | 
            -
                 * @param {ICreateSpotElementConfig. | 
| 17114 | 
            +
                 * @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
         | 
| 17099 17115 | 
             
                 * @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
         | 
| 17100 17116 | 
             
                 *
         | 
| 17101 17117 | 
             
                 * @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
         | 
| @@ -17127,7 +17143,7 @@ async function RmnClient(apiKey, config) { | |
| 17127 17143 | 
             
             * @param {ISpot} spot - The spot data.
         | 
| 17128 17144 | 
             
             * @param {ICreateSpotElementConfig} config - The configuration object.
         | 
| 17129 17145 | 
             
             * @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
         | 
| 17130 | 
            -
             * @param {ICreateSpotElementConfig. | 
| 17146 | 
            +
             * @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
         | 
| 17131 17147 | 
             
             * @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
         | 
| 17132 17148 | 
             
             *
         | 
| 17133 17149 | 
             
             * @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            import type { ISpot } from 'types';
         | 
| 2 2 | 
             
            export interface ICustomSpotElement extends HTMLElement {
         | 
| 3 3 | 
             
                data?: ISpot;
         | 
| 4 | 
            -
                 | 
| 4 | 
            +
                customContent?: HTMLElement | string;
         | 
| 5 5 | 
             
            }
         | 
| 6 6 | 
             
            declare let SpotElement: new () => HTMLElement;
         | 
| 7 7 | 
             
            export { SpotElement };
         | 
| @@ -1,4 +1,5 @@ | |
| 1 | 
            -
            export declare const SPOT_ELEMENT_SHADOW_ROOT: (width: number, height: number,  | 
| 1 | 
            +
            export declare const SPOT_ELEMENT_SHADOW_ROOT: (width: number, height: number, hasCustomContent: boolean) => {
         | 
| 2 2 | 
             
                style: HTMLStyleElement;
         | 
| 3 3 | 
             
                wrapper: HTMLDivElement;
         | 
| 4 | 
            +
                slot: HTMLSlotElement;
         | 
| 4 5 | 
             
            };
         | 
| @@ -9,7 +9,7 @@ export declare class SpotHtmlService implements ISpotHtmlService { | |
| 9 9 | 
             
                 * @param {ISpot} spot - The spot data.
         | 
| 10 10 | 
             
                 * @param {ICreateSpotElementConfig} config - The configuration object.
         | 
| 11 11 | 
             
                 * @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
         | 
| 12 | 
            -
                 * @param {ICreateSpotElementConfig. | 
| 12 | 
            +
                 * @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
         | 
| 13 13 | 
             
                 * @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
         | 
| 14 14 | 
             
                 *
         | 
| 15 15 | 
             
                 * @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
         | 
| @@ -2,6 +2,7 @@ import type { RMN_ENV } from './../../enums'; | |
| 2 2 | 
             
            import type { RMN_SPOT_EVENT, RMN_SPOT_TYPE } from './spot.enum';
         | 
| 3 3 | 
             
            import type { RmnFilterType, RmnSpotType, SpotIdentifierType, SpotVariantType } from './spot.type';
         | 
| 4 4 | 
             
            export interface ISpotSelectionParams {
         | 
| 5 | 
            +
                url?: string;
         | 
| 5 6 | 
             
                spots: RmnSpotType[];
         | 
| 6 7 | 
             
                filter?: Partial<RmnFilterType>;
         | 
| 7 8 | 
             
            }
         | 
| @@ -32,7 +33,7 @@ export interface ISpot { | |
| 32 33 | 
             
            }
         | 
| 33 34 | 
             
            export interface ICreateSpotElementConfig {
         | 
| 34 35 | 
             
                fluid?: boolean;
         | 
| 35 | 
            -
                 | 
| 36 | 
            +
                customContent?: HTMLElement | string;
         | 
| 36 37 | 
             
                redirectOnClick?: boolean;
         | 
| 37 38 | 
             
            }
         | 
| 38 39 | 
             
            export type ISpots = Record<SpotIdentifierType, ISpot[]>;
         | 
| @@ -23,7 +23,7 @@ export declare class LiquidCommerceRmnClient implements IRmnClient { | |
| 23 23 | 
             
                 * @param {ISpot} spot - The spot data.
         | 
| 24 24 | 
             
                 * @param {ICreateSpotElementConfig} config - The configuration object.
         | 
| 25 25 | 
             
                 * @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
         | 
| 26 | 
            -
                 * @param {ICreateSpotElementConfig. | 
| 26 | 
            +
                 * @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
         | 
| 27 27 | 
             
                 * @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
         | 
| 28 28 | 
             
                 *
         | 
| 29 29 | 
             
                 * @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
         | 
| @@ -49,7 +49,7 @@ declare function RmnClient(apiKey: string, config: IRmnConfig): Promise<IRmnClie | |
| 49 49 | 
             
             * @param {ISpot} spot - The spot data.
         | 
| 50 50 | 
             
             * @param {ICreateSpotElementConfig} config - The configuration object.
         | 
| 51 51 | 
             
             * @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
         | 
| 52 | 
            -
             * @param {ICreateSpotElementConfig. | 
| 52 | 
            +
             * @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
         | 
| 53 53 | 
             
             * @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
         | 
| 54 54 | 
             
             *
         | 
| 55 55 | 
             
             * @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
         | 
    
        package/package.json
    CHANGED
    
    | @@ -2,7 +2,7 @@ | |
| 2 2 | 
             
              "name": "@liquidcommercedev/rmn-sdk",
         | 
| 3 3 | 
             
              "description": "LiquidCommerce RMN SDK",
         | 
| 4 4 | 
             
              "author": "LiquidCommerce Tech",
         | 
| 5 | 
            -
              "version": "1.4. | 
| 5 | 
            +
              "version": "1.4.4-beta.2",
         | 
| 6 6 | 
             
              "homepage": "https://docs.liquidcommerce.co/rmn-sdk",
         | 
| 7 7 | 
             
              "main": "./dist/index.cjs",
         | 
| 8 8 | 
             
              "module": "./dist/index.esm.js",
         |