@letscooee/web-sdk 10.0.1 → 10.0.3

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/main.min.js CHANGED
@@ -7,7 +7,7 @@ var cv=Object.create;var Gl=Object.defineProperty,lv=Object.defineProperties,uv=
7
7
 
8
8
  `+se.message+`
9
9
  `+Array(se.message.length+1).join("=")+`
10
- `+S(A,F)):se}}function Ft(A,R){var W;return R.cache&&R.name&&R.storage.templates.get(R.name)?R.storage.templates.get(R.name):(W=typeof A=="function"?A:tt(A,R),R.cache&&R.name&&R.storage.templates.define(R.name,W),W)}Ne.l.bind(Ne),t.compile=tt,t.compileScope=B,t.compileScopeIntoFunction=j,t.compileToString=S,t.defaultConfig=Ne,t.filters=Re,t.getConfig=Xe,t.helpers=ye,t.nativeHelpers=Fe,t.parse=y,t.render=function(A,R,W,F){var V=Xe(W||{});if(!V.async)return Ft(A,V)(R,V);if(!F){if(typeof n=="function")return new n(function(se,ve){try{se(Ft(A,V)(R,V))}catch(Qe){ve(Qe)}});throw e("Please provide a callback function, this env doesn't support Promises")}try{Ft(A,V)(R,V,F)}catch(se){return F(se)}},t.templates=le,Object.defineProperty(t,"__esModule",{value:!0})})});var Zf="10.0.1";var re=class re{};te(re,"SDK_VERSION",Zf),te(re,"SDK_VERSION_CODE"),te(re,"SDK","WEB"),te(re,"LOG_PREFIX","CooeeSDK"),te(re,"COOEE","cooee"),te(re,"SESSION_STORAGE_SCROLL_ID","sleid"),te(re,"IDLE_TIME_IN_SECONDS",30*60),te(re,"IN_APP_WRAPPER_NAME","cooee-wrapper"),te(re,"IN_APP_CONTAINER_NAME","cooee-container"),te(re,"IN_APP_DEFAULT_PADDING",15),te(re,"EVENT_SCREEN_VIEW","CE Screen View"),te(re,"EVENT_APP_BACKGROUND","CE App Background"),te(re,"EVENT_TRIGGER_DISPLAYED","CE Trigger Displayed"),te(re,"EVENT_CAMPAIGN_HOLDOUT","CE Campaign Holdout"),te(re,"EVENT_CAMPAIGN_REJECTED","CE Campaign Rejected"),te(re,"EVENT_CAMPAIGN_FAILED","CE Campaign Failed"),te(re,"EVENT_TRIGGER_CLOSED","CE Trigger Closed"),te(re,"EVENT_SCROLL","CE Scroll"),te(re,"EVENT_TRIGGER_CLICKED","CE Trigger Clicked"),te(re,"EVENT_FORM_SUBMITTED","CE Form Submitted"),te(re,"EVENT_EXPERIMENT_START","CE Experiment Start"),te(re,"EVENT_VIDEO_DIALOG_CLOSED","CE Video Dialog Closed"),te(re,"EVENT_VIDEO_DIALOG_OPENED","CE Video Dialog Opened"),te(re,"EVENT_VIDEO_CHANGE","CE Video Changed"),te(re,"EVENT_LAST_VIDEO_ENDED","CE Last Video Ended"),te(re,"EVENT_VIDEO_MUTED","CE Video Muted"),te(re,"EVENT_VIDEO_UNMUTED","CE Video Unmuted"),te(re,"EVENT_ADD_TO_CART_CLICKED","CE Add To Cart Clicked"),te(re,"EVENT_VIEW_ITEM_CLICKED","CE View Item Clicked"),te(re,"EVENT_MORE_ITEM_INFO_CLICKED","CE More Item Info Clicked"),te(re,"EVENT_OPEN_CART_CLICKED","CE Open Cart Clicked"),te(re,"EVENT_ADD_TO_CART","Add To Cart"),te(re,"EVENT_REMOVE_FROM_CART","Remove From Cart"),te(re,"EVENT_VIEW_ITEM","View Item"),te(re,"EVENT_VIEW_CART","View Cart"),te(re,"EVENT_OPEN_CART","Open Cart"),te(re,"EVENT_VIEW_COLLECTION","View Collection"),te(re,"EVENT_BUY_NOW_CLICKED","Buy Now Clicked"),te(re,"EVENT_CHECKOUT_STARTED","Checkout Started"),te(re,"EVENT_REVIEW_CLICKED","Review Clicked"),te(re,"EVENT_ITEM_THUMBNAIL_CLICKED","Item Thumbnail Clicked"),te(re,"JS_LOAD_WHITELIST_EVENTS",[re.EVENT_VIEW_ITEM,re.EVENT_VIEW_CART,re.EVENT_VIEW_COLLECTION]),te(re,"HASH_INITIATE_CHECKOUT","initiate-checkout"),te(re,"HASH_OPEN_CART_DRAWER","open-cart-drawer"),te(re,"ADD_BUNDLE_CTA_INBOUND_EVENT","letscooee:inbound:cta:add-bundle"),te(re,"CTA_OPEN_CART_EVENT","letscooee:outbound:open-cart"),te(re,"CTA_AFTER_REFRESH_UI","letscooee:outbound:refresh-ui"),te(re,"POPUP_ACTIVITY_EVENT","letscooee:outbound:popup-activities"),te(re,"THIRD_PARTY_CHECKOUT_EVENT","letscooee:outbound:third-party-initiate-checkout"),te(re,"CAMPAIGN_DISPLAYED_ACTIVITY","DISPLAYED"),te(re,"CAMPAIGN_CLICKED_ACTIVITY","CLICKED"),te(re,"CAMPAIGN_CLOSED_ACTIVITY","CLOSED"),te(re,"BLACKLISTED_PAGE_NAMES",["collection","product","cart"]),te(re,"PLACEHOLDER_IMAGE","https://cdn.global.letscooee.com/images/placeholders/product.png"),te(re,"SHADOW_SPLITTER",":shadow"),te(re,"CAMPAIGN_ATTRIBUTE","_letscooee_campaign"),te(re,"CONTENT_ATTRIBUTE","_letscooee_content"),te(re,"VIA","_via"),te(re,"PAYMENT_MODAL_DETAILS",[{identifier:"#flo-checkout-wrapper",gateway:"Shopflow"},{identifier:"#fastrr-main-container",gateway:"Shiprocket"},{identifier:"#gokwik-modal-wrapper",gateway:"Gokwik"},{identifier:"#zecpe",gateway:"Ecom 360"}]),(()=>{let e=re.SDK_VERSION.split(".").map(r=>r.padStart(2,"0")).join("");re.SDK_VERSION_CODE=parseInt(e,10)})();var P=re;var Ht={apiURL:"https://api.sdk.letscooee.com",debug:!1,mode:"production",styleURL:`https://cdn.jsdelivr.net/npm/@letscooee/web-sdk@${P.SDK_VERSION}/dist/widget.min.css`,widgetURL:`https://cdn.jsdelivr.net/npm/@letscooee/web-sdk@${P.SDK_VERSION}/dist/widget.min.js`};var qt=Cr(Si());var b=class{static debuggerEl;static infoLogs=[];static log(...e){qt.default.info(...e)}static verbose(...e){qt.default.debug(...e)}static error(...e){qt.default.error(...e)}static warn(...e){qt.default.warn(...e)}static info(...e){qt.default.info(...e),this.infoLogs.unshift({time:new Date,message:e.join(" ")}),this.addToDebugger()}static trace(...e){qt.default.trace(...e)}static addToDebugger(){sessionStorage.cooeeDebug&&(this.debuggerEl=this.debuggerEl??document.querySelector("cooee-debugger"),this.debuggerEl&&this.debuggerEl&&(this.debuggerEl.logs=[...this.infoLogs]))}};function tm(t=P.LOG_PREFIX){qt.default.useDefaults({formatter:function(r){r.unshift(`${t} (v${P.SDK_VERSION}):`)}});let e=ql();(e==="1"||e==="on")&&(localStorage.cooeeLogLevel="TRACE"),localStorage.cooeeLogLevel?qt.default.setLevel(qt.default[localStorage.cooeeLogLevel]):qt.default.setLevel(Ht.debug?qt.default.TRACE:qt.default.OFF)}function ql(){return new URL(location.href).searchParams?.get("cooee-debug")}function rm(){let t=`
10
+ `+S(A,F)):se}}function Ft(A,R){var W;return R.cache&&R.name&&R.storage.templates.get(R.name)?R.storage.templates.get(R.name):(W=typeof A=="function"?A:tt(A,R),R.cache&&R.name&&R.storage.templates.define(R.name,W),W)}Ne.l.bind(Ne),t.compile=tt,t.compileScope=B,t.compileScopeIntoFunction=j,t.compileToString=S,t.defaultConfig=Ne,t.filters=Re,t.getConfig=Xe,t.helpers=ye,t.nativeHelpers=Fe,t.parse=y,t.render=function(A,R,W,F){var V=Xe(W||{});if(!V.async)return Ft(A,V)(R,V);if(!F){if(typeof n=="function")return new n(function(se,ve){try{se(Ft(A,V)(R,V))}catch(Qe){ve(Qe)}});throw e("Please provide a callback function, this env doesn't support Promises")}try{Ft(A,V)(R,V,F)}catch(se){return F(se)}},t.templates=le,Object.defineProperty(t,"__esModule",{value:!0})})});var Zf="10.0.3";var re=class re{};te(re,"SDK_VERSION",Zf),te(re,"SDK_VERSION_CODE"),te(re,"SDK","WEB"),te(re,"LOG_PREFIX","CooeeSDK"),te(re,"COOEE","cooee"),te(re,"SESSION_STORAGE_SCROLL_ID","sleid"),te(re,"IDLE_TIME_IN_SECONDS",30*60),te(re,"IN_APP_WRAPPER_NAME","cooee-wrapper"),te(re,"IN_APP_CONTAINER_NAME","cooee-container"),te(re,"IN_APP_DEFAULT_PADDING",15),te(re,"EVENT_SCREEN_VIEW","CE Screen View"),te(re,"EVENT_APP_BACKGROUND","CE App Background"),te(re,"EVENT_TRIGGER_DISPLAYED","CE Trigger Displayed"),te(re,"EVENT_CAMPAIGN_HOLDOUT","CE Campaign Holdout"),te(re,"EVENT_CAMPAIGN_REJECTED","CE Campaign Rejected"),te(re,"EVENT_CAMPAIGN_FAILED","CE Campaign Failed"),te(re,"EVENT_TRIGGER_CLOSED","CE Trigger Closed"),te(re,"EVENT_SCROLL","CE Scroll"),te(re,"EVENT_TRIGGER_CLICKED","CE Trigger Clicked"),te(re,"EVENT_FORM_SUBMITTED","CE Form Submitted"),te(re,"EVENT_EXPERIMENT_START","CE Experiment Start"),te(re,"EVENT_VIDEO_DIALOG_CLOSED","CE Video Dialog Closed"),te(re,"EVENT_VIDEO_DIALOG_OPENED","CE Video Dialog Opened"),te(re,"EVENT_VIDEO_CHANGE","CE Video Changed"),te(re,"EVENT_LAST_VIDEO_ENDED","CE Last Video Ended"),te(re,"EVENT_VIDEO_MUTED","CE Video Muted"),te(re,"EVENT_VIDEO_UNMUTED","CE Video Unmuted"),te(re,"EVENT_ADD_TO_CART_CLICKED","CE Add To Cart Clicked"),te(re,"EVENT_VIEW_ITEM_CLICKED","CE View Item Clicked"),te(re,"EVENT_MORE_ITEM_INFO_CLICKED","CE More Item Info Clicked"),te(re,"EVENT_OPEN_CART_CLICKED","CE Open Cart Clicked"),te(re,"EVENT_ADD_TO_CART","Add To Cart"),te(re,"EVENT_REMOVE_FROM_CART","Remove From Cart"),te(re,"EVENT_VIEW_ITEM","View Item"),te(re,"EVENT_VIEW_CART","View Cart"),te(re,"EVENT_OPEN_CART","Open Cart"),te(re,"EVENT_VIEW_COLLECTION","View Collection"),te(re,"EVENT_BUY_NOW_CLICKED","Buy Now Clicked"),te(re,"EVENT_CHECKOUT_STARTED","Checkout Started"),te(re,"EVENT_REVIEW_CLICKED","Review Clicked"),te(re,"EVENT_ITEM_THUMBNAIL_CLICKED","Item Thumbnail Clicked"),te(re,"JS_LOAD_WHITELIST_EVENTS",[re.EVENT_VIEW_ITEM,re.EVENT_VIEW_CART,re.EVENT_VIEW_COLLECTION]),te(re,"HASH_INITIATE_CHECKOUT","initiate-checkout"),te(re,"HASH_OPEN_CART_DRAWER","open-cart-drawer"),te(re,"ADD_BUNDLE_CTA_INBOUND_EVENT","letscooee:inbound:cta:add-bundle"),te(re,"CTA_OPEN_CART_EVENT","letscooee:outbound:open-cart"),te(re,"CTA_AFTER_REFRESH_UI","letscooee:outbound:refresh-ui"),te(re,"POPUP_ACTIVITY_EVENT","letscooee:outbound:popup-activities"),te(re,"THIRD_PARTY_CHECKOUT_EVENT","letscooee:outbound:third-party-initiate-checkout"),te(re,"CAMPAIGN_DISPLAYED_ACTIVITY","DISPLAYED"),te(re,"CAMPAIGN_CLICKED_ACTIVITY","CLICKED"),te(re,"CAMPAIGN_CLOSED_ACTIVITY","CLOSED"),te(re,"BLACKLISTED_PAGE_NAMES",["collection","product","cart"]),te(re,"PLACEHOLDER_IMAGE","https://cdn.global.letscooee.com/images/placeholders/product.png"),te(re,"SHADOW_SPLITTER",":shadow"),te(re,"CAMPAIGN_ATTRIBUTE","_letscooee_campaign"),te(re,"CONTENT_ATTRIBUTE","_letscooee_content"),te(re,"VIA","_via"),te(re,"PAYMENT_MODAL_DETAILS",[{identifier:"#flo-checkout-wrapper",gateway:"Shopflow"},{identifier:"#fastrr-main-container",gateway:"Shiprocket"},{identifier:"#gokwik-modal-wrapper",gateway:"Gokwik"},{identifier:"#zecpe",gateway:"Ecom 360"}]),(()=>{let e=re.SDK_VERSION.split(".").map(r=>r.padStart(2,"0")).join("");re.SDK_VERSION_CODE=parseInt(e,10)})();var P=re;var Ht={apiURL:"https://api.sdk.letscooee.com",debug:!1,mode:"production",styleURL:`https://cdn.jsdelivr.net/npm/@letscooee/web-sdk@${P.SDK_VERSION}/dist/widget.min.css`,widgetURL:`https://cdn.jsdelivr.net/npm/@letscooee/web-sdk@${P.SDK_VERSION}/dist/widget.min.js`};var qt=Cr(Si());var b=class{static debuggerEl;static infoLogs=[];static log(...e){qt.default.info(...e)}static verbose(...e){qt.default.debug(...e)}static error(...e){qt.default.error(...e)}static warn(...e){qt.default.warn(...e)}static info(...e){qt.default.info(...e),this.infoLogs.unshift({time:new Date,message:e.join(" ")}),this.addToDebugger()}static trace(...e){qt.default.trace(...e)}static addToDebugger(){sessionStorage.cooeeDebug&&(this.debuggerEl=this.debuggerEl??document.querySelector("cooee-debugger"),this.debuggerEl&&this.debuggerEl&&(this.debuggerEl.logs=[...this.infoLogs]))}};function tm(t=P.LOG_PREFIX){qt.default.useDefaults({formatter:function(r){r.unshift(`${t} (v${P.SDK_VERSION}):`)}});let e=ql();(e==="1"||e==="on")&&(localStorage.cooeeLogLevel="TRACE"),localStorage.cooeeLogLevel?qt.default.setLevel(qt.default[localStorage.cooeeLogLevel]):qt.default.setLevel(Ht.debug?qt.default.TRACE:qt.default.OFF)}function ql(){return new URL(location.href).searchParams?.get("cooee-debug")}function rm(){let t=`
11
11
  display: inline-block;
12
12
  font-size: 14px;
13
13
  background: linear-gradient(90deg, #d52dc8 25%, #2179e2 82%);
@@ -72,4 +72,4 @@ mutation cartDiscountCodesUpdate($cartId: ID!, $discountCodes: [String!]) {
72
72
  }
73
73
  }
74
74
  }
75
- `,Un=class{async addToCart(e,r){if(!e.length)return;let i={items:e.map(s=>{let{vID:a,quantity:c}=this.getVIDAndQuantity(s);return{id:a?+a:+s.mID,quantity:c,properties:r.getPrivateAttributesForLineItem()}})},o=nt.get();if(window.cooeeGetCartSections&&typeof window.cooeeGetCartSections=="function")try{i.sections_url=window.location.pathname,i.sections=window.cooeeGetCartSections()}catch(s){Te(s,"execute-cooeeGetCartSections",{engagementTrigger:r})}else o.isMiniCart()?i.sections=["mini-cart"]:o.isShopifyDefaultDrawer()&&(i.sections=o.element.getSectionsToRender?.().map(s=>s.section??s.id));try{let s=await Gi("/cart/add.js",i,"cart-item-add",r);return b.log(`Added ${e.length} items to Cart`),br("Product added to your cart"),s.data}catch(s){let a=["Failed to add product in cart."];if(s instanceof jn&&s.is40x()&&s.responseText){let c=s.responseText;c.description&&a.push(`Reason: ${c.description}`)}a.push("Please try again later."),br(a.join(" "))}}async updateLineItem(e,r){if(!rr.hasKeys(r)){b.warn("No update fields provided");return}let n=_({id:e.key},r);try{let i=await Gi("/cart/change.js",n,"cart-item-update");b.log(`Updated ${e}`),we.getCurrent().update(i.data)}catch{br("Failed to update item in cart")}}async copyDiscountCode(e){if(e)try{await navigator.clipboard.writeText(e),b.log(`Code-${e} copied`),br("Discount code copied")}catch(r){b.error("Failed to copy code",r)}}getProductURL(e){if(!e?.link)return;let r=Wh(e.link);if(r)return Wi("/products/"+r)}async upgradeToSubscription(e,r){if(!e){b.warn("Trying to upgrade to subscription with no item");return}let n=await we.getCurrent().getNormalisedCart(),i=e.selectedOrFirstVariant.value,o=n.items.findIndex(c=>c.vID===i.mID),s=i.selectedSellingPlan.value,a={line:o+1,selling_plan:s?.mID||null,properties:r.getPrivateAttributesForLineItem()};try{let c=await Gi("/cart/change.js",a,"cart-switch-subscription",r);return b.log(`Upgraded ${e} selling plan`),br("Line item updated"),we.getCurrent().update(c.data),c.data}catch{br("Failed to update subscription")}}async createNewCart(e,r,n){if(!e?.vID){b.error("No variant ID found to perform Buy now",e);return}let i=r?[r]:[],o=[{merchandiseId:`gid://shopify/ProductVariant/${e.vID}`,quantity:1,attributes:n.getKVFormatPrivateAttributesForLineItem()}],s=await Xa();return(await pc(RS,{input:{lines:o,discountCodes:i,attributes:s}},"storefront-create-cart")).data.data?.cartCreate?.cart?.checkoutUrl}async process(e){let r=e.clickAction,n=e.items,i=e.triggerData,o;if(r.at){let s=r;if(b.log(`Performing ${JSON.stringify(s)} action`),s.at===101)o=this.getProductURL(n[0]);else if(s.at===102)n?.length&&await this.addToCart(n,i);else if(s.at===103)await this.copyDiscountCode(i.discount?.code);else if(s.at===105)nt.get().open();else if(s.at===104){let a=e.collections;if(!a?.length)return;o=Wi("/collections/"+a[0].handle)}}r.applyDiscount&&i.discount?.code?zr.navigate(i.discount.code,i.redirectBehaviour,o):o&&(location.pathname=o)}getVIDAndQuantity(e){let r,n;if(e instanceof Dt)r=e.vID,n=e.quantity??1;else{if(!e.vars?.length)return{};r=e.selectedOrFirstVariant.value.mID,n=1}return{vID:r,quantity:n}}};var fl=class extends wt{ctaExecutor=new Un;constructor(e){super(e)}async update(e){await super.update(e),this.engagementTrigger.progressBarConfig.update(e.progressBarConfig),await this.checkMilestoneTryCatch(),this.widgetElement.update()}shouldStopRendering(){return!1}renderContainer(){if(this.widgetElement?.isConnected){this.widgetElement.update(),this.addToRendered();return}this.createAngularWidget("cooee-progressbar"),this.checkMilestoneTryCatch()}async checkMilestoneTryCatch(){try{await this.checkMilestone()}catch(e){Te(e,"apply-milestones",{engagementTrigger:this.engagementTrigger})}}async checkMilestone(){let e=await we.getCurrent().getNormalisedCart(),r=this.engagementTrigger.progressBarConfig,n,i=[],o=[],s=[],a,c,p=[...r.milestones];for(let f of p){if(f.rewardType!==Zl.FREE_AUTO_GIFT)continue;if(f.isUIOnly&&!f.allowATC){b.verbose(`Skipping milestone ${f.label} as it is UI only and does not allow ATC`);continue}let E=f.items[0],y=f.reached,S=e.items.find(D=>(D.vID===E.vID||D.mID===E.mID)&&D.properties[P.CAMPAIGN_ATTRIBUTE]===this.engagementTrigger.shortID);y&&(a=f,c=S),S&&i.push(S),!y&&S&&r.removeIneligibleItem?(b.verbose(`Removing free gift ${S.vID} from cart`),s.push(S)):y&&!S&&(b.verbose(`Adding free gift ${E.vID} to cart`),o.push(E))}r.restrictToLatestFreebie&&a&&(c?(i=i.filter(f=>f.vID!==c.vID),o=[]):o=[a.items[0]],s.push(...i)),s.length&&await this.removeFreeGifts(s),o.length&&(n=await this.ctaExecutor.addToCart(o,this.engagementTrigger));let d=r.coupons;if(d?.length)try{await zr.applyWithStorefront(d.map(f=>f.couponCode)),nt.get().refreshUI(n,!1)}catch(f){Te(f,"cart-apply-discount",{extra:{coupons:d},engagementTrigger:this.engagementTrigger})}}async removeFreeGifts(e){await Promise.all(e.map(r=>this.ctaExecutor.updateLineItem(r,{quantity:0})))}};var Gs=class extends wt{constructor(e){super(e)}async update(e){await super.update(e),this.engagementTrigger.content.update(e.content),this.widgetElement.update()}shouldStopRendering(){return!1}renderContainer(){if(this.widgetElement?.isConnected){this.addToRendered();return}this.createAngularWidget("cooee-savings-bar")}};var ml=class extends At{constructor(e){super(e)}shouldStopRendering(){return!1}renderContainer(){if(this.widgetElement?.isConnected){this.addToRendered();return}this.createAngularWidget("cooee-shoppable-videos")}};var dl=class extends At{constructor(e){super(e)}shouldStopRendering(){return!1}renderContainer(){if(this.widgetElement?.isConnected){this.addToRendered();return}this.createAngularWidget("cooee-sticky-atc")}};var hl=class extends At{constructor(e){super(e)}shouldStopRendering(){return!1}renderContainer(){let e=this.getParentElement(`inner-letscooee-${this.engagementTrigger.shortID}`);this.rootContainer.appendChild(e),document.addEventListener(P.ADD_BUNDLE_CTA_INBOUND_EVENT,this.inboundCTAListener.bind(this),!1)}async inboundCTAListener(e){let r=this.engagementTrigger,n=`Engagement(id: ${r.engagementID}, shortID: ${r.shortID})`,i=e.detail;if(!rr.hasKeys(i)){b.error(`No detail received for ${n}`);return}b.log("Detail received for BYOB",i);let o=i.campaignID??i.campaignId??i.campaign_id;if(o!==r.shortID&&o!==r.engagementID){b.warn(`Current ${n} is not BYOB. Received: ${o}`);return}let s=i.items;if(!s?.length)return;let a=s.map(c=>new Dt({mID:c.product_id,vID:c.variant_id,quantity:c.quantity||1}));await new qr(this.triggerContext).execute({embeddedItems:a,clickAction:{at:108,applyDiscount:!0}})}};var Io=class{runtimeData=de.get();processCartWidgetResponse(e){this.runtimeData.isCartDirty=!1,this.runtimeData.cartEngagements=e;let r=[...wt.renderedEngagements];wt.renderedEngagements.clear();for(let n of e){b.info(`${n} received as cart embed`);let i=this.isAlreadyRendered(n,r);if(i>-1){this.rerender(i,n,r);continue}b.verbose(`${n} is new`),n.isProgressBar()?new fl(n).renderSilently():n.isSubscriptionUpsell()?pl.renderCartUpsell(n):n.isSavingsBar()?new Gs(n).renderSilently():new wt(n).renderSilently()}this.removeOldWidgets(r)}processPageWidgetResponse(e){let r=[...At.renderedEngagements];At.renderedEngagements.clear();for(let n of e){b.info(`${n} received as page embed`);let i=this.isAlreadyRendered(n,r);if(i>-1){this.rerender(i,n,r);continue}b.verbose(`${n} is new`),n.isShoppableVideo()?new ml(n).renderSilently():n.isBYOB()?new hl(n).renderSilently():n.isStickyATC()?new dl(n).renderSilently():n.isSavingsBar()?new Gs(n).renderSilently():new At(n).renderSilently()}this.removeOldWidgets(r)}isAlreadyRendered(e,r){let n=r.findIndex(i=>i.isSameTrigger(e));return n<0||e.isSubscriptionUpsell()?-1:n}async rerender(e,r,n){let[i]=n.splice(e,1);if(i)try{await i.updateAndReRender(r)}catch(o){Te(o,"update-and-re-render",{engagementTrigger:r})}}removeOldWidgets(e){for(let r of e)r.destroy()}};wy(document.body,{childList:!0,subtree:!0},500,by).subscribe(()=>{At.renderedEngagements.forEach(e=>e.rerender()),wt.renderedEngagements.forEach(e=>e.rerender())});var kn=class{runtimeData=de.get();backendAPIService=ge.get(Pt);sessionManager=ge.get(Rt);constructor(){}async getAllContext(){let[e,r]=await Promise.all([sl(),this.sessionManager.checkSessionAndGetContext()]);return _(_({},e),r)}};var xr=class t extends kn{static INSTANCE;loadWidgetsSubject=new $t;pageWidgetLoadCount=0;constructor(){super(),this.loadWidgetsSubject.pipe(Sr(300)).subscribe(()=>{this.loadCartWidgets().catch(e=>b.error("Unable to initiate cart widgets",e)),this.loadPageWidgets().catch(e=>b.error("Unable to initiate page widgets",e))}),window.CooeeSDK.cartChanged$.subscribe(()=>this.loadWidgetsSubject.next())}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}loadOrRenderWidgetsAfterCartChange(){this.runtimeData.isCartDirty?this.loadWidgetsSilently():this.renderCachedCartWidgets()}loadPageWidgetsSilently(){pr(Rt.replaySubject).then(()=>{this.loadPageWidgets().catch(e=>b.error("Unable to initiate load page widgets",e))})}loadCartWidgetsSilently(){pr(Rt.replaySubject).then(()=>{this.loadCartWidgets().catch(e=>b.error("Unable to initiate cart widgets",e))})}loadWidgetsSilently(){pr(Rt.replaySubject).then(()=>{this.loadWidgetsSubject.next()})}async loadPageWidgets(){this.pageWidgetLoadCount++,this.pageWidgetLoadCount===1?b.info("Fetch page widgets (after \u23F0",de.get().getJSLoadTimeDiff()+" of DOM load)"):b.info("Fetch page widgets");let e=await this.getAllContext(),r=_({},e);this.backendAPIService.post("/v1/engagement/page-widgets",r).then(n=>{b.info(`Page widgets loaded in \u23F0 ${Jr(n.timeTakenMs)}`);let i=n.data.widgets.map(o=>new Ct(o));new Io().processPageWidgetResponse(i)}).catch(n=>{b.error("Error sending widget getter",n)})}async loadCartWidgets(){b.info("Fetch cart widgets");let e=await this.getAllContext(),r=_({},e);this.backendAPIService.post("/v1/engagement/cart-widgets",r).then(n=>{b.info(`Cart widgets loaded in \u23F0 ${Jr(n.timeTakenMs)}`);let i=n.data.widgets.map(o=>new Ct(o));new Io().processCartWidgetResponse(i)}).catch(n=>{b.error("Error sending widget getter",n)})}async getVariation(e){let r=await this.getAllContext();return Object.assign(e,r),this.backendAPIService.post("/v1/engagement/get-variant",e)}renderCachedCartWidgets(){new Io().processCartWidgetResponse(this.runtimeData.cartEngagements)}};var gl=class t{static INSTANCE;constructor(){this.init()}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}init(){Ls.get(pe.APP_CONFIG,{}).then(e=>this.updateGlobalConfig(e))}async processAppConfigurations(e){b.verbose("Received app configuration",e),e.currencyCount=e.currencies?.length;let r=this.updateGlobalConfig(e);Ls.set(pe.APP_CONFIG,r).catch(n=>b.error(n)),cl.processConfiguration(),r.website&&(bt.injectRawScript(r.website.commonJS),bt.injectRawCSS(r.website.commonCSS)),nt.get().onToggle().subscribe(async({open:n})=>{b.info("Cart drawer is now",n?"open":"closed"),n&&(ge.get(xr).loadOrRenderWidgetsAfterCartChange(),await this.trackViewCartEvent())})}updateGlobalConfig(e){let r=ke.globalRef.config.update(e);return nt.forceUpdate(),b.verbose("App configurations",r),r}async trackViewCartEvent(){let e=await we.getCurrent().getNormalisedCart(),r={value:e.amount,currency:e.currency},n={items:e.items,amount:r,drawer:!0};ge.get(Ue).sendSafe(new Ce(P.EVENT_VIEW_CART,n))}};var gi=class t{static INSTANCE;backendAPIService=Pt.getInstance();coreService=gl.getInstance();sdkToken="";userID="";deviceID="";appID="";shopifyShop="";constructor(){}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}init(e){this.appID=e.appID,this.shopifyShop=e.shopifyShop}async storeAndPopulateAuthData(e){e&&(e.userID&&(this.userID=e.userID,await Be.set(pe.ID,e.userID)),e.deviceID&&(this.deviceID=e.deviceID,await Be.set(pe.DEVICE_ID,e.deviceID)),e.sdkToken&&(this.sdkToken=e.sdkToken,await Be.set(pe.SDK_TOKEN,e.sdkToken)),this.updateAPIClient())}async validateSession(e){await this.populateFirstSeen(),await this.populateUserDataFromStorage(),b.verbose("Validating session with server");let r=await this.getSessionValidateData(e);try{let n=await this.backendAPIService.validateSession(r),i=n.data;b.info(`Auth finished in \u23F0 ${Jr(n.timeTakenMs)}`),b.verbose("Validate session Response",i),await this.coreService.processAppConfigurations(i.appSettings),await this.storeAndPopulateAuthData(i)}catch(n){throw b.error(n),n}}async populateUserDataFromStorage(){if(this.sdkToken=await Be.get(pe.SDK_TOKEN),!this.sdkToken){b.warn("No SDK token found in local storage");return}this.userID=await Be.get(pe.ID),this.deviceID=await Be.get(pe.DEVICE_ID),this.updateAPIClient()}updateAPIClient(){b.verbose("SDK Token:",this.sdkToken),b.info("Device ID:",this.deviceID),this.userID&&b.info("User ID:",this.userID),_o.trackDeviceID(this.deviceID),this.backendAPIService.setAPIToken(this.sdkToken),this.backendAPIService.setDeviceId(this.deviceID),ns("Visitor Info",{device_id:this.deviceID,user_id:this.userID}),th({id:this.deviceID})}async getSessionValidateData(e){let r=await new al().safeGet(),n=await Be.get(pe.DEVICE_ID);n||(n=new yt().toHexString(),await Be.set(pe.DEVICE_ID,n));let i=await sl();return ee(_(_({deviceID:n,deviceProps:r,appID:this.appID,shopifyShop:this.shopifyShop},e),i),{sdk:P.SDK,ad:ol.getAdParams(),occurred:this.getSessionStartTime(de.get().jsLoadTime),properties:{}})}async populateFirstSeen(){let e=await Be.get(pe.FIRST_SEEN),r=e?new Date(e):new Date;e||await Be.set(pe.FIRST_SEEN,r.toISOString()),this.backendAPIService.setFirstSeen(r),ns("Visitor Info",{first_seen:r.toISOString()})}getSessionStartTime(e){return(new Date().getTime()-e.getTime())/1e3>P.IDLE_TIME_IN_SECONDS?new Date:e}};var Rt=class t{static replaySubject=new ys(1);static INSTANCE;constructor(){}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}init(e){if(b.verbose("Initialising SDK",e),gy(navigator.userAgent)){b.info("This seems to be a bot. Disabling SDK");return}gi.getInstance().init(e),t.INSTANCE.checkForNewSessionOnPageLoad().then(async()=>{t.replaySubject.next(!0),t.replaySubject.complete()}).catch(r=>{b.error("Unable to initiate session",r)})}getCurrentSessionID(){return vt.set(pe.SESSION_LAST_USED_TIME,new Date().getTime()),vt.get(pe.ID,"")}async checkForNewSessionOnPageLoad(){await this.checkForNewSessionSafe(!0)}async checkSessionAndGetContext(){return await this.checkForNewSessionSafe(!1),this.getContext()}async getContext(){let[e,r,n]=await Promise.all([this.getCurrentSessionID(),this.getCurrentSessionNumber(),this.getLandingPage()]);return Bi({"cooee_session.number":r}),ns("Visitor Session",{id:e,number:r,landing_page:n}),{sessionID:e,sessionNumber:r,landingPage:n}}async checkForNewSessionSafe(e){await mc.request("validate_session",async()=>{await this.checkForNewSessionUnsafe(e)})}async checkForNewSessionUnsafe(e){let r=!1;if(await this.isNewSessionRequired()?(b.info("New session to be started"),await this.startNewSession(),e=!0,r=!0):await this.notSynced()&&(r=!0),e){let n=await this.getContext();b.info(`Session ID: ${n.sessionID} & number: ${n.sessionNumber}`),await gi.getInstance().validateSession(ee(_({},n),{newSession:r})),await vt.set(pe.SESSION_SYNCED,!0)}}async startNewSession(){b.verbose("Starting new session"),await vt.clear(),b.verbose("Cleared SessionStorage before starting new session");let e=new Date,r=new yt().toHexString();b.verbose("New session ID to be used",r);let n=await Be.get(pe.SESSION_NUMBER,0)+1;await Promise.all([Be.set(pe.SESSION_NUMBER,n),vt.set(pe.ID,r),vt.set(pe.SESSION_LAST_USED_TIME,e.getTime()),vt.set(pe.SESSION_LANDING_PAGE,ea())])}getLandingPage(){return vt.get(pe.SESSION_LANDING_PAGE,{})}getCurrentSessionNumber(){return Be.get(pe.SESSION_NUMBER,1)}async isNewSessionRequired(){if(!await vt.get(pe.ID))return!0;let e=await vt.get(pe.SESSION_LAST_USED_TIME,0);return e?(new Date().getTime()-e)/1e3>P.IDLE_TIME_IN_SECONDS:!0}async notSynced(){return!await vt.get(pe.SESSION_SYNCED,!1)}};var yl=class{loadedFonts=[];async loadAllFonts(e){e.elems?.forEach(r=>{r instanceof Fr&&this.loadFamily(r.typography?.fam)})}async loadFamily(e){if(!e?.fonts||this.loadedFonts.indexOf(e.name)>-1)return;let r=[];e.fonts.forEach(i=>{if(i.url){let o=new FontFace(P.COOEE+e.name,i.getURL(),i.getFontDescriptor());r.push(o.load())}}),this.loadedFonts.push(e.name),(await Promise.all(r)).forEach(i=>{document.fonts.add(i)})}};var vl=class{static updateIdentity(e){if(!this.isInstalled())return;let r={};e.email&&(r.email=e.email),e.mobile&&(r.phone_number=e.mobile),b.verbose("Sending email/mobile to Klaviyo"),window.klaviyo.push(["identify",r])}static isInstalled(){return window.klaviyo&&typeof window.klaviyo=="object"}};var El=class{action;triggerContext;constructor(e,r){this.action=e,this.triggerContext=r}async execute(){let e=this.containsCTA()?P.EVENT_TRIGGER_CLICKED:P.EVENT_TRIGGER_CLOSED;switch(this.action.at!==106&&await this.closeTriggerAndSendEvent(e),this.action.at){case 2:break;case 4:this.gotoURLAction();break;case 5:this.shareAction();break;case 106:await this.collectFormData();break;case void 0:case 105:break;default:b.error("Received an invalid ClickActionType: ",this.action.at);return}}externalAction(){this.action.ext?.u&&window.open(this.action.ext.u,"_blank")?.focus()}gotoURLAction(){if(this.action.gu?.u){let e=this.action.gu.u;Ka(e)||(e=`//${e}`),window.open(e,"_self")}}async closeTriggerAndSendEvent(e,r){this.triggerContext.closeInApp(e,r),await this.dispatchEvent()}shareAction(){if(!this.action.share)return;if(!navigator.share){b.warn("Navigator.share is not compatible with this browser");return}navigator.share({text:this.action.share.text,title:"Share"}).then(r=>console.log(r)).catch(r=>console.error(r))}containsCTA(){return this.action.at&&this.action.at!==1?!0:!(this.isEmpty(this.action.custKV)&&this.isEmpty(this.action.up))}isEmpty(e){return e?Object.keys(e).length===0:!0}async collectFormData(){let e={};for(let r of this.triggerContext.inputs){if(!r.isValid)return;let i=document.getElementById(r.id).value;r.type===51?e.email=i:r.type===52&&(e.mobile=i)}await this.closeTriggerAndSendEvent(P.EVENT_FORM_SUBMITTED,{form:e}),br("Coupon applied on cart"),vl.updateIdentity(e)}async dispatchEvent(){let e=this.triggerContext.triggerData,r={clickAction:this.action,items:this.triggerContext.selectedEmbeddedItems??e.embeddedItems??e.items,collections:e.collections,triggerData:e};await new Un().process(r);let n={action:this.containsCTA()?P.CAMPAIGN_CLICKED_ACTIVITY:P.CAMPAIGN_CLOSED_ACTIVITY};document.dispatchEvent(new CustomEvent(P.POPUP_ACTIVITY_EVENT,{detail:n}))}};var mr=class{renderer=Fn.get();parentHTMLEl;inappElement;inappHTMLEl;triggerContext;stylesConverter;scalingFactor;constructor(e,r,n){this.parentHTMLEl=e,this.inappElement=r,this.triggerContext=n,this.stylesConverter=new wo(this.renderer.getScalingFactor())}getHTMLElement(){return this.inappHTMLEl}insertElement(){this.parentHTMLEl.appendChild(this.inappHTMLEl)}processCommonBlocks(){this.processWidthAndHeight(),this.processPositionBlock(),this.processTransformBlock(),this.processTransparency(),this.processShadow(),this.registerAction();let e=ee(_(_(_(_({},this.getDisplayStyles()),this.getSpaceStyles()),this.getBorderStyles()),this.getBackgroundStyles()),{boxSizing:"border-box",outline:"none"});yi(this.inappHTMLEl,e)}getDisplayStyles(){return{display:"block"}}processWidthAndHeight(){this.inappElement.w&&oe(this.inappHTMLEl,"width",this.stylesConverter.getSizePx(this.inappElement.w)),this.inappElement.h&&oe(this.inappHTMLEl,"height",this.stylesConverter.getSizePx(this.inappElement.h))}processPositionBlock(){let e={position:"absolute",left:this.stylesConverter.getSizePx(this.inappElement.x),top:this.stylesConverter.getSizePx(this.inappElement.y)};yi(this.inappHTMLEl,e)}getBorderStyles(){return this.stylesConverter.getBorderStyles(this.inappElement.br)}getSpaceStyles(){return this.stylesConverter.getSpaceStyles(this.inappElement.spc)}processTransparency(){let e=this.inappElement.alpha;if(!isNaN(e)){let r=(e/100).toFixed(2);oe(this.inappHTMLEl,"opacity",r)}}processShadow(){let e=this.inappElement.shd;e?oe(this.inappHTMLEl,"box-shadow",e.getStyle(this.scalingFactor)):oe(this.inappHTMLEl,"box-shadow","unset")}processTransformBlock(){let e=new $n(this.inappElement.trf);e&&e.rotate&&oe(this.inappHTMLEl,"transform",`rotate(${e.rotate}deg)`)}registerAction(){let e=this.inappElement.clc;!e||Object.keys(e).length===0||(this.inappHTMLEl.addEventListener("click",r=>{r.stopPropagation(),new El(e,this.triggerContext).execute()}),oe(this.inappHTMLEl,"cursor","pointer"))}getBackgroundStyles(){return this.stylesConverter.getBackgroundStyles(this.inappElement.bg)}};var Kr=class extends mr{constructor(e,r,n){super(e,r,n)}processCommonBlocks(){super.processCommonBlocks(),this.processFontBlock(),this.processAlignment()}processFontBlock(){let e={},r=this.inappElement.typography;return r&&(e.fontSize=this.stylesConverter.getSizePx(r.fs),e.fontFamily=P.COOEE+r.fam?.name,e.lineHeight=`${r.lh}`,e.letterSpacing=r.letterSpacing),this.stylesConverter.getColourStyles(this.inappElement.color,"color",e),yi(this.inappHTMLEl,e),e}processPart(e,r){let n=[];r.u&&n.push("underline"),r.st&&n.push("line-through"),n.length||n.push("normal"),oe(e,"font-weight",r.b?"bold":"normal"),oe(e,"font-style",r.i?"italic":"normal"),oe(e,"text-decoration",n.join(" ")),oe(e,"color",r.c??"inherit"),oe(e,"font-family","inherit")}processAlignment(){let e=this.inappElement.typography.ta,r=e?Ti[e]?.toLowerCase():this.inappElement.typography.alignment;r||(r="start"),oe(this.inappHTMLEl,"text-align",r)}};var Ys=class extends Kr{constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("div"),this.insertElement()}render(){this.inappElement.parts?.forEach(e=>{let r=document.createElement("span");r.innerHTML=e.txt?.toString()?.replace(/\n/g,"<br />"),this.processPart(r,e),this.inappHTMLEl.appendChild(r)}),this.processCommonBlocks()}};var qs=class extends mr{constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("div"),this.insertElement()}render(){this.processCommonBlocks()}};var _i=class extends mr{constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("img"),this.insertElement()}render(){this.inappHTMLEl.setAttribute("src",this.inappElement.src),oe(this.inappHTMLEl,"max-width","none"),oe(this.inappHTMLEl,"max-height","none"),oe(this.inappHTMLEl,"margin","0 auto"),this.processCommonBlocks()}};var zs=class t extends mr{constructor(r,n,i){super(r,n,i);this.parent=r;this.inappHTMLEl=document.createElement("div")}static MAX_Z_INDEX="2147483647";render(){return this.parent||this.renderer.removeInApp(),this.insertElement(),this.processCommonBlocks(),this.inappHTMLEl.classList.add(P.IN_APP_WRAPPER_NAME),this.inappHTMLEl.classList.add(this.triggerContext.rootClassName),oe(this.inappHTMLEl,"z-index",t.MAX_Z_INDEX),this.inappHTMLEl}getBackgroundStyles(){return this.inappElement.cover?super.getBackgroundStyles():{}}processWidthAndHeight(){let r=this.inappElement.cont;if(this.inappElement.cover)this.renderer.isParentNotBody()?(oe(this.inappHTMLEl,"width","100%"),oe(this.inappHTMLEl,"height","100%")):(oe(this.inappHTMLEl,"width","100vw"),oe(this.inappHTMLEl,"height","100vh")),oe(this.inappHTMLEl,"top","0"),oe(this.inappHTMLEl,"left","0");else{let n=this.inappElement.spc,i=this.stylesConverter.getScaledSize(r.w)+n.getHorizontal(),o=this.stylesConverter.getScaledSize(r.h)+n.getVertical();oe(this.inappHTMLEl,"width",i+"px"),oe(this.inappHTMLEl,"height",o+"px")}}getSpaceStyles(){return{padding:this.inappElement.spc.getPaddingCSS()}}getDisplayStyles(){return _(_({display:"flex"},this.inappElement.getStylesForWrapper()),this.inappElement.getFlexStylesForContainer())}processPositionBlock(){this.renderer.isParentNotBody()?oe(this.inappHTMLEl,"position","absolute"):oe(this.inappHTMLEl,"position","fixed")}getBorderStyles(){return{}}processTransparency(){}processTransformBlock(){}processShadow(){}};var _l=class extends mr{constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("div"),this.insertElement()}render(){return this.processCommonBlocks(),oe(this.inappHTMLEl,"position","relative"),oe(this.inappHTMLEl,"overflow","hidden"),this.inappHTMLEl.classList.add(P.IN_APP_CONTAINER_NAME),this}};var bl=class t extends Kr{static DAYS="Days";static HOURS="Hours";static MINUTES="Minutes";static SECONDS="Seconds";elements;spans=[];constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("div"),this.insertElement()}render(){this.addTimerChildren(),this.processAndStartTimer(),this.processCommonBlocks();let e=ee(_(_(_({flex:"1 1 0"},this.stylesConverter.getBackgroundStyles(this.inappElement.bg)),this.stylesConverter.getBorderStyles(this.inappElement.br)),this.stylesConverter.getSpaceStyles(this.inappElement.spc)),{marginLeft:this.stylesConverter.getSizePx(this.inappElement.gap),marginRight:this.stylesConverter.getSizePx(this.inappElement.gap)});this.addStylesToTimer(e)}getBackgroundStyles(){return{}}processFontBlock(){let e=super.processFontBlock();return this.stylesConverter.getColourStyles(this.inappElement.color,"color",e),this.addStylesToTimer(e),e}getSpaceStyles(){return{}}getBorderStyles(){return{}}getDisplayStyles(){return{display:"flex",flexWrap:"nowrap",justifyContent:"center"}}addStylesToTimer(e){this.elements.forEach(r=>yi(r,e))}addTimerChildren(){let e=this.inappElement.show;this.elements=[],e.day&&this.elements.push(this.getChild(t.DAYS)),e.hour&&this.elements.push(this.getChild(t.HOURS)),e.minute&&this.elements.push(this.getChild(t.MINUTES)),e.second&&this.elements.push(this.getChild(t.SECONDS)),this.elements.forEach(r=>this.inappHTMLEl.appendChild(r))}getChild(e){let r=document.createElement("div"),n=document.createElement("span"),i=document.createElement("span");return i.innerText=e,n.innerText="00",n.id=`lc-${e}`,oe(i,"font-size","0.5em"),oe(i,"text-align","center"),oe(i,"font-family","inherit"),oe(n,"text-align","center"),oe(n,"font-family","inherit"),this.inappElement.lblPos==="start"?(r.appendChild(i),r.appendChild(n)):(r.appendChild(n),r.appendChild(i)),oe(r,"display","flex"),oe(r,"flex-direction",this.inappElement.horizontal?"":"column"),oe(r,"justify-content","center"),oe(r,"align-items","center"),oe(r,"gap","5px"),this.spans.push(n),r}processAndStartTimer(){let e=this.inappElement.timer.start(this.inappElement.timerType,r=>{this.spans.forEach(n=>{n.id===`lc-${t.DAYS}`?n.innerText=String(r.days).padStart(2,"0"):n.id===`lc-${t.HOURS}`?n.innerText=String(r.hours).padStart(2,"0"):n.id===`lc-${t.MINUTES}`?n.innerText=String(r.minutes).padStart(2,"0"):n.id===`lc-${t.SECONDS}`&&(n.innerText=String(r.seconds).padStart(2,"0"))})});this.triggerContext.intervals.push(e)}};var wl=class extends Kr{constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("select"),this.insertElement()}render(){oe(this.inappHTMLEl,"background","#ffffff00"),oe(this.inappHTMLEl,"outline","none"),this.processCommonBlocks(),this.addListener(this.inappHTMLEl),this.addOptions()}addListener(e){this.triggerContext.selectedEmbeddedItems?.length||this.updateItems(this.triggerContext.triggerData.items[0].vars[0]),e.addEventListener("click",r=>{r.stopPropagation()}),e.addEventListener("change",()=>{let r=new kr(JSON.parse(e.value));this.updateItems(r)})}updateItems(e){let r=this.triggerContext.triggerData.items[0];this.triggerContext.selectedEmbeddedItems=[r.toEmbed(e)];let n=this.parentHTMLEl.querySelector("#coo-13");if(!n)return;let i=e.imgs[0]??r.imgs?.at(0);i?.url&&n.setAttribute("src",i.url)}addOptions(){let e=this.triggerContext.triggerData.items,r=this.inappHTMLEl;if(!e?.length){r.add(this.createOption(this.inappElement.placeholderText));return}let n=this.triggerContext.selectedEmbeddedItems?.at(0);e[0].vars.forEach(i=>{r.add(this.createOption(i.name??"Default",i,i.mID===n?.vID))})}createOption(e,r,n){let i=document.createElement("option");return i.text=e,i.value=JSON.stringify(r),n&&(i.selected=!0),r||(i.disabled=!0),i}};var To=class extends Kr{borderColor="";constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("input"),this.insertElement()}render(){let e=this.setInputType();this.inappHTMLEl.setAttribute("placeholder",this.inappElement.placeholderText),oe(this.inappHTMLEl,"background","#ffffff00"),oe(this.inappHTMLEl,"outline","none"),this.inappHTMLEl.addEventListener("click",r=>{r.stopPropagation()}),this.processCommonBlocks(),this.addListener(this.inappHTMLEl,e),this.triggerContext.addInputField(e,this.inappElement.t)}};var Sl=class t extends To{static EMAIL_REGEX=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;constructor(e,r,n){super(e,r,n)}setInputType(){let e=`coo-${this.inappElement.t}`;return this.inappHTMLEl.setAttribute("type","email"),this.inappHTMLEl.setAttribute("id",e),e}addListener(e,r){e.addEventListener("keydown",n=>{this.borderColor||(this.borderColor=this.inappHTMLEl.style.borderColor),e.value.match(t.EMAIL_REGEX)?(oe(this.inappHTMLEl,"border-color",this.borderColor),this.triggerContext.updateValidation(r,!0)):(oe(this.inappHTMLEl,"border-color","red"),this.triggerContext.updateValidation(r,!1)),n.stopPropagation()})}};var Il=class t extends To{static MOBILE_REGEX=/^\d+$/;constructor(e,r,n){super(e,r,n)}setInputType(){let e=`coo-${this.inappElement.t}`;return this.inappHTMLEl.setAttribute("type","tel"),this.inappHTMLEl.setAttribute("id",e),e}addListener(e,r){e.addEventListener("keydown",n=>{this.borderColor||(this.borderColor=this.inappHTMLEl.style.borderColor),e.value.match(t.MOBILE_REGEX)?(oe(this.inappHTMLEl,"border-color",this.borderColor),this.triggerContext.updateValidation(r,!0)):(oe(this.inappHTMLEl,"border-color","red"),this.triggerContext.updateValidation(r,!1)),n.stopPropagation()})}};var Tl=class extends _i{constructor(e,r,n){super(e,r,n)}render(){super.render(),this.inappHTMLEl.setAttribute("id",`coo-${this.inappElement.type}`)}};var Fn=class t{static DOCUMENT_STANDARD_MODE="CSS1Compat";static ACTIVE_TRIGGER_DATA;static _instance;eventAPIService;parent;rootContainer;containerHTMLElement;ian;scalingFactor=1;triggerContext;resizeListener;cartDrawerToggleSubscription;constructor(e){t._instance=this,this.eventAPIService=Ue.getInstance(),this.resizeListener=()=>this.screenResized(),this.setParentContainer(e)}static get(){return t._instance}render(e){this.renderEngagement(new Ct(e))}getScalingFactor(){return this.scalingFactor}calculateScalingFactor(e){let r=e.max,n=e.cont.w,i=e.cont.h,o=e.spc,s=this.getWidth(),a=this.getHeight();r&&(s=s?Math.min(s,r):r,a=a?Math.min(a,r):r),a&&(s-=o.getHorizontal(),a-=o.getVertical(),s/a<n/i?this.scalingFactor=s/n:this.scalingFactor=a/i,this.scalingFactor=Math.min(this.scalingFactor,1))}setParentContainer(e){this.parent=e||document.body,this.isParentNotBody()&&oe(this.parent,"position","relative")}isParentNotBody(){return this.parent&&this.parent!==document.body}getWidth(){return this.isParentNotBody()?this.parent.clientWidth:document.compatMode===t.DOCUMENT_STANDARD_MODE?document.documentElement.clientWidth:window.innerWidth}getHeight(){return this.isParentNotBody()?this.parent.clientHeight:document.compatMode===t.DOCUMENT_STANDARD_MODE?document.documentElement.clientHeight:window.innerHeight}async renderEngagement(e){this.triggerContext=new Rr(new Date,e),this.triggerContext.onClose(r=>{this.closeInApp(r)}),this.ian=e.ian,(Tr()||e.previewType==="mobile")&&this.ian.overrideForMobileView(),await this.preloadImages(e),e.shouldDelay()?window.setTimeout(()=>{this.withCartDrawerClosed()},e.getDelaySeconds()):this.withCartDrawerClosed()}withCartDrawerClosed(){if(!nt.get().isOpen()||!Tr()){this.startRenderingOnce();return}this.cartDrawerToggleSubscription=nt.get().onToggle().subscribe(({open:r})=>{!r&&this.startRenderingOnce()})}startRenderingOnce(){if(!this.shouldSkipCampaign()){t.ACTIVE_TRIGGER_DATA=this.triggerContext.triggerData;try{this.startRendering()}catch(e){Te(e,"render-popup",{triggerContext:this.triggerContext});return}this.sendTriggerDisplayed(),Tr()||window.addEventListener("resize",this.resizeListener),this.cartDrawerToggleSubscription?.unsubscribe()}}shouldSkipCampaign(){let e=this.triggerContext.triggerData;if(!e.previewType&&t.ACTIVE_TRIGGER_DATA){let n={triggerShown:new An(t.ACTIVE_TRIGGER_DATA??{})};return this.skipTrigger(e,n),!0}if(de.get().isGoKwikPopupOpen)return this.skipTrigger(e,{reason:"GoKwik popup is open"}),!0;let r=P.PAYMENT_MODAL_DETAILS.find(n=>!!document.querySelector(n.identifier));return r?(this.skipTrigger(e,{reason:`${r.gateway} modal is open`}),!0):!1}startRendering(){this.calculateScalingFactor(this.ian),this.rootContainer=new zs(this.parent,this.ian,this.triggerContext).render();try{this.renderContainer(this.triggerContext)}catch(e){throw b.error(e),e}}sendTriggerDisplayed(){let e={};this.triggerContext.triggerData.items?.length&&(e.promotedMIDs=this.triggerContext.triggerData.items?.map(i=>i.mID));let r=new Ce(P.EVENT_TRIGGER_DISPLAYED,e,this.triggerContext.triggerData);this.eventAPIService.sendSilently(r);let n={action:P.CAMPAIGN_DISPLAYED_ACTIVITY};document.dispatchEvent(new CustomEvent(P.POPUP_ACTIVITY_EVENT,{detail:n}))}sendTriggerClosed(e){let r=e.eventName;delete e.eventName;let n=new Ce(r,e,this.triggerContext.triggerData);n.name===P.EVENT_TRIGGER_CLICKED&&(n.items=this.triggerContext.selectedEmbeddedItems??this.triggerContext.triggerData.items?.map(i=>i.toEmbed())),this.eventAPIService.sendSilently(n)}addEnterAnimation(e){this.containerHTMLElement.animate(e.getEnterAnimation(),{duration:500})}renderElement(e,r,n){r instanceof Ki?new Sl(e,r,n).render():r instanceof Xi?new Il(e,r,n).render():r instanceof In?new Ys(e,r,n).render():r instanceof Ji?new Tl(e,r,n).render():r instanceof ln?new _i(e,r,n).render():r instanceof ei?new qs(e,r,n).render():r instanceof qi?new bl(e,r,n).render():r instanceof zi?new wl(e,r,n).render():b.error("Unsupported element type- "+r.type)}renderContainer(e){let r=this.ian?.cont;r&&(this.containerHTMLElement=new _l(this.rootContainer,r,e).render().getHTMLElement(),new yl().loadAllFonts(this.ian),this.ian.elems?.forEach(async n=>{await this.renderElement(this.containerHTMLElement,n,e)}),this.addEnterAnimation(this.ian.anim))}closeInApp(e){let r=this.ian.anim.getExitAnimation();this.sendTriggerClosed(e),t.ACTIVE_TRIGGER_DATA=void 0;let n=this.containerHTMLElement.animate(r,{duration:500,easing:"ease-in-out"});n.onfinish=()=>{this.removeInApp(),window.removeEventListener("resize",this.resizeListener)}}screenResized(){this.removeInApp(),this.startRendering()}removeInApp(){let e=document.querySelector(`.${this.triggerContext.rootClassName}`);e&&e.parentElement.removeChild(e)}skipTrigger(e,r){let n=new Ce(P.EVENT_CAMPAIGN_REJECTED,r,e);this.eventAPIService.sendSilently(n)}async preloadImages(e){let r=e.ian;if(!r)return;let n=[];r.elems.forEach(i=>{let o=i.bg?.img?.src;if(o&&n.push(this.getPromise(o)),i.t===1){let s=i.src;if(!s)return;n.push(this.getPromise(s))}}),r.bg?.img?.src&&n.push(this.getPromise(r.bg.img.src)),r.cont.bg?.img?.src&&n.push(this.getPromise(r.cont.bg.img.src)),await Promise.all(n)}getPromise(e){return new Promise(r=>{let n=new Image;n.onload=r,n.src=e,n.style.display="none"})}};var xl=class{triggerData;eventAPIService=Ue.getInstance();backendAPIService=Pt.getInstance();render(e){e.contentSource===Bo.KLAVIYO&&(this.triggerData=e,window.addEventListener("klaviyoForms",this.handleKlaviyoEvents.bind(this)),window._klOnsite=window._klOnsite||[],window._klOnsite.push(["openForm",e.klaviyoFormID]))}handleKlaviyoEvents(e){if(e.type!=="klaviyoForms")return;let r=e.detail;if(r.formId!==this.triggerData.klaviyoFormID){b.warn("Received invalid trigger callback");return}switch(r.type){case"open":this.eventAPIService.sendSilently(new Ce(P.EVENT_TRIGGER_DISPLAYED,{form:{id:r.formId}},this.triggerData));break;case"stepSubmit":{let n=this.getFormDetails(r);this.eventAPIService.sendSilently(new Ce(P.EVENT_FORM_SUBMITTED,{form:n},this.triggerData)),this.backendAPIService.updateProfileSafe(n);break}case"close":window.removeEventListener("klaviyoForms",this.handleKlaviyoEvents.bind(this)),this.eventAPIService.sendSilently(new Ce(P.EVENT_TRIGGER_CLOSED,{form:{id:r.formId}},this.triggerData));break}}getFormDetails(e){let r={id:e.formId},n=e.metaData;if(rr.hasKeys(n)){let i=["email","phone_number","first_name","last_name","$email","$phone_number","$first_name","$last_name"];Object.keys(n).forEach(a=>{i.includes(a)||(r[a]=n[a])}),r.email=n.$email??n.email,r.mobile=n.$phone_number??n.phone_number;let o=n.$first_name??n.first_name,s=n.$last_name??n.last_name;(o?.length||s?.length)&&(r.name=o+" "+s)}return r}};var Cl=class{static trackIntent(e){if(!this.isInstalled()){b.verbose("Facebook pixel not installed");return}if(!Je.get().pixelPush){b.verbose("Facebook pixel push not enabled");return}let n=di[e.intent]?.toLowerCase(),i=e.segmentName;!n&&!i||(b.verbose(`Sending ${n} intent and ${i} segment to Facebook Pixel`),window.fbq("trackCustom","CooeeIntent",{intent_value:n,segment_value:e.segmentName}))}static isInstalled(){return window.fbq&&typeof window.fbq=="function"}};var Ue=class t extends kn{static INSTANCE;constructor(){super()}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}sendSafe(e){b.verbose(`Waiting for auth to send event ${e.name}`),pr(Rt.replaySubject).then(()=>this.sendSilently(e))}sendSilently(e){this.send(e).catch(r=>b.error(`Failed to send ${e.name}`,r))}async send(e){if(b.verbose(`Sending event: ${e.name}`,e),this.shouldReject(e)){b.warn(`Rejecting event ${e.name}`);return}this.addShopifyAttributes();let r=await this.getAllContext();Object.assign(e,r),e.name!==P.EVENT_APP_BACKGROUND&&this.runtimeData.setActive(),this.backendAPIService.post("/v1/event/track",e).then(async n=>{b.info("\u2705 Event tracked:",this.userFriendlyName(e.name)),this.processEventResponse(e,n.data)}).catch(n=>{b.error(`Error sending event ${e.name} to server`,n)})}userFriendlyName(e){return e.replace("CE ","").replace("Trigger","Engagement").replace("Screen","Page").replace("App ","")}shouldReject(e){return e.trigger?.triggerID==="test"||e.trigger?.triggerID==="preview"?(b.warn("Not sending event as this is a test trigger"),!0):!1}processEventResponse(e,r){this.renderWidgetIfAny(e,r).catch(n=>{Te(n,"process-popup-response",{extra:{event:e,response:r}})}),this.utiliseIntentIfCalculated(r)}async renderWidgetIfAny(e,r){if(!r.triggerData)return;let n=new Ct(r.triggerData);n.occurred=e.occurred,b.log(`${n} will be shown`);let i;try{i=await bo.refreshItems(n)}catch(o){b.error("Failed to refresh the products",o);return}if(n.items=i,n.contentSource===Bo.KLAVIYO){new xl().render(n);return}new Fn().renderEngagement(n).catch(o=>{Te(o,"render-popup",{extra:{event:e},engagementTrigger:n})})}utiliseIntentIfCalculated(e){e.intent&&(_o.trackIntent(e.intent),Cl.trackIntent(e),b.info(`Intent is ${di[e.intent]}`))}addShopifyAttributes(){we.getCurrent().addCooeeAttributes().catch(e=>{b.error("Fail to add attributes in cart",e)})}};var qr=class{constructor(e){this.triggerContext=e}backendAPIService=Pt.getInstance();eventAPIService=Ue.getInstance();async execute(e){let r=de.get().getCurrentItem(),n=e.clickAction;if(!n)return;let i=e.item,o=this.triggerContext,s=o.triggerData,a=new Un,c=o.triggerData.redirectBehaviour,p=!!o.triggerData.discount?.type&&!!n?.applyDiscount,d={selectedVariants:o.triggerData.nonMutableItems.map(O=>({itemMID:O.mID,mID:O.selectedOrFirstVariant.value.mID,variantID:O.selectedOrFirstVariant.value.mID})),eID:o.triggerData.engagementID,cID:o.triggerData.contentID},f="",E=[],y=[];if(i?y=[i.toEmbed()]:e.embeddedItem&&(y=[e.embeddedItem]),n.at===108){let O=o.selectedItems;if(y=e.embeddedItems??O.map(j=>j.toEmbed()),o.shouldGiveFBTDiscount||e.embeddedItems?.length){let j;e.embeddedItems?j=e.embeddedItems.map(z=>({itemMID:z.mID,mID:z.vID,variantID:z.vID,quantity:z.quantity})):j=O.map(z=>({itemMID:z.mID,mID:z.selectedOrFirstVariant.value.mID,variantID:z.selectedOrFirstVariant.value.mID}));let B=o.triggerData.bundleFrom;o.triggerData.isBundleOnCartDrawer()&&B&&(j.push({itemMID:B.mID,mID:B.selectedOrFirstVariant.value.mID,isPrimary:!0}),y.unshift(B.toEmbed())),d.selectedVariants=j,o.triggerData.isBundleOnPDP()&&d.selectedVariants.forEach(z=>{z.mID===r.vID&&(z.isPrimary=!0)})}else d=void 0;E=e.embeddedItems??O}else if(n.at===107){let O=await we.getCurrent().getNormalisedCart();y=O.items,d.selectedVariants=O.items.map(j=>({itemMID:j.mID,mID:j.vID}))}else if(n.at===102)E=i?[i]:[e.embeddedItem];else if(n.at===101)f=i?Wi("/products/"+i.slug):e.embeddedItem?.link;else if(n.at===4){let O=Ka(n.gu?.u);O&&(f=O.href)}else if(n.at===109){let O=await a.upgradeToSubscription(i,o.triggerData);this.triggerContext.triggerData.skipSubscribedItems&&this.triggerContext.renderer.destroy(),nt.get().refreshUI(O)}else if(n.at===104){let O=this.triggerContext.triggerData.collections?.[0];O&&(f="collections/"+O.handle)}if(this.sendTriggerClicked(y,{from:"button"},e.video),f=im(f,s),b.verbose({redirectPath:f,redirectBehaviour:c,hasDiscount:p}),!p&&f){location.href=f;return}let S,D=!1;try{S=await this.getOrGenerateDiscountCode(d),b.verbose("Discount code (if any) to apply",S)}catch(O){if(!this.triggerContext.triggerData.isBYOB()){Sy.default.error("Unable to get a discount code",O);return}}if(S&&n.at===103)await a.copyDiscountCode(S);else if(n.at===110){let O=await a.createNewCart(r,S,o.triggerData);O&&(location.href=O);return}try{S&&await zr.applyWithStorefront([S])}catch(O){b.error(O),D=!0}let k;if(E?.length&&(k=await a.addToCart(E,o.triggerData)),D&&S){zr.navigate(S,c,f);return}if(f){location.href=f;return}zr.navigateWithoutDiscount(c,k)}sendTriggerClicked(e,r,n){let i=new Ce(P.EVENT_TRIGGER_CLICKED,r,this.triggerContext.triggerData);i.items=e,n?.id&&(i.videos=[n.id]),this.eventAPIService.sendSilently(i)}async getOrGenerateDiscountCode(e){let r=this.triggerContext.triggerData.discount;if(!r?.type)return;let n="";if(r.type===er.STATIC){if(!r.code)throw eh("No discount code found","warning",{triggerContext:this.triggerContext}),new Error("No discount code found");return r.code}if(e){if(n=await this.generateDiscount(e),!n)throw b.error("No discount code found",e),new Error("Discount code not found or generated");return n}}async generateDiscount(e){try{return(await this.backendAPIService.generateDiscount(e)).data.code}catch(r){throw br("Failed to generate a discount code"),Te(r,"backend-generate-discount",{triggerContext:this.triggerContext}),r}}};var Rl=class{eventAPIService;modifications=[];constructor(){this.eventAPIService=ge.get(Hn)}execute(e){for(let r of e){if(!r.experimentConfig)continue;this.executeExperiment(r)&&this.trackExperimentRan(r)}if(document.querySelector("#lc-hide-body")?.remove(),!document.body){Ra("No body element found","error");return}this.setupMutationObserver()}executeExperiment(e){let r=e.experimentConfig?.modifications;return r?.length?r.some(n=>{if(!n.cssSelector)return b.verbose("No CSS Selector available",e?.toString()),!1;this.modifications.push(n);let i=Array.from(document.querySelectorAll(n.cssSelector));return i?.length?(this.executeSingleModification(n,i),!0):!1}):(b.log("Nothing to experiment",e.toString()),!0)}executeSingleModification(e,r){if(r?.length)for(let n of r)Object.assign(n.style,e.style),e.type==="TEXT"&&e.text?n.innerHTML=e.text:e.type==="IMAGE"&&this.updateImage(e,n)}trackExperimentRan(e){if(e.id==="preview"){b.warn("Skipping experiment attribution as its preview",e.toString());return}this.eventAPIService.trackExperiment({name:P.EVENT_EXPERIMENT_START,experiment:new An(e)}).catch(r=>{b.error("Fail to track experiment",r)})}setupMutationObserver(){new MutationObserver(r=>{r.forEach(n=>{n.addedNodes.forEach(i=>{i instanceof HTMLElement&&this.modifications.forEach(o=>{i.matches&&i.matches(o.cssSelector)?(b.verbose("Re-applying experiment",o.toString()),this.executeSingleModification(o,[i])):i.querySelectorAll&&(b.verbose("Re-applying experiment",o.toString()),this.executeSingleModification(o,Array.from(i.querySelectorAll(o.cssSelector))))})})})}).observe(document.body,{childList:!0,subtree:!0})}updateImage(e,r){let n=e.image?.lg?.src,i=e.image?.sm?.src;!n&&!i||(r instanceof HTMLPictureElement?this.updatePictureElement({desktop:n,mobile:i},r):this.updateImageElement({desktop:n,mobile:i},r))}updateImageElement(e,r){Tr()&&e.mobile?(r.setAttribute("src",e.mobile),r.removeAttribute("srcset")):e.desktop&&(r.setAttribute("src",e.desktop),r.removeAttribute("srcset"))}updatePictureElement(e,r){if(r.innerHTML="",e.mobile){let i=document.createElement("source");i.srcset=e.mobile,i.media="(max-width: 767px)",r.append(i)}if(e.desktop){let i=document.createElement("source");i.srcset=e.desktop,i.media="(min-width: 768px)",r.append(i)}let n=document.createElement("img");n.src=e.desktop??e.mobile??"",r.append(n)}};var Hn=class t extends kn{static INSTANCE;constructor(){super()}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}fetchExperimentsSilently(){this.fetchExperimentsSafe().catch(e=>Te(e,"fetch-experiments"))}async trackExperiment(e){let r=await this.getAllContext(),n=_(_({},e),r);await this.backendAPIService.post("/v1/event/experiment",n)}async fetchExperimentsSafe(){if(!this.runtimeData.activeExperiments)return;!!await Be.get(pe.SDK_TOKEN)?await this.fetchExperiments():(await pr(Rt.replaySubject),await this.fetchExperiments())}async fetchExperiments(){b.info("Fetch experiments after \u23F0",de.get().getJSLoadTimeDiff()+" of DOM load");let e=await this.getAllContext(),r=_({},e);this.backendAPIService.post("/v1/engagement/experiments",r).then(async n=>{b.info(`Experiments fetched in \u23F0 ${Jr(n.timeTakenMs)}`);let i=n.data.experiments.map(o=>new Ct(o));new Rl().execute(i)}).catch(n=>{b.error("Error sending experiment getter",n)})}};var Al=class{runtimeData=de.get();widgetAPIService=ge.get(xr);experimentAPIService=ge.get(Hn);meddle(){let e=ke.globalRef;e.account=e.account??[],e.profile=e.profile??[],e.events=e.events??[],e.page=e.page??[],this.meddlePage(),this.meddleAccount(),this.meddleEvents(),this.meddleProfile(),this.exposeMethods()}exposeMethods(){let e=ke.globalRef;e.loadPageWidgets=()=>{this.widgetAPIService.loadPageWidgetsSilently()},e.loadCartWidgets=()=>{this.widgetAPIService.loadCartWidgetsSilently()},e.loadExperiments=()=>{this.experimentAPIService.fetchExperimentsSilently()},e.testCartUpdate=this.testCartUpdate.bind(this),e.previewWidget=ke.previewWidget.bind(ke),e.previewPopup=ke.previewPopup.bind(ke)}overwritePush(e,r){Sn(e,"push",r)}meddleAccount(){this.overwritePush(ke.globalRef.account,(...e)=>{this.processAccount(e[0])}),ke.globalRef.account.forEach(this.processAccount.bind(this))}meddleEvents(){this.overwritePush(ke.globalRef.events,(...e)=>{this.processEvent(e[0])}),ke.globalRef.events.forEach(this.processEvent.bind(this))}meddleProfile(){this.overwritePush(ke.globalRef.profile,(...e)=>{this.processProfile(e[0])}),ke.globalRef.profile.forEach(this.processProfile.bind(this))}processAccount(e){e&&(e.appID&&ke.authenticate(e),e.flags&&hi.setFlags(e.flags))}processEvent(e){e&&(P.JS_LOAD_WHITELIST_EVENTS.includes(e[0])?ke.sendEvent(e[0],e[1],_({occurred:this.runtimeData.jsLoadTime},e[2])):ke.sendEvent(e[0],e[1],e[2]))}processProfile(e){e&&ke.updateProfile(e)}processPageName(e){e&&ke.setPageName(e)}meddlePage(){this.overwritePush(ke.globalRef.page,(...e)=>{this.processPage(e[0])}),ke.globalRef.page.forEach(this.processPage.bind(this))}processPage(e){e.currentItem&&this.runtimeData.setCurrentItem(e.currentItem),e.currency&&(this.runtimeData.currencyCode=e.currency),e.shopCurrency&&(this.runtimeData.shopCurrencyCode=e.shopCurrency),e.moneyFormat&&(this.runtimeData.moneyFormat=e.moneyFormat),e.jsLoad&&(this.runtimeData.jsLoadTime=e.jsLoad),e.locale&&(this.runtimeData.locale=e.locale),e.pageName&&ke.setPageName(e.pageName),e.activeExperiment&&(this.runtimeData.activeExperiments=e.activeExperiment),e.customContext&&(this.runtimeData.customContext=_(_({},this.runtimeData.customContext),e.customContext))}async testCartUpdate(){if(this.runtimeData.pageName!=="product"){window.alert("This feature is only available on a product page");return}let e=window.ShopifyAnalytics?.meta??{},r=e.selectedVariantId;if(r||(e.product?.variants?.length>0&&(r=e.product.variants[0].id),r||(r=this.runtimeData.getCurrentItem()?.vID)),!r){window.alert("Could not find a variant to test. Please try a different product page");return}let n=new Ct({id:"preview",shortID:"1",redirectBehaviour:tr.CART_DRAWER});await new qr(new Rr(new Date,n)).execute({clickAction:{at:102},embeddedItem:new Dt({vID:r})})}};var xo=class{static SESSION_STORAGE=window.sessionStorage;static SESSION_STORAGE_KEY_PREFIX=P.COOEE.concat("-");static getString(e,r){return this.getItem(e)||r}static setString(e,r){this.setItem(e,r)}static remove(e){this.removeItem(e)}static getItem(e){return this.SESSION_STORAGE.getItem(this.SESSION_STORAGE_KEY_PREFIX.concat(e))}static setItem(e,r){this.SESSION_STORAGE.setItem(this.SESSION_STORAGE_KEY_PREFIX.concat(e),r)}static removeItem(e){this.SESSION_STORAGE.removeItem(this.SESSION_STORAGE_KEY_PREFIX.concat(e))}};var Co=class t{static INSTANCE;static DEBOUNCE_TIME=1e3;static THRESHOLD=10;lastPercent=0;_lastScreenOrScroll=new Date;constructor(){}set lastScreenOrScroll(e){this._lastScreenOrScroll=e}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}resetScrollID(e){xo.remove(P.SESSION_STORAGE_SCROLL_ID),this.lastScreenOrScroll=e??new Date}listen(){if(window.scrollY){let e=this.getPercentScrolledY();this.shouldSendScroll(e)&&this.sendScroll(e)}Ui(()=>{this.observeWindowScroll()})}observeWindowScroll(){pi(window,"scroll").pipe(Sr(t.DEBOUNCE_TIME),un(()=>{let e=this.getPercentScrolledY();if(e>100){b.warn("Received scroll percent is more than 100",e);return}if(this.shouldSendScroll(e))return e})).subscribe(e=>{this.sendScroll(e)})}shouldSendScroll(e){return Math.abs(this.lastPercent-e)>=t.THRESHOLD||this.lastPercent!==e&&e===100}sendScroll(e){if(e==null)return;let r={percent:e,timeMS:new Date().getTime()-this._lastScreenOrScroll.getTime()};this.lastPercent=e;let n=xo.getString(P.SESSION_STORAGE_SCROLL_ID,""),i=new Ce(P.EVENT_SCROLL,r,null,n);ge.get(Ue).sendSafe(i),xo.setString(P.SESSION_STORAGE_SCROLL_ID,i.id.toHexString()),this._lastScreenOrScroll=new Date(i.occurred)}getPercentScrolledY(){let e=window.document.body.scrollHeight,r=window.innerHeight;return Math.ceil((window.scrollY+r)/e*100)}};var Dl=class t{static ACTIVE_DURATION="aDur";static INACTIVE_DURATION="iaDur";runtimeData=de.get();listen(){document.onvisibilitychange=()=>{document.visibilityState==="visible"?this.onVisible():document.visibilityState==="hidden"&&this.onHidden()}}async onVisible(){}async onHidden(){let e=await this.runtimeData.setInactive();if(e===0){b.info("Not sending background event as user was inactive on website");return}b.info(`Sending background event with ${e} seconds`);let r={};r[t.ACTIVE_DURATION]=e,ge.get(Ue).sendSafe(new Ce(P.EVENT_APP_BACKGROUND,r))}};var Nl=class{compareCartItemSubject=new $t;constructor(){this.compareCartItemSubject.pipe(Sr(100)).subscribe(this.compareCartItems.bind(this))}listen(){this.compareCartItemSubject.next(),this.overwriteXMLHttpRequest(),this.overwriteFetchMethod()}overwriteXMLHttpRequest(){let e=this,r=window.XMLHttpRequest.prototype.send;window.XMLHttpRequest.prototype.send=function(){return this.addEventListener("load",function(){e.performEvent(this._url).catch(n=>b.error("Unable to process cart change in XMLHttpRequest",n))}),r.apply(this,arguments)},b.verbose("Securely overwritten window.XMLHttpRequest.send method")}overwriteFetchMethod(){let e=this,r=window.fetch;window.fetch=function(n){return r.apply(window,arguments).then(i=>(e.performEvent(n.toString()).catch(o=>b.error("Unable to process cart change in fetch",o)),i))},b.verbose("Securely overwritten window.fetch method")}async performEvent(e){this.isCartManipulationURL(e)&&(de.get().isCartDirty=!0,this.compareCartItemSubject.next())}isCartManipulationURL(e){return/\/cart\/(add|change|update|clear)/.test(e)}sendChangesAsEvents(e,r){let n=e?.items,i=r.items,o=[],s=[];if(b.verbose(`Comparing cart change with old count ${n?.length} to new count ${i.length}`),i?.forEach(a=>{let c=n?.find(p=>p.vID===a.vID);if(c){if(c.quantity!==a.quantity){let p=c.quantity<a.quantity,d=Math.abs(c.quantity-a.quantity),f=ee(_({},a),{quantity:d});p?o.push(f):s.push(f)}n&&ih(n,c)}else o.push(a)}),n)for(let a of n)s.push(a);b.verbose(`Cart delta: added: ${o.length}, removed: ${s.length}`),o.length&&this.sendEvent(P.EVENT_ADD_TO_CART,{items:o}),s.length&&e.token===r.token&&this.sendEvent(P.EVENT_REMOVE_FROM_CART,{items:s}),(s.length||o.length)&&window.CooeeSDK.cartChanged$.next({itemsAdded:o,itemsRemoved:s})}sendEvent(e,r){let n=new Ce(e,r);ge.get(Ue).sendSafe(n)}async compareCartItems(){let e=await Be.get(pe.CURRENT_CART,{}),r=await we.getCurrent().getNormalisedCart(!0);this.sendChangesAsEvents(e,r)}};var Ol=class{listen(){return this.overwriteFetchMethod(),this}overwriteFetchMethod(){let e=this,r=window.fetch;window.fetch=async function(n,i){try{await e.modifyRequest(n,i)}catch(o){Te(o,"modify-graphql-request",{extra:{body:JSON.stringify(i?.body)}})}return r(n,i)},b.verbose("Securely overwritten window.fetch method for graphql query")}async modifyRequest(e,r){let n=typeof e=="string"?e:e instanceof Request?e.url:"";if(!(n.includes("graphql.json")&&r?.method==="POST")||!r.body)return;let i;if(typeof r.body=="string")try{i=JSON.parse(r.body)}catch{return}else i=r.body;i?.variables?.input&&(b.verbose("Intercepted fetch request of:",n),i?.query.includes("cartCreate")&&(r.body=await this.updatedBody(i),this.sendBuyNowEvent()))}async updatedBody(e){let r=e.variables.input.attributes??[],n=await Xa();return e.variables.input.attributes=[...r,...n],JSON.stringify(e)}sendBuyNowEvent(){let e=de.get().getCurrentItem();if(!e)return;let r=new Ce(P.EVENT_BUY_NOW_CLICKED,{items:[e]});ge.get(Ue).sendSafe(r)}};var Ro=class{constructor(e,r){this.selectors=e;this.eventName=r;this.selectorString=e.join(",")}static INSTANCE;elements;selectorString;clickListenerCallback=e=>{let r=e.currentTarget,n=new Ce(this.eventName,{class:r.className||void 0,tagName:r.tagName||void 0,id:r.id||void 0});ge.get(Ue).sendSafe(n),this.removeClickListener(this.clickListenerCallback)};listenSilently(){this.listen().catch(e=>b.error(e))}async listen(){this.elements=await Tp(this.selectorString),this.elements.forEach(e=>{e.addEventListener("click",this.clickListenerCallback)})}removeClickListener(e){this.elements?.forEach(r=>{r.removeEventListener("click",e)})}};var Pl=class t extends Ro{static selectors=[".product__thumbnail-list-inner > button","product-gallery-navigation > button",".product-media--thumb-container",".product-images-inner > img",".m-product-media",".swiper-button-control",".media__thumb",".slick-arrow",".productView-img-container.product-single__media",".product-gallery__thumbnail_item_inner"];constructor(){super(t.selectors,P.EVENT_ITEM_THUMBNAIL_CLICKED)}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}};var Ll=class t extends Ro{static selectors=[".jdgm-widget.jdgm-preview-badge.jdgm-preview-badge--with-link.jdgm--done-setup","reviewsio-product-ratings",".ruk_rating_snippet.tracked:not(.hidden)","a > .loox-rating",".yotpo-reviews-star-ratings-widget",".yotpo.lp-hero__reviews",".pr-rating > a",".rivyoReviewWidget"];constructor(){super(t.selectors,P.EVENT_REVIEW_CLICKED)}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}};var Ml=class{selector=[".gokwik-checkout button","button.cart__checkout-button","button.cart__checkout","button#checkout","button#checkout2",'button[id*="checkout" i]','button[name*="checkout" i]','button[class*="checkout" i]'].join(",");listen(){Ui(()=>{b.verbose("Execution order:","document ready"),this.useLocationHash()})}useLocationHash(){let e=window.location.hash?.substring(1);if(e)if(e.includes(P.HASH_INITIATE_CHECKOUT)){document.dispatchEvent(new Event(P.THIRD_PARTY_CHECKOUT_EVENT));let r=document.querySelector(this.selector);if(!r){b.verbose("No clickable cart checkout button found");return}b.verbose("Clickable cart checkout button found",r),r.click()}else e.includes(P.HASH_OPEN_CART_DRAWER)&&nt.get().open()}};var Ks=class{static attachCheckoutListener(){window.gokwikSdk&&window.gokwikSdk.on("checkout_initiated",async()=>{let e=await we.getCurrent().getNormalisedCart(),r={via:"GoKwik",items:e.items,cartToken:e.token,amount:{value:e.amount,currency:e.currency}},n=new Ce(P.EVENT_CHECKOUT_STARTED,r);ge.get(Ue).sendSafe(n)})}};var Bl=class{static watch(){let e=ql();(e==="1"||e==="on")&&Pt.getInstance().updateDevicePropsSafe({debugTill:this.getDebugMillis()}),e==="on"?sessionStorage.cooeeDebug="1":e==="off"&&sessionStorage.removeItem("cooeeDebug"),sessionStorage.cooeeDebug&&this.renderDebugBar()}static renderDebugBar(){let e=document.createElement("cooee-debugger");e.logs=this.logs,Ui(()=>{document.body.appendChild(e)})}static getDebugMillis(){return new Date().getTime()+6*60*60*1e3}};var Ul=class{async migrate(){}};var ke=class{static globalRef;static authenticated;static async initForMerchantWebsiteOnly(){window.cooeeSDKPreview||(this.initGlobalReference(),await new Ul().migrate(),this.autoAuthenticate(),new Al().meddle(),om(),ge.get(Hn).fetchExperimentsSilently(),new Dl().listen(),new Nl().listen(),new Ol().listen(),new Ml().listen(),ge.get(Co).listen(),ge.get(Ll).listenSilently(),ge.get(Pl).listenSilently(),ge.get(xr).loadPageWidgetsSilently(),this.attachGoKwikListeners(),this.setupPreviewListeners(),Bl.watch())}static async initForAll(){this.injectWidgetAssets()}static initGlobalReference(){window.CooeeSDK||Sn(window,"CooeeSDK",{}),this.globalRef=window.CooeeSDK,Sn(this.globalRef,"config",new Je),Sn(this.globalRef,"runtimeData",new de),Sn(this.globalRef,"uaParser",new Yr),Sn(this.globalRef,"cartChanged$",new $t),b.verbose("Global reference initialised")}static injectWidgetAssets(){bt.injectScriptURL(Ht.widgetURL,"cooee-widget-sdk"),bt.injectStylesheet(Ht.styleURL)}static autoAuthenticate(){let e=jh();e&&this.authenticate({shopifyShop:e})}static authenticate(e){if(this.authenticated)return;b.info("Begin auth after \u23F0",de.get().getJSLoadTimeDiff(),"of DOM load");let r=e.appID?.trim(),n=e.shopifyShop;if((Sp(r)||r.length!==24)&&Sp(n)){b.warn("Cooee App ID or Shop name is not configured");return}this.authenticated=!0,ge.get(Rt).init(e)}static sendEvent(e,r,n){let i=new Ce(e,r,n?.triggerData);n?.occurred&&(i.occurred=n.occurred),ge.get(Ue).sendSafe(i)}static updateProfile(e){for(let r in e)if(r.toLowerCase().startsWith("ce "))throw new Error("User property name cannot start with 'CE '");ge.get(Pt).updateProfileSafe(e)}static setPageName(e){if(!e)return;let r=de.get(),n=r.pageName;if(e===n)return;if(r.pageName=e,e==="cart"&&ge.get(xr).loadOrRenderWidgetsAfterCartChange(),P.BLACKLISTED_PAGE_NAMES.some(s=>e.includes(s))){ge.get(Co).resetScrollID();return}let i={};n&&(i.ps=n);let o=new Ce(P.EVENT_SCREEN_VIEW,i);o.occurred=r.jsLoadTime,ge.get(Ue).sendSafe(o),ge.get(Co).resetScrollID(o.occurred)}static previewPopup(e,r){new Fn(r).render(e)}static previewWidget(e){new At(new Ct(e)).renderSilently()}static setupPreviewListeners(){if(window.opener){try{window.opener.postMessage({action:"COOEE_READY_FOR_PREVIEW"},"*")}catch(e){b.error(e)}window.addEventListener("message",e=>{if(b.verbose("Received event",e),!e.origin.includes("letscooee.com")&&!e.origin.includes("localhost"))return;let r=e.data;typeof r=="object"&&(r.action==="POPUP_PREVIEW"?(this.previewPopup(r.engagementTrigger),e.source?.postMessage({action:"PREVIEW_SUCCESSFUL"},e.origin)):r.action==="WIDGET_PREVIEW"&&(this.previewWidget(r.engagementTrigger),e.source?.postMessage({action:"PREVIEW_SUCCESSFUL"},e.origin)))})}}static attachGoKwikListeners(){let e=de.get();window.addEventListener("kp-modal:opened",()=>{e.isGoKwikPopupOpen=!0}),window.addEventListener("user-loggedin",r=>{let{token:n}=r.detail;n&&this.updateProfile({goKwikToken:n})}),window.gokwikSdk?Ks.attachCheckoutListener():window.addEventListener("gokwikLoaded",Ks.attachCheckoutListener)}};tm();rm();b.verbose("Execution order:","top");window.cooeeShopifyScriptLoaded||(window.cooeeShopifyScriptLoaded=!0,(async()=>(b.verbose("Execution order:","IIFE start"),await ke.initForMerchantWebsiteOnly(),await ke.initForAll(),b.verbose("Execution order:","IIFE end")))());b.verbose("Execution order:","bottom");
75
+ `,Un=class{async addToCart(e,r){if(!e.length)return;let i={items:e.map(s=>{let{vID:a,quantity:c}=this.getVIDAndQuantity(s);return{id:a?+a:+s.mID,quantity:c,properties:r.getPrivateAttributesForLineItem()}})},o=nt.get();if(window.cooeeGetCartSections&&typeof window.cooeeGetCartSections=="function")try{i.sections_url=window.location.pathname,i.sections=window.cooeeGetCartSections()}catch(s){Te(s,"execute-cooeeGetCartSections",{engagementTrigger:r})}else o.isMiniCart()?i.sections=["mini-cart"]:o.isShopifyDefaultDrawer()&&(i.sections=o.element.getSectionsToRender?.().map(s=>s.section??s.id));try{let s=await Gi("/cart/add.js",i,"cart-item-add",r);return b.log(`Added ${e.length} items to Cart`),br("Product added to your cart"),s.data}catch(s){let a=["Failed to add product in cart."];if(s instanceof jn&&s.is40x()&&s.responseText){let c=s.responseText;c.description&&a.push(`Reason: ${c.description}`)}a.push("Please try again later."),br(a.join(" "))}}async updateLineItem(e,r){if(!rr.hasKeys(r)){b.warn("No update fields provided");return}let n=_({id:e.key},r);try{let i=await Gi("/cart/change.js",n,"cart-item-update");b.log(`Updated ${e}`),we.getCurrent().update(i.data)}catch{br("Failed to update item in cart")}}async copyDiscountCode(e){if(e)try{await navigator.clipboard.writeText(e),b.log(`Code-${e} copied`),br("Discount code copied")}catch(r){b.error("Failed to copy code",r)}}getProductURL(e){if(!e?.link)return;let r=Wh(e.link);if(r)return Wi("/products/"+r)}async upgradeToSubscription(e,r){if(!e){b.warn("Trying to upgrade to subscription with no item");return}let n=await we.getCurrent().getNormalisedCart(),i=e.selectedOrFirstVariant.value,o=n.items.findIndex(c=>c.vID===i.mID),s=i.selectedSellingPlan.value,a={line:o+1,selling_plan:s?.mID||null,properties:r.getPrivateAttributesForLineItem()};try{let c=await Gi("/cart/change.js",a,"cart-switch-subscription",r);return b.log(`Upgraded ${e} selling plan`),br("Line item updated"),we.getCurrent().update(c.data),c.data}catch{br("Failed to update subscription")}}async createNewCart(e,r,n){if(!e?.vID){b.error("No variant ID found to perform Buy now",e);return}let i=r?[r]:[],o=[{merchandiseId:`gid://shopify/ProductVariant/${e.vID}`,quantity:1,attributes:n.getKVFormatPrivateAttributesForLineItem()}],s=await Xa();return(await pc(RS,{input:{lines:o,discountCodes:i,attributes:s}},"storefront-create-cart")).data.data?.cartCreate?.cart?.checkoutUrl}async process(e){let r=e.clickAction,n=e.items,i=e.triggerData,o;if(r.at){let s=r;if(b.log(`Performing ${JSON.stringify(s)} action`),s.at===101)o=this.getProductURL(n[0]);else if(s.at===102)n?.length&&await this.addToCart(n,i);else if(s.at===103)await this.copyDiscountCode(i.discount?.code);else if(s.at===105)nt.get().open();else if(s.at===104){let a=e.collections;if(!a?.length)return;o=Wi("/collections/"+a[0].handle)}}r.applyDiscount&&i.discount?.code?zr.navigate(i.discount.code,i.redirectBehaviour,o):o&&(location.pathname=o)}getVIDAndQuantity(e){let r,n;if(e instanceof Dt)r=e.vID,n=e.quantity??1;else{if(!e.vars?.length)return{};r=e.selectedOrFirstVariant.value.mID,n=1}return{vID:r,quantity:n}}};var fl=class extends wt{ctaExecutor=new Un;constructor(e){super(e)}async update(e){await super.update(e),this.engagementTrigger.progressBarConfig.update(e.progressBarConfig),await this.checkMilestoneTryCatch(),this.widgetElement.update()}shouldStopRendering(){return!1}renderContainer(){if(this.widgetElement?.isConnected){this.widgetElement.update(),this.addToRendered();return}this.createAngularWidget("cooee-progressbar"),this.checkMilestoneTryCatch()}async checkMilestoneTryCatch(){try{await this.checkMilestone()}catch(e){Te(e,"apply-milestones",{engagementTrigger:this.engagementTrigger})}}async checkMilestone(){let e=await we.getCurrent().getNormalisedCart(),r=this.engagementTrigger.progressBarConfig,n,i=[],o=[],s=[],a,c,p=[...r.milestones];for(let f of p){if(f.rewardType!==Zl.FREE_AUTO_GIFT)continue;if(f.isUIOnly&&!f.allowATC){b.verbose(`Skipping milestone ${f.label} as it is UI only and does not allow ATC`);continue}let E=f.items[0],y=f.reached,S=e.items.find(D=>(D.vID===E.vID||D.mID===E.mID)&&D.properties[P.CAMPAIGN_ATTRIBUTE]===this.engagementTrigger.shortID);y&&(a=f,c=S),S&&i.push(S),!y&&S&&r.removeIneligibleItem?(b.verbose(`Removing free gift ${S.vID} from cart`),s.push(S)):y&&!S&&(b.verbose(`Adding free gift ${E.vID} to cart`),o.push(E))}r.restrictToLatestFreebie&&a&&(c?(i=i.filter(f=>f.vID!==c.vID),o=[]):o=[a.items[0]],s.push(...i)),s.length&&await this.removeFreeGifts(s),o.length&&(n=await this.ctaExecutor.addToCart(o,this.engagementTrigger));let d=r.coupons;if(d?.length)try{await zr.applyWithStorefront(d.map(f=>f.couponCode)),nt.get().refreshUI(n,!1)}catch(f){Te(f,"cart-apply-discount",{extra:{coupons:d},engagementTrigger:this.engagementTrigger})}}async removeFreeGifts(e){await Promise.all(e.map(r=>this.ctaExecutor.updateLineItem(r,{quantity:0})))}};var Gs=class extends wt{constructor(e){super(e)}async update(e){await super.update(e),this.engagementTrigger.content.update(e.content),this.widgetElement.update()}shouldStopRendering(){return!1}renderContainer(){if(this.widgetElement?.isConnected){this.addToRendered();return}this.createAngularWidget("cooee-savings-bar")}};var ml=class extends At{constructor(e){super(e)}shouldStopRendering(){return!1}renderContainer(){if(this.widgetElement?.isConnected){this.addToRendered();return}this.createAngularWidget("cooee-shoppable-videos")}};var dl=class extends At{constructor(e){super(e)}shouldStopRendering(){return!1}renderContainer(){if(this.widgetElement?.isConnected){this.addToRendered();return}this.createAngularWidget("cooee-sticky-atc")}};var hl=class extends At{constructor(e){super(e)}shouldStopRendering(){return!1}renderContainer(){let e=this.getParentElement(`inner-letscooee-${this.engagementTrigger.shortID}`);this.rootContainer.appendChild(e),document.addEventListener(P.ADD_BUNDLE_CTA_INBOUND_EVENT,this.inboundCTAListener.bind(this),!1)}async inboundCTAListener(e){let r=this.engagementTrigger,n=`Engagement(id: ${r.engagementID}, shortID: ${r.shortID})`,i=e.detail;if(!rr.hasKeys(i)){b.error(`No detail received for ${n}`);return}b.log("Detail received for BYOB",i);let o=i.campaignID??i.campaignId??i.campaign_id;if(o!==r.shortID&&o!==r.engagementID){b.warn(`Current ${n} is not BYOB. Received: ${o}`);return}let s=i.items;if(!s?.length)return;let a=s.map(c=>new Dt({mID:c.product_id,vID:c.variant_id,quantity:c.quantity||1}));await new qr(this.triggerContext).execute({embeddedItems:a,clickAction:{at:108,applyDiscount:!0}})}};var Io=class{runtimeData=de.get();processCartWidgetResponse(e){this.runtimeData.isCartDirty=!1,this.runtimeData.cartEngagements=e;let r=[...wt.renderedEngagements];wt.renderedEngagements.clear();for(let n of e){b.info(`${n} received as cart embed`);let i=this.isAlreadyRendered(n,r);if(i>-1){this.rerender(i,n,r);continue}b.verbose(`${n} is new`),n.isProgressBar()?new fl(n).renderSilently():n.isSubscriptionUpsell()?pl.renderCartUpsell(n):n.isSavingsBar()?new Gs(n).renderSilently():new wt(n).renderSilently()}this.removeOldWidgets(r)}processPageWidgetResponse(e){let r=[...At.renderedEngagements];At.renderedEngagements.clear();for(let n of e){b.info(`${n} received as page embed`);let i=this.isAlreadyRendered(n,r);if(i>-1){this.rerender(i,n,r);continue}b.verbose(`${n} is new`),n.isShoppableVideo()?new ml(n).renderSilently():n.isBYOB()?new hl(n).renderSilently():n.isStickyATC()?new dl(n).renderSilently():n.isSavingsBar()?new Gs(n).renderSilently():new At(n).renderSilently()}this.removeOldWidgets(r)}isAlreadyRendered(e,r){let n=r.findIndex(i=>i.isSameTrigger(e));return n<0||e.isSubscriptionUpsell()?-1:n}async rerender(e,r,n){let[i]=n.splice(e,1);if(i)try{await i.updateAndReRender(r)}catch(o){Te(o,"update-and-re-render",{engagementTrigger:r})}}removeOldWidgets(e){for(let r of e)r.destroy()}};wy(document.body,{childList:!0,subtree:!0},500,by).subscribe(()=>{At.renderedEngagements.forEach(e=>e.rerender()),wt.renderedEngagements.forEach(e=>e.rerender())});var kn=class{runtimeData=de.get();backendAPIService=ge.get(Pt);sessionManager=ge.get(Rt);constructor(){}async getAllContext(){let[e,r]=await Promise.all([sl(),this.sessionManager.checkSessionAndGetContext()]);return _(_({},e),r)}};var xr=class t extends kn{static INSTANCE;loadWidgetsSubject=new $t;pageWidgetLoadCount=0;constructor(){super(),this.loadWidgetsSubject.pipe(Sr(300)).subscribe(()=>{this.loadCartWidgets().catch(e=>b.error("Unable to initiate cart widgets",e)),this.loadPageWidgets().catch(e=>b.error("Unable to initiate page widgets",e))}),window.CooeeSDK.cartChanged$.subscribe(()=>this.loadWidgetsSubject.next())}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}loadOrRenderWidgetsAfterCartChange(){this.runtimeData.isCartDirty?this.loadWidgetsSilently():this.renderCachedCartWidgets()}loadPageWidgetsSilently(){pr(Rt.replaySubject).then(()=>{this.loadPageWidgets().catch(e=>b.error("Unable to initiate load page widgets",e))})}loadCartWidgetsSilently(){pr(Rt.replaySubject).then(()=>{this.loadCartWidgets().catch(e=>b.error("Unable to initiate cart widgets",e))})}loadWidgetsSilently(){pr(Rt.replaySubject).then(()=>{this.loadWidgetsSubject.next()})}async loadPageWidgets(){this.pageWidgetLoadCount++,this.pageWidgetLoadCount===1?b.info("Fetch page widgets (after \u23F0",de.get().getJSLoadTimeDiff()+" of DOM load)"):b.info("Fetch page widgets");let e=await this.getAllContext(),r=_({},e);this.backendAPIService.post("/v1/engagement/page-widgets",r).then(n=>{b.info(`Page widgets loaded in \u23F0 ${Jr(n.timeTakenMs)}`);let i=n.data.widgets.map(o=>new Ct(o));new Io().processPageWidgetResponse(i)}).catch(n=>{b.error("Error sending widget getter",n)})}async loadCartWidgets(){b.info("Fetch cart widgets");let e=await this.getAllContext(),r=_({},e);this.backendAPIService.post("/v1/engagement/cart-widgets",r).then(n=>{b.info(`Cart widgets loaded in \u23F0 ${Jr(n.timeTakenMs)}`);let i=n.data.widgets.map(o=>new Ct(o));new Io().processCartWidgetResponse(i)}).catch(n=>{b.error("Error sending widget getter",n)})}async getVariation(e){let r=await this.getAllContext();return Object.assign(e,r),this.backendAPIService.post("/v1/engagement/get-variant",e)}renderCachedCartWidgets(){new Io().processCartWidgetResponse(this.runtimeData.cartEngagements)}};var gl=class t{static INSTANCE;constructor(){this.init()}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}init(){Ls.get(pe.APP_CONFIG,{}).then(e=>this.updateGlobalConfig(e))}async processAppConfigurations(e){b.verbose("Received app configuration",e),e.currencyCount=e.currencies?.length;let r=this.updateGlobalConfig(e);Ls.set(pe.APP_CONFIG,r).catch(n=>b.error(n)),cl.processConfiguration(),r.website&&(bt.injectRawScript(r.website.commonJS),bt.injectRawCSS(r.website.commonCSS)),nt.get().onToggle().subscribe(async({open:n})=>{b.info("Cart drawer is now",n?"open":"closed"),n&&(ge.get(xr).loadOrRenderWidgetsAfterCartChange(),await this.trackViewCartEvent())})}updateGlobalConfig(e){let r=ke.globalRef.config.update(e);return nt.forceUpdate(),b.verbose("App configurations",r),r}async trackViewCartEvent(){let e=await we.getCurrent().getNormalisedCart(),r={value:e.amount,currency:e.currency},n={items:e.items,amount:r,drawer:!0};ge.get(Ue).sendSafe(new Ce(P.EVENT_VIEW_CART,n))}};var gi=class t{static INSTANCE;backendAPIService=Pt.getInstance();coreService=gl.getInstance();sdkToken="";userID="";deviceID="";appID="";shopifyShop="";constructor(){}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}init(e){this.appID=e.appID,this.shopifyShop=e.shopifyShop}async storeAndPopulateAuthData(e){e&&(e.userID&&(this.userID=e.userID,await Be.set(pe.ID,e.userID)),e.deviceID&&(this.deviceID=e.deviceID,await Be.set(pe.DEVICE_ID,e.deviceID)),e.sdkToken&&(this.sdkToken=e.sdkToken,await Be.set(pe.SDK_TOKEN,e.sdkToken)),this.updateAPIClient())}async validateSession(e){await this.populateFirstSeen(),await this.populateUserDataFromStorage(),b.verbose("Validating session with server");let r=await this.getSessionValidateData(e);try{let n=await this.backendAPIService.validateSession(r),i=n.data;b.info(`Auth finished in \u23F0 ${Jr(n.timeTakenMs)}`),b.verbose("Validate session Response",i),await this.coreService.processAppConfigurations(i.appSettings),await this.storeAndPopulateAuthData(i)}catch(n){throw b.error(n),n}}async populateUserDataFromStorage(){if(this.sdkToken=await Be.get(pe.SDK_TOKEN),!this.sdkToken){b.warn("No SDK token found in local storage");return}this.userID=await Be.get(pe.ID),this.deviceID=await Be.get(pe.DEVICE_ID),this.updateAPIClient()}updateAPIClient(){b.verbose("SDK Token:",this.sdkToken),b.info("Device ID:",this.deviceID),this.userID&&b.info("User ID:",this.userID),_o.trackDeviceID(this.deviceID),this.backendAPIService.setAPIToken(this.sdkToken),this.backendAPIService.setDeviceId(this.deviceID),ns("Visitor Info",{device_id:this.deviceID,user_id:this.userID}),th({id:this.deviceID})}async getSessionValidateData(e){let r=await new al().safeGet(),n=await Be.get(pe.DEVICE_ID);n||(n=new yt().toHexString(),await Be.set(pe.DEVICE_ID,n));let i=await sl();return ee(_(_({deviceID:n,deviceProps:r,appID:this.appID,shopifyShop:this.shopifyShop},e),i),{sdk:P.SDK,ad:ol.getAdParams(),occurred:this.getSessionStartTime(de.get().jsLoadTime),properties:{}})}async populateFirstSeen(){let e=await Be.get(pe.FIRST_SEEN),r=e?new Date(e):new Date;e||await Be.set(pe.FIRST_SEEN,r.toISOString()),this.backendAPIService.setFirstSeen(r),ns("Visitor Info",{first_seen:r.toISOString()})}getSessionStartTime(e){return(new Date().getTime()-e.getTime())/1e3>P.IDLE_TIME_IN_SECONDS?new Date:e}};var Rt=class t{static replaySubject=new ys(1);static INSTANCE;constructor(){}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}init(e){if(b.verbose("Initialising SDK",e),gy(navigator.userAgent)){b.info("This seems to be a bot. Disabling SDK");return}gi.getInstance().init(e),t.INSTANCE.checkForNewSessionOnPageLoad().then(async()=>{t.replaySubject.next(!0),t.replaySubject.complete()}).catch(r=>{b.error("Unable to initiate session",r)})}getCurrentSessionID(){return vt.set(pe.SESSION_LAST_USED_TIME,new Date().getTime()),vt.get(pe.ID,"")}async checkForNewSessionOnPageLoad(){await this.checkForNewSessionSafe(!0)}async checkSessionAndGetContext(){return await this.checkForNewSessionSafe(!1),this.getContext()}async getContext(){let[e,r,n]=await Promise.all([this.getCurrentSessionID(),this.getCurrentSessionNumber(),this.getLandingPage()]);return Bi({"cooee_session.number":r}),ns("Visitor Session",{id:e,number:r,landing_page:n}),{sessionID:e,sessionNumber:r,landingPage:n}}async checkForNewSessionSafe(e){await mc.request("validate_session",async()=>{await this.checkForNewSessionUnsafe(e)})}async checkForNewSessionUnsafe(e){let r=!1;if(await this.isNewSessionRequired()?(b.info("New session to be started"),await this.startNewSession(),e=!0,r=!0):await this.notSynced()&&(r=!0),e){let n=await this.getContext();b.info(`Session ID: ${n.sessionID} & number: ${n.sessionNumber}`),await gi.getInstance().validateSession(ee(_({},n),{newSession:r})),await vt.set(pe.SESSION_SYNCED,!0)}}async startNewSession(){b.verbose("Starting new session"),await vt.clear(),b.verbose("Cleared SessionStorage before starting new session");let e=new Date,r=new yt().toHexString();b.verbose("New session ID to be used",r);let n=await Be.get(pe.SESSION_NUMBER,0)+1;await Promise.all([Be.set(pe.SESSION_NUMBER,n),vt.set(pe.ID,r),vt.set(pe.SESSION_LAST_USED_TIME,e.getTime()),vt.set(pe.SESSION_LANDING_PAGE,ea())])}getLandingPage(){return vt.get(pe.SESSION_LANDING_PAGE,{})}getCurrentSessionNumber(){return Be.get(pe.SESSION_NUMBER,1)}async isNewSessionRequired(){if(!await vt.get(pe.ID))return!0;let e=await vt.get(pe.SESSION_LAST_USED_TIME,0);return e?(new Date().getTime()-e)/1e3>P.IDLE_TIME_IN_SECONDS:!0}async notSynced(){return!await vt.get(pe.SESSION_SYNCED,!1)}};var yl=class{loadedFonts=[];async loadAllFonts(e){e.elems?.forEach(r=>{r instanceof Fr&&this.loadFamily(r.typography?.fam)})}async loadFamily(e){if(!e?.fonts||this.loadedFonts.indexOf(e.name)>-1)return;let r=[];e.fonts.forEach(i=>{if(i.url){let o=new FontFace(P.COOEE+e.name,i.getURL(),i.getFontDescriptor());r.push(o.load())}}),this.loadedFonts.push(e.name),(await Promise.all(r)).forEach(i=>{document.fonts.add(i)})}};var vl=class{static updateIdentity(e){if(!this.isInstalled())return;let r={};e.email&&(r.email=e.email),e.mobile&&(r.phone_number=e.mobile),b.verbose("Sending email/mobile to Klaviyo"),window.klaviyo.push(["identify",r])}static isInstalled(){return window.klaviyo&&typeof window.klaviyo=="object"}};var El=class{action;triggerContext;constructor(e,r){this.action=e,this.triggerContext=r}async execute(){let e=this.containsCTA()?P.EVENT_TRIGGER_CLICKED:P.EVENT_TRIGGER_CLOSED;switch(this.action.at!==106&&await this.closeTriggerAndSendEvent(e),this.action.at){case 2:break;case 4:this.gotoURLAction();break;case 5:this.shareAction();break;case 106:await this.collectFormData();break;case void 0:case 105:break;default:b.error("Received an invalid ClickActionType: ",this.action.at);return}}externalAction(){this.action.ext?.u&&window.open(this.action.ext.u,"_blank")?.focus()}gotoURLAction(){if(this.action.gu?.u){let e=this.action.gu.u;Ka(e)||(e=`//${e}`),window.open(e,"_self")}}async closeTriggerAndSendEvent(e,r){this.triggerContext.closeInApp(e,r),await this.dispatchEvent()}shareAction(){if(!this.action.share)return;if(!navigator.share){b.warn("Navigator.share is not compatible with this browser");return}navigator.share({text:this.action.share.text,title:"Share"}).then(r=>console.log(r)).catch(r=>console.error(r))}containsCTA(){return this.action.at&&this.action.at!==1?!0:!(this.isEmpty(this.action.custKV)&&this.isEmpty(this.action.up))}isEmpty(e){return e?Object.keys(e).length===0:!0}async collectFormData(){let e={};for(let r of this.triggerContext.inputs){if(!r.isValid)return;let i=document.getElementById(r.id).value;r.type===51?e.email=i:r.type===52&&(e.mobile=i)}await this.closeTriggerAndSendEvent(P.EVENT_FORM_SUBMITTED,{form:e}),br("Coupon applied on cart"),vl.updateIdentity(e)}async dispatchEvent(){let e=this.triggerContext.triggerData,r={clickAction:this.action,items:this.triggerContext.selectedEmbeddedItems??e.embeddedItems??e.items,collections:e.collections,triggerData:e};await new Un().process(r);let n={action:this.containsCTA()?P.CAMPAIGN_CLICKED_ACTIVITY:P.CAMPAIGN_CLOSED_ACTIVITY};document.dispatchEvent(new CustomEvent(P.POPUP_ACTIVITY_EVENT,{detail:n}))}};var mr=class{renderer=Fn.get();parentHTMLEl;inappElement;inappHTMLEl;triggerContext;stylesConverter;scalingFactor;constructor(e,r,n){this.parentHTMLEl=e,this.inappElement=r,this.triggerContext=n,this.stylesConverter=new wo(this.renderer.getScalingFactor())}getHTMLElement(){return this.inappHTMLEl}insertElement(){this.parentHTMLEl.appendChild(this.inappHTMLEl)}processCommonBlocks(){this.processWidthAndHeight(),this.processPositionBlock(),this.processTransformBlock(),this.processTransparency(),this.processShadow(),this.registerAction();let e=ee(_(_(_(_({},this.getDisplayStyles()),this.getSpaceStyles()),this.getBorderStyles()),this.getBackgroundStyles()),{boxSizing:"border-box",outline:"none"});yi(this.inappHTMLEl,e)}getDisplayStyles(){return{display:"block"}}processWidthAndHeight(){this.inappElement.w&&oe(this.inappHTMLEl,"width",this.stylesConverter.getSizePx(this.inappElement.w)),this.inappElement.h&&oe(this.inappHTMLEl,"height",this.stylesConverter.getSizePx(this.inappElement.h))}processPositionBlock(){let e={position:"absolute",left:this.stylesConverter.getSizePx(this.inappElement.x),top:this.stylesConverter.getSizePx(this.inappElement.y)};yi(this.inappHTMLEl,e)}getBorderStyles(){return this.stylesConverter.getBorderStyles(this.inappElement.br)}getSpaceStyles(){return this.stylesConverter.getSpaceStyles(this.inappElement.spc)}processTransparency(){let e=this.inappElement.alpha;if(!isNaN(e)){let r=(e/100).toFixed(2);oe(this.inappHTMLEl,"opacity",r)}}processShadow(){let e=this.inappElement.shd;e?oe(this.inappHTMLEl,"box-shadow",e.getStyle(this.scalingFactor)):oe(this.inappHTMLEl,"box-shadow","unset")}processTransformBlock(){let e=new $n(this.inappElement.trf);e&&e.rotate&&oe(this.inappHTMLEl,"transform",`rotate(${e.rotate}deg)`)}registerAction(){let e=this.inappElement.clc;!e||Object.keys(e).length===0||(this.inappHTMLEl.addEventListener("click",r=>{r.stopPropagation(),new El(e,this.triggerContext).execute()}),oe(this.inappHTMLEl,"cursor","pointer"))}getBackgroundStyles(){return this.stylesConverter.getBackgroundStyles(this.inappElement.bg)}};var Kr=class extends mr{constructor(e,r,n){super(e,r,n)}processCommonBlocks(){super.processCommonBlocks(),this.processFontBlock(),this.processAlignment()}processFontBlock(){let e={},r=this.inappElement.typography;return r&&(e.fontSize=this.stylesConverter.getSizePx(r.fs),e.fontFamily=P.COOEE+r.fam?.name,e.lineHeight=`${r.lh}`,e.letterSpacing=r.letterSpacing),this.stylesConverter.getColourStyles(this.inappElement.color,"color",e),yi(this.inappHTMLEl,e),e}processPart(e,r){let n=[];r.u&&n.push("underline"),r.st&&n.push("line-through"),n.length||n.push("normal"),oe(e,"font-weight",r.b?"bold":"normal"),oe(e,"font-style",r.i?"italic":"normal"),oe(e,"text-decoration",n.join(" ")),oe(e,"color",r.c??"inherit"),oe(e,"font-family","inherit")}processAlignment(){let e=this.inappElement.typography.ta,r=e?Ti[e]?.toLowerCase():this.inappElement.typography.alignment;r||(r="start"),oe(this.inappHTMLEl,"text-align",r)}};var Ys=class extends Kr{constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("div"),this.insertElement()}render(){this.inappElement.parts?.forEach(e=>{let r=document.createElement("span");r.innerHTML=e.txt?.toString()?.replace(/\n/g,"<br />"),this.processPart(r,e),this.inappHTMLEl.appendChild(r)}),this.processCommonBlocks()}};var qs=class extends mr{constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("div"),this.insertElement()}render(){this.processCommonBlocks()}};var _i=class extends mr{constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("img"),this.insertElement()}render(){this.inappHTMLEl.setAttribute("src",this.inappElement.src),oe(this.inappHTMLEl,"max-width","none"),oe(this.inappHTMLEl,"max-height","none"),oe(this.inappHTMLEl,"margin","0 auto"),this.processCommonBlocks()}};var zs=class t extends mr{constructor(r,n,i){super(r,n,i);this.parent=r;this.inappHTMLEl=document.createElement("div")}static MAX_Z_INDEX="2147483647";render(){return this.parent||this.renderer.removeInApp(),this.insertElement(),this.processCommonBlocks(),this.inappHTMLEl.classList.add(P.IN_APP_WRAPPER_NAME),this.inappHTMLEl.classList.add(this.triggerContext.rootClassName),oe(this.inappHTMLEl,"z-index",t.MAX_Z_INDEX),this.inappHTMLEl}getBackgroundStyles(){return this.inappElement.cover?super.getBackgroundStyles():{}}processWidthAndHeight(){let r=this.inappElement.cont;if(this.inappElement.cover)this.renderer.isParentNotBody()?(oe(this.inappHTMLEl,"width","100%"),oe(this.inappHTMLEl,"height","100%")):(oe(this.inappHTMLEl,"width","100vw"),oe(this.inappHTMLEl,"height","100vh")),oe(this.inappHTMLEl,"top","0"),oe(this.inappHTMLEl,"left","0");else{let n=this.inappElement.spc,i=this.stylesConverter.getScaledSize(r.w)+n.getHorizontal(),o=this.stylesConverter.getScaledSize(r.h)+n.getVertical();oe(this.inappHTMLEl,"width",i+"px"),oe(this.inappHTMLEl,"height",o+"px")}}getSpaceStyles(){return{padding:this.inappElement.spc.getPaddingCSS()}}getDisplayStyles(){return _(_({display:"flex"},this.inappElement.getStylesForWrapper()),this.inappElement.getFlexStylesForContainer())}processPositionBlock(){this.renderer.isParentNotBody()?oe(this.inappHTMLEl,"position","absolute"):oe(this.inappHTMLEl,"position","fixed")}getBorderStyles(){return{}}processTransparency(){}processTransformBlock(){}processShadow(){}};var _l=class extends mr{constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("div"),this.insertElement()}render(){return this.processCommonBlocks(),oe(this.inappHTMLEl,"position","relative"),oe(this.inappHTMLEl,"overflow","hidden"),this.inappHTMLEl.classList.add(P.IN_APP_CONTAINER_NAME),this}};var bl=class t extends Kr{static DAYS="Days";static HOURS="Hours";static MINUTES="Minutes";static SECONDS="Seconds";elements;spans=[];constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("div"),this.insertElement()}render(){this.addTimerChildren(),this.processAndStartTimer(),this.processCommonBlocks();let e=ee(_(_(_({flex:"1 1 0"},this.stylesConverter.getBackgroundStyles(this.inappElement.bg)),this.stylesConverter.getBorderStyles(this.inappElement.br)),this.stylesConverter.getSpaceStyles(this.inappElement.spc)),{marginLeft:this.stylesConverter.getSizePx(this.inappElement.gap),marginRight:this.stylesConverter.getSizePx(this.inappElement.gap)});this.addStylesToTimer(e)}getBackgroundStyles(){return{}}processFontBlock(){let e=super.processFontBlock();return this.stylesConverter.getColourStyles(this.inappElement.color,"color",e),this.addStylesToTimer(e),e}getSpaceStyles(){return{}}getBorderStyles(){return{}}getDisplayStyles(){return{display:"flex",flexWrap:"nowrap",justifyContent:"center"}}addStylesToTimer(e){this.elements.forEach(r=>yi(r,e))}addTimerChildren(){let e=this.inappElement.show;this.elements=[],e.day&&this.elements.push(this.getChild(t.DAYS)),e.hour&&this.elements.push(this.getChild(t.HOURS)),e.minute&&this.elements.push(this.getChild(t.MINUTES)),e.second&&this.elements.push(this.getChild(t.SECONDS)),this.elements.forEach(r=>this.inappHTMLEl.appendChild(r))}getChild(e){let r=document.createElement("div"),n=document.createElement("span"),i=document.createElement("span");return i.innerText=e,n.innerText="00",n.id=`lc-${e}`,oe(i,"font-size","0.5em"),oe(i,"text-align","center"),oe(i,"font-family","inherit"),oe(n,"text-align","center"),oe(n,"font-family","inherit"),this.inappElement.lblPos==="start"?(r.appendChild(i),r.appendChild(n)):(r.appendChild(n),r.appendChild(i)),oe(r,"display","flex"),oe(r,"flex-direction",this.inappElement.horizontal?"":"column"),oe(r,"justify-content","center"),oe(r,"align-items","center"),oe(r,"gap","5px"),this.spans.push(n),r}processAndStartTimer(){let e=this.inappElement.timer.start(this.inappElement.timerType,r=>{this.spans.forEach(n=>{n.id===`lc-${t.DAYS}`?n.innerText=String(r.days).padStart(2,"0"):n.id===`lc-${t.HOURS}`?n.innerText=String(r.hours).padStart(2,"0"):n.id===`lc-${t.MINUTES}`?n.innerText=String(r.minutes).padStart(2,"0"):n.id===`lc-${t.SECONDS}`&&(n.innerText=String(r.seconds).padStart(2,"0"))})});this.triggerContext.intervals.push(e)}};var wl=class extends Kr{constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("select"),this.insertElement()}render(){oe(this.inappHTMLEl,"background","#ffffff00"),oe(this.inappHTMLEl,"outline","none"),this.processCommonBlocks(),this.addListener(this.inappHTMLEl),this.addOptions()}addListener(e){this.triggerContext.selectedEmbeddedItems?.length||this.updateItems(this.triggerContext.triggerData.items[0].vars[0]),e.addEventListener("click",r=>{r.stopPropagation()}),e.addEventListener("change",()=>{let r=new kr(JSON.parse(e.value));this.updateItems(r)})}updateItems(e){let r=this.triggerContext.triggerData.items[0];this.triggerContext.selectedEmbeddedItems=[r.toEmbed(e)];let n=this.parentHTMLEl.querySelector("#coo-13");if(!n)return;let i=e.imgs[0]??r.imgs?.at(0);i?.url&&n.setAttribute("src",i.url)}addOptions(){let e=this.triggerContext.triggerData.items,r=this.inappHTMLEl;if(!e?.length){r.add(this.createOption(this.inappElement.placeholderText));return}let n=this.triggerContext.selectedEmbeddedItems?.at(0);e[0].vars.forEach(i=>{r.add(this.createOption(i.name??"Default",i,i.mID===n?.vID))})}createOption(e,r,n){let i=document.createElement("option");return i.text=e,i.value=JSON.stringify(r),n&&(i.selected=!0),r||(i.disabled=!0),i}};var To=class extends Kr{borderColor="";constructor(e,r,n){super(e,r,n),this.inappHTMLEl=document.createElement("input"),this.insertElement()}render(){let e=this.setInputType();this.inappHTMLEl.setAttribute("placeholder",this.inappElement.placeholderText),oe(this.inappHTMLEl,"background","#ffffff00"),oe(this.inappHTMLEl,"outline","none"),this.inappHTMLEl.addEventListener("click",r=>{r.stopPropagation()}),this.processCommonBlocks(),this.addListener(this.inappHTMLEl,e),this.triggerContext.addInputField(e,this.inappElement.t)}};var Sl=class t extends To{static EMAIL_REGEX=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;constructor(e,r,n){super(e,r,n)}setInputType(){let e=`coo-${this.inappElement.t}`;return this.inappHTMLEl.setAttribute("type","email"),this.inappHTMLEl.setAttribute("id",e),e}addListener(e,r){e.addEventListener("keydown",n=>{this.borderColor||(this.borderColor=this.inappHTMLEl.style.borderColor),e.value.match(t.EMAIL_REGEX)?(oe(this.inappHTMLEl,"border-color",this.borderColor),this.triggerContext.updateValidation(r,!0)):(oe(this.inappHTMLEl,"border-color","red"),this.triggerContext.updateValidation(r,!1)),n.stopPropagation()})}};var Il=class t extends To{static MOBILE_REGEX=/^\d+$/;constructor(e,r,n){super(e,r,n)}setInputType(){let e=`coo-${this.inappElement.t}`;return this.inappHTMLEl.setAttribute("type","tel"),this.inappHTMLEl.setAttribute("id",e),e}addListener(e,r){e.addEventListener("keydown",n=>{this.borderColor||(this.borderColor=this.inappHTMLEl.style.borderColor),e.value.match(t.MOBILE_REGEX)?(oe(this.inappHTMLEl,"border-color",this.borderColor),this.triggerContext.updateValidation(r,!0)):(oe(this.inappHTMLEl,"border-color","red"),this.triggerContext.updateValidation(r,!1)),n.stopPropagation()})}};var Tl=class extends _i{constructor(e,r,n){super(e,r,n)}render(){super.render(),this.inappHTMLEl.setAttribute("id",`coo-${this.inappElement.type}`)}};var Fn=class t{static DOCUMENT_STANDARD_MODE="CSS1Compat";static ACTIVE_TRIGGER_DATA;static _instance;eventAPIService;parent;rootContainer;containerHTMLElement;ian;scalingFactor=1;triggerContext;resizeListener;cartDrawerToggleSubscription;constructor(e){this.eventAPIService=Ue.getInstance(),this.resizeListener=()=>this.screenResized(),this.setParentContainer(e)}static get(){return t._instance}render(e){this.renderEngagement(new Ct(e))}getScalingFactor(){return this.scalingFactor}calculateScalingFactor(e){let r=e.max,n=e.cont.w,i=e.cont.h,o=e.spc,s=this.getWidth(),a=this.getHeight();r&&(s=s?Math.min(s,r):r,a=a?Math.min(a,r):r),a&&(s-=o.getHorizontal(),a-=o.getVertical(),s/a<n/i?this.scalingFactor=s/n:this.scalingFactor=a/i,this.scalingFactor=Math.min(this.scalingFactor,1))}setParentContainer(e){this.parent=e||document.body,this.isParentNotBody()&&oe(this.parent,"position","relative")}isParentNotBody(){return this.parent&&this.parent!==document.body}getWidth(){return this.isParentNotBody()?this.parent.clientWidth:document.compatMode===t.DOCUMENT_STANDARD_MODE?document.documentElement.clientWidth:window.innerWidth}getHeight(){return this.isParentNotBody()?this.parent.clientHeight:document.compatMode===t.DOCUMENT_STANDARD_MODE?document.documentElement.clientHeight:window.innerHeight}async renderEngagement(e){this.triggerContext=new Rr(new Date,e),this.triggerContext.onClose(r=>{this.closeInApp(r)}),this.ian=e.ian,(Tr()||e.previewType==="mobile")&&this.ian.overrideForMobileView(),await this.preloadImages(e),e.shouldDelay()?window.setTimeout(()=>{this.withCartDrawerClosed()},e.getDelaySeconds()):this.withCartDrawerClosed()}withCartDrawerClosed(){if(!nt.get().isOpen()||!Tr()){this.startRenderingOnce();return}this.cartDrawerToggleSubscription=nt.get().onToggle().subscribe(({open:r})=>{!r&&this.startRenderingOnce()})}startRenderingOnce(){if(!this.shouldSkipCampaign()){t.ACTIVE_TRIGGER_DATA=this.triggerContext.triggerData,t._instance=this;try{this.startRendering()}catch(e){Te(e,"render-popup",{triggerContext:this.triggerContext});return}this.sendTriggerDisplayed(),Tr()||window.addEventListener("resize",this.resizeListener),this.cartDrawerToggleSubscription?.unsubscribe()}}shouldSkipCampaign(){let e=this.triggerContext.triggerData;if(!e.previewType&&t.ACTIVE_TRIGGER_DATA){let n={triggerShown:new An(t.ACTIVE_TRIGGER_DATA??{})};return this.skipTrigger(e,n),!0}if(de.get().isGoKwikPopupOpen)return this.skipTrigger(e,{reason:"GoKwik popup is open"}),!0;let r=P.PAYMENT_MODAL_DETAILS.find(n=>!!document.querySelector(n.identifier));return r?(this.skipTrigger(e,{reason:`${r.gateway} modal is open`}),!0):!1}startRendering(){this.calculateScalingFactor(this.ian),this.rootContainer=new zs(this.parent,this.ian,this.triggerContext).render();try{this.renderContainer(this.triggerContext)}catch(e){throw b.error(e),e}}sendTriggerDisplayed(){let e={};this.triggerContext.triggerData.items?.length&&(e.promotedMIDs=this.triggerContext.triggerData.items?.map(i=>i.mID));let r=new Ce(P.EVENT_TRIGGER_DISPLAYED,e,this.triggerContext.triggerData);this.eventAPIService.sendSilently(r);let n={action:P.CAMPAIGN_DISPLAYED_ACTIVITY};document.dispatchEvent(new CustomEvent(P.POPUP_ACTIVITY_EVENT,{detail:n}))}sendTriggerClosed(e){let r=e.eventName;delete e.eventName;let n=new Ce(r,e,this.triggerContext.triggerData);n.name===P.EVENT_TRIGGER_CLICKED&&(n.items=this.triggerContext.selectedEmbeddedItems??this.triggerContext.triggerData.items?.map(i=>i.toEmbed())),this.eventAPIService.sendSilently(n)}addEnterAnimation(e){this.containerHTMLElement.animate(e.getEnterAnimation(),{duration:500})}renderElement(e,r,n){r instanceof Ki?new Sl(e,r,n).render():r instanceof Xi?new Il(e,r,n).render():r instanceof In?new Ys(e,r,n).render():r instanceof Ji?new Tl(e,r,n).render():r instanceof ln?new _i(e,r,n).render():r instanceof ei?new qs(e,r,n).render():r instanceof qi?new bl(e,r,n).render():r instanceof zi?new wl(e,r,n).render():b.error("Unsupported element type- "+r.type)}renderContainer(e){let r=this.ian?.cont;r&&(this.containerHTMLElement=new _l(this.rootContainer,r,e).render().getHTMLElement(),new yl().loadAllFonts(this.ian),this.ian.elems?.forEach(async n=>{await this.renderElement(this.containerHTMLElement,n,e)}),this.addEnterAnimation(this.ian.anim))}closeInApp(e){let r=this.ian.anim.getExitAnimation();this.sendTriggerClosed(e),t.ACTIVE_TRIGGER_DATA=void 0;let n=this.containerHTMLElement.animate(r,{duration:500,easing:"ease-in-out"});n.onfinish=()=>{this.removeInApp(),window.removeEventListener("resize",this.resizeListener)}}screenResized(){this.removeInApp(),this.startRendering()}removeInApp(){let e=document.querySelector(`.${this.triggerContext.rootClassName}`);e&&e.parentElement.removeChild(e)}skipTrigger(e,r){let n=new Ce(P.EVENT_CAMPAIGN_REJECTED,r,e);this.eventAPIService.sendSilently(n)}async preloadImages(e){let r=e.ian;if(!r)return;let n=[];r.elems.forEach(i=>{let o=i.bg?.img?.src;if(o&&n.push(this.getPromise(o)),i.t===1){let s=i.src;if(!s)return;n.push(this.getPromise(s))}}),r.bg?.img?.src&&n.push(this.getPromise(r.bg.img.src)),r.cont.bg?.img?.src&&n.push(this.getPromise(r.cont.bg.img.src)),await Promise.all(n)}getPromise(e){return new Promise(r=>{let n=new Image;n.onload=r,n.src=e,n.style.display="none"})}};var xl=class{triggerData;eventAPIService=Ue.getInstance();backendAPIService=Pt.getInstance();render(e){e.contentSource===Bo.KLAVIYO&&(this.triggerData=e,window.addEventListener("klaviyoForms",this.handleKlaviyoEvents.bind(this)),window._klOnsite=window._klOnsite||[],window._klOnsite.push(["openForm",e.klaviyoFormID]))}handleKlaviyoEvents(e){if(e.type!=="klaviyoForms")return;let r=e.detail;if(r.formId!==this.triggerData.klaviyoFormID){b.warn("Received invalid trigger callback");return}switch(r.type){case"open":this.eventAPIService.sendSilently(new Ce(P.EVENT_TRIGGER_DISPLAYED,{form:{id:r.formId}},this.triggerData));break;case"stepSubmit":{let n=this.getFormDetails(r);this.eventAPIService.sendSilently(new Ce(P.EVENT_FORM_SUBMITTED,{form:n},this.triggerData)),this.backendAPIService.updateProfileSafe(n);break}case"close":window.removeEventListener("klaviyoForms",this.handleKlaviyoEvents.bind(this)),this.eventAPIService.sendSilently(new Ce(P.EVENT_TRIGGER_CLOSED,{form:{id:r.formId}},this.triggerData));break}}getFormDetails(e){let r={id:e.formId},n=e.metaData;if(rr.hasKeys(n)){let i=["email","phone_number","first_name","last_name","$email","$phone_number","$first_name","$last_name"];Object.keys(n).forEach(a=>{i.includes(a)||(r[a]=n[a])}),r.email=n.$email??n.email,r.mobile=n.$phone_number??n.phone_number;let o=n.$first_name??n.first_name,s=n.$last_name??n.last_name;(o?.length||s?.length)&&(r.name=o+" "+s)}return r}};var Cl=class{static trackIntent(e){if(!this.isInstalled()){b.verbose("Facebook pixel not installed");return}if(!Je.get().pixelPush){b.verbose("Facebook pixel push not enabled");return}let n=di[e.intent]?.toLowerCase(),i=e.segmentName;!n&&!i||(b.verbose(`Sending ${n} intent and ${i} segment to Facebook Pixel`),window.fbq("trackCustom","CooeeIntent",{intent_value:n,segment_value:e.segmentName}))}static isInstalled(){return window.fbq&&typeof window.fbq=="function"}};var Ue=class t extends kn{static INSTANCE;constructor(){super()}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}sendSafe(e){b.verbose(`Waiting for auth to send event ${e.name}`),pr(Rt.replaySubject).then(()=>this.sendSilently(e))}sendSilently(e){this.send(e).catch(r=>b.error(`Failed to send ${e.name}`,r))}async send(e){if(b.verbose(`Sending event: ${e.name}`,e),this.shouldReject(e)){b.warn(`Rejecting event ${e.name}`);return}this.addShopifyAttributes();let r=await this.getAllContext();Object.assign(e,r),e.name!==P.EVENT_APP_BACKGROUND&&this.runtimeData.setActive(),this.backendAPIService.post("/v1/event/track",e).then(async n=>{b.info("\u2705 Event tracked:",this.userFriendlyName(e.name)),this.processEventResponse(e,n.data)}).catch(n=>{b.error(`Error sending event ${e.name} to server`,n)})}userFriendlyName(e){return e.replace("CE ","").replace("Trigger","Engagement").replace("Screen","Page").replace("App ","")}shouldReject(e){return e.trigger?.triggerID==="test"||e.trigger?.triggerID==="preview"?(b.warn("Not sending event as this is a test trigger"),!0):!1}processEventResponse(e,r){this.renderWidgetIfAny(e,r).catch(n=>{Te(n,"process-popup-response",{extra:{event:e,response:r}})}),this.utiliseIntentIfCalculated(r)}async renderWidgetIfAny(e,r){if(!r.triggerData)return;let n=new Ct(r.triggerData);n.occurred=e.occurred,b.log(`${n} will be shown`);let i;try{i=await bo.refreshItems(n)}catch(o){b.error("Failed to refresh the products",o);return}if(n.items=i,n.contentSource===Bo.KLAVIYO){new xl().render(n);return}new Fn().renderEngagement(n).catch(o=>{Te(o,"render-popup",{extra:{event:e},engagementTrigger:n})})}utiliseIntentIfCalculated(e){e.intent&&(_o.trackIntent(e.intent),Cl.trackIntent(e),b.info(`Intent is ${di[e.intent]}`))}addShopifyAttributes(){we.getCurrent().addCooeeAttributes().catch(e=>{b.error("Fail to add attributes in cart",e)})}};var qr=class{constructor(e){this.triggerContext=e}backendAPIService=Pt.getInstance();eventAPIService=Ue.getInstance();async execute(e){let r=de.get().getCurrentItem(),n=e.clickAction;if(!n)return;let i=e.item,o=this.triggerContext,s=o.triggerData,a=new Un,c=o.triggerData.redirectBehaviour,p=!!o.triggerData.discount?.type&&!!n?.applyDiscount,d={selectedVariants:o.triggerData.nonMutableItems.map(O=>({itemMID:O.mID,mID:O.selectedOrFirstVariant.value.mID,variantID:O.selectedOrFirstVariant.value.mID})),eID:o.triggerData.engagementID,cID:o.triggerData.contentID},f="",E=[],y=[];if(i?y=[i.toEmbed()]:e.embeddedItem&&(y=[e.embeddedItem]),n.at===108){let O=o.selectedItems;if(y=e.embeddedItems??O.map(j=>j.toEmbed()),o.shouldGiveFBTDiscount||e.embeddedItems?.length){let j;e.embeddedItems?j=e.embeddedItems.map(z=>({itemMID:z.mID,mID:z.vID,variantID:z.vID,quantity:z.quantity})):j=O.map(z=>({itemMID:z.mID,mID:z.selectedOrFirstVariant.value.mID,variantID:z.selectedOrFirstVariant.value.mID}));let B=o.triggerData.bundleFrom;o.triggerData.isBundleOnCartDrawer()&&B&&(j.push({itemMID:B.mID,mID:B.selectedOrFirstVariant.value.mID,isPrimary:!0}),y.unshift(B.toEmbed())),d.selectedVariants=j,o.triggerData.isBundleOnPDP()&&d.selectedVariants.forEach(z=>{z.mID===r.vID&&(z.isPrimary=!0)})}else d=void 0;E=e.embeddedItems??O}else if(n.at===107){let O=await we.getCurrent().getNormalisedCart();y=O.items,d.selectedVariants=O.items.map(j=>({itemMID:j.mID,mID:j.vID}))}else if(n.at===102)E=i?[i]:[e.embeddedItem];else if(n.at===101)f=i?Wi("/products/"+i.slug):e.embeddedItem?.link;else if(n.at===4){let O=Ka(n.gu?.u);O&&(f=O.href)}else if(n.at===109){let O=await a.upgradeToSubscription(i,o.triggerData);this.triggerContext.triggerData.skipSubscribedItems&&this.triggerContext.renderer.destroy(),nt.get().refreshUI(O)}else if(n.at===104){let O=this.triggerContext.triggerData.collections?.[0];O&&(f="collections/"+O.handle)}if(this.sendTriggerClicked(y,{from:"button"},e.video),f=im(f,s),b.verbose({redirectPath:f,redirectBehaviour:c,hasDiscount:p}),!p&&f){location.href=f;return}let S,D=!1;try{S=await this.getOrGenerateDiscountCode(d),b.verbose("Discount code (if any) to apply",S)}catch(O){if(!this.triggerContext.triggerData.isBYOB()){Sy.default.error("Unable to get a discount code",O);return}}if(S&&n.at===103)await a.copyDiscountCode(S);else if(n.at===110){let O=await a.createNewCart(r,S,o.triggerData);O&&(location.href=O);return}try{S&&await zr.applyWithStorefront([S])}catch(O){b.error(O),D=!0}let k;if(E?.length&&(k=await a.addToCart(E,o.triggerData)),D&&S){zr.navigate(S,c,f);return}if(f){location.href=f;return}zr.navigateWithoutDiscount(c,k)}sendTriggerClicked(e,r,n){let i=new Ce(P.EVENT_TRIGGER_CLICKED,r,this.triggerContext.triggerData);i.items=e,n?.id&&(i.videos=[n.id]),this.eventAPIService.sendSilently(i)}async getOrGenerateDiscountCode(e){let r=this.triggerContext.triggerData.discount;if(!r?.type)return;let n="";if(r.type===er.STATIC){if(!r.code)throw eh("No discount code found","warning",{triggerContext:this.triggerContext}),new Error("No discount code found");return r.code}if(e){if(n=await this.generateDiscount(e),!n)throw b.error("No discount code found",e),new Error("Discount code not found or generated");return n}}async generateDiscount(e){try{return(await this.backendAPIService.generateDiscount(e)).data.code}catch(r){throw br("Failed to generate a discount code"),Te(r,"backend-generate-discount",{triggerContext:this.triggerContext}),r}}};var Rl=class{eventAPIService;modifications=[];constructor(){this.eventAPIService=ge.get(Hn)}execute(e){for(let r of e){if(!r.experimentConfig)continue;this.executeExperiment(r)&&this.trackExperimentRan(r)}if(document.querySelector("#lc-hide-body")?.remove(),!document.body){Ra("No body element found","error");return}this.setupMutationObserver()}executeExperiment(e){let r=e.experimentConfig?.modifications;return r?.length?r.some(n=>{if(!n.cssSelector)return b.verbose("No CSS Selector available",e?.toString()),!1;this.modifications.push(n);let i=Array.from(document.querySelectorAll(n.cssSelector));return i?.length?(this.executeSingleModification(n,i),!0):!1}):(b.log("Nothing to experiment",e.toString()),!0)}executeSingleModification(e,r){if(r?.length)for(let n of r)Object.assign(n.style,e.style),e.type==="TEXT"&&e.text?n.innerHTML=e.text:e.type==="IMAGE"&&this.updateImage(e,n)}trackExperimentRan(e){if(e.id==="preview"){b.warn("Skipping experiment attribution as its preview",e.toString());return}this.eventAPIService.trackExperiment({name:P.EVENT_EXPERIMENT_START,experiment:new An(e)}).catch(r=>{b.error("Fail to track experiment",r)})}setupMutationObserver(){new MutationObserver(r=>{r.forEach(n=>{n.addedNodes.forEach(i=>{i instanceof HTMLElement&&this.modifications.forEach(o=>{i.matches&&i.matches(o.cssSelector)?(b.verbose("Re-applying experiment",o.toString()),this.executeSingleModification(o,[i])):i.querySelectorAll&&(b.verbose("Re-applying experiment",o.toString()),this.executeSingleModification(o,Array.from(i.querySelectorAll(o.cssSelector))))})})})}).observe(document.body,{childList:!0,subtree:!0})}updateImage(e,r){let n=e.image?.lg?.src,i=e.image?.sm?.src;!n&&!i||(r instanceof HTMLPictureElement?this.updatePictureElement({desktop:n,mobile:i},r):this.updateImageElement({desktop:n,mobile:i},r))}updateImageElement(e,r){Tr()&&e.mobile?(r.setAttribute("src",e.mobile),r.removeAttribute("srcset")):e.desktop&&(r.setAttribute("src",e.desktop),r.removeAttribute("srcset"))}updatePictureElement(e,r){if(r.innerHTML="",e.mobile){let i=document.createElement("source");i.srcset=e.mobile,i.media="(max-width: 767px)",r.append(i)}if(e.desktop){let i=document.createElement("source");i.srcset=e.desktop,i.media="(min-width: 768px)",r.append(i)}let n=document.createElement("img");n.src=e.desktop??e.mobile??"",r.append(n)}};var Hn=class t extends kn{static INSTANCE;constructor(){super()}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}fetchExperimentsSilently(){this.fetchExperimentsSafe().catch(e=>Te(e,"fetch-experiments"))}async trackExperiment(e){let r=await this.getAllContext(),n=_(_({},e),r);await this.backendAPIService.post("/v1/event/experiment",n)}async fetchExperimentsSafe(){if(!this.runtimeData.activeExperiments)return;!!await Be.get(pe.SDK_TOKEN)?await this.fetchExperiments():(await pr(Rt.replaySubject),await this.fetchExperiments())}async fetchExperiments(){b.info("Fetch experiments after \u23F0",de.get().getJSLoadTimeDiff()+" of DOM load");let e=await this.getAllContext(),r=_({},e);this.backendAPIService.post("/v1/engagement/experiments",r).then(async n=>{b.info(`Experiments fetched in \u23F0 ${Jr(n.timeTakenMs)}`);let i=n.data.experiments.map(o=>new Ct(o));new Rl().execute(i)}).catch(n=>{b.error("Error sending experiment getter",n)})}};var Al=class{runtimeData=de.get();widgetAPIService=ge.get(xr);experimentAPIService=ge.get(Hn);meddle(){let e=ke.globalRef;e.account=e.account??[],e.profile=e.profile??[],e.events=e.events??[],e.page=e.page??[],this.meddlePage(),this.meddleAccount(),this.meddleEvents(),this.meddleProfile(),this.exposeMethods()}exposeMethods(){let e=ke.globalRef;e.loadPageWidgets=()=>{this.widgetAPIService.loadPageWidgetsSilently()},e.loadCartWidgets=()=>{this.widgetAPIService.loadCartWidgetsSilently()},e.loadExperiments=()=>{this.experimentAPIService.fetchExperimentsSilently()},e.testCartUpdate=this.testCartUpdate.bind(this),e.previewWidget=ke.previewWidget.bind(ke),e.previewPopup=ke.previewPopup.bind(ke)}overwritePush(e,r){Sn(e,"push",r)}meddleAccount(){this.overwritePush(ke.globalRef.account,(...e)=>{this.processAccount(e[0])}),ke.globalRef.account.forEach(this.processAccount.bind(this))}meddleEvents(){this.overwritePush(ke.globalRef.events,(...e)=>{this.processEvent(e[0])}),ke.globalRef.events.forEach(this.processEvent.bind(this))}meddleProfile(){this.overwritePush(ke.globalRef.profile,(...e)=>{this.processProfile(e[0])}),ke.globalRef.profile.forEach(this.processProfile.bind(this))}processAccount(e){e&&(e.appID&&ke.authenticate(e),e.flags&&hi.setFlags(e.flags))}processEvent(e){e&&(P.JS_LOAD_WHITELIST_EVENTS.includes(e[0])?ke.sendEvent(e[0],e[1],_({occurred:this.runtimeData.jsLoadTime},e[2])):ke.sendEvent(e[0],e[1],e[2]))}processProfile(e){e&&ke.updateProfile(e)}processPageName(e){e&&ke.setPageName(e)}meddlePage(){this.overwritePush(ke.globalRef.page,(...e)=>{this.processPage(e[0])}),ke.globalRef.page.forEach(this.processPage.bind(this))}processPage(e){e.currentItem&&this.runtimeData.setCurrentItem(e.currentItem),e.currency&&(this.runtimeData.currencyCode=e.currency),e.shopCurrency&&(this.runtimeData.shopCurrencyCode=e.shopCurrency),e.moneyFormat&&(this.runtimeData.moneyFormat=e.moneyFormat),e.jsLoad&&(this.runtimeData.jsLoadTime=e.jsLoad),e.locale&&(this.runtimeData.locale=e.locale),e.pageName&&ke.setPageName(e.pageName),e.activeExperiment&&(this.runtimeData.activeExperiments=e.activeExperiment),e.customContext&&(this.runtimeData.customContext=_(_({},this.runtimeData.customContext),e.customContext))}async testCartUpdate(){if(this.runtimeData.pageName!=="product"){window.alert("This feature is only available on a product page");return}let e=window.ShopifyAnalytics?.meta??{},r=e.selectedVariantId;if(r||(e.product?.variants?.length>0&&(r=e.product.variants[0].id),r||(r=this.runtimeData.getCurrentItem()?.vID)),!r){window.alert("Could not find a variant to test. Please try a different product page");return}let n=new Ct({id:"preview",shortID:"1",redirectBehaviour:tr.CART_DRAWER});await new qr(new Rr(new Date,n)).execute({clickAction:{at:102},embeddedItem:new Dt({vID:r})})}};var xo=class{static SESSION_STORAGE=window.sessionStorage;static SESSION_STORAGE_KEY_PREFIX=P.COOEE.concat("-");static getString(e,r){return this.getItem(e)||r}static setString(e,r){this.setItem(e,r)}static remove(e){this.removeItem(e)}static getItem(e){return this.SESSION_STORAGE.getItem(this.SESSION_STORAGE_KEY_PREFIX.concat(e))}static setItem(e,r){this.SESSION_STORAGE.setItem(this.SESSION_STORAGE_KEY_PREFIX.concat(e),r)}static removeItem(e){this.SESSION_STORAGE.removeItem(this.SESSION_STORAGE_KEY_PREFIX.concat(e))}};var Co=class t{static INSTANCE;static DEBOUNCE_TIME=1e3;static THRESHOLD=10;lastPercent=0;_lastScreenOrScroll=new Date;constructor(){}set lastScreenOrScroll(e){this._lastScreenOrScroll=e}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}resetScrollID(e){xo.remove(P.SESSION_STORAGE_SCROLL_ID),this.lastScreenOrScroll=e??new Date}listen(){if(window.scrollY){let e=this.getPercentScrolledY();this.shouldSendScroll(e)&&this.sendScroll(e)}Ui(()=>{this.observeWindowScroll()})}observeWindowScroll(){pi(window,"scroll").pipe(Sr(t.DEBOUNCE_TIME),un(()=>{let e=this.getPercentScrolledY();if(e>100){b.warn("Received scroll percent is more than 100",e);return}if(this.shouldSendScroll(e))return e})).subscribe(e=>{this.sendScroll(e)})}shouldSendScroll(e){return Math.abs(this.lastPercent-e)>=t.THRESHOLD||this.lastPercent!==e&&e===100}sendScroll(e){if(e==null)return;let r={percent:e,timeMS:new Date().getTime()-this._lastScreenOrScroll.getTime()};this.lastPercent=e;let n=xo.getString(P.SESSION_STORAGE_SCROLL_ID,""),i=new Ce(P.EVENT_SCROLL,r,null,n);ge.get(Ue).sendSafe(i),xo.setString(P.SESSION_STORAGE_SCROLL_ID,i.id.toHexString()),this._lastScreenOrScroll=new Date(i.occurred)}getPercentScrolledY(){let e=window.document.body.scrollHeight,r=window.innerHeight;return Math.ceil((window.scrollY+r)/e*100)}};var Dl=class t{static ACTIVE_DURATION="aDur";static INACTIVE_DURATION="iaDur";runtimeData=de.get();listen(){document.onvisibilitychange=()=>{document.visibilityState==="visible"?this.onVisible():document.visibilityState==="hidden"&&this.onHidden()}}async onVisible(){}async onHidden(){let e=await this.runtimeData.setInactive();if(e===0){b.info("Not sending background event as user was inactive on website");return}b.info(`Sending background event with ${e} seconds`);let r={};r[t.ACTIVE_DURATION]=e,ge.get(Ue).sendSafe(new Ce(P.EVENT_APP_BACKGROUND,r))}};var Nl=class{compareCartItemSubject=new $t;constructor(){this.compareCartItemSubject.pipe(Sr(100)).subscribe(this.compareCartItems.bind(this))}listen(){this.compareCartItemSubject.next(),this.overwriteXMLHttpRequest(),this.overwriteFetchMethod()}overwriteXMLHttpRequest(){let e=this,r=window.XMLHttpRequest.prototype.send;window.XMLHttpRequest.prototype.send=function(){return this.addEventListener("load",function(){e.performEvent(this._url).catch(n=>b.error("Unable to process cart change in XMLHttpRequest",n))}),r.apply(this,arguments)},b.verbose("Securely overwritten window.XMLHttpRequest.send method")}overwriteFetchMethod(){let e=this,r=window.fetch;window.fetch=function(n){return r.apply(window,arguments).then(i=>(e.performEvent(n.toString()).catch(o=>b.error("Unable to process cart change in fetch",o)),i))},b.verbose("Securely overwritten window.fetch method")}async performEvent(e){this.isCartManipulationURL(e)&&(de.get().isCartDirty=!0,this.compareCartItemSubject.next())}isCartManipulationURL(e){return/\/cart\/(add|change|update|clear)/.test(e)}sendChangesAsEvents(e,r){let n=e?.items,i=r.items,o=[],s=[];if(b.verbose(`Comparing cart change with old count ${n?.length} to new count ${i.length}`),i?.forEach(a=>{let c=n?.find(p=>p.vID===a.vID);if(c){if(c.quantity!==a.quantity){let p=c.quantity<a.quantity,d=Math.abs(c.quantity-a.quantity),f=ee(_({},a),{quantity:d});p?o.push(f):s.push(f)}n&&ih(n,c)}else o.push(a)}),n)for(let a of n)s.push(a);b.verbose(`Cart delta: added: ${o.length}, removed: ${s.length}`),o.length&&this.sendEvent(P.EVENT_ADD_TO_CART,{items:o}),s.length&&e.token===r.token&&this.sendEvent(P.EVENT_REMOVE_FROM_CART,{items:s}),(s.length||o.length)&&window.CooeeSDK.cartChanged$.next({itemsAdded:o,itemsRemoved:s})}sendEvent(e,r){let n=new Ce(e,r);ge.get(Ue).sendSafe(n)}async compareCartItems(){let e=await Be.get(pe.CURRENT_CART,{}),r=await we.getCurrent().getNormalisedCart(!0);this.sendChangesAsEvents(e,r)}};var Ol=class{listen(){return this.overwriteFetchMethod(),this}overwriteFetchMethod(){let e=this,r=window.fetch;window.fetch=async function(n,i){try{await e.modifyRequest(n,i)}catch(o){Te(o,"modify-graphql-request",{extra:{body:JSON.stringify(i?.body)}})}return r(n,i)},b.verbose("Securely overwritten window.fetch method for graphql query")}async modifyRequest(e,r){let n=typeof e=="string"?e:e instanceof Request?e.url:"";if(!(n.includes("graphql.json")&&r?.method==="POST")||!r.body)return;let i;if(typeof r.body=="string")try{i=JSON.parse(r.body)}catch{return}else i=r.body;i?.variables?.input&&(b.verbose("Intercepted fetch request of:",n),i?.query.includes("cartCreate")&&(r.body=await this.updatedBody(i),this.sendBuyNowEvent()))}async updatedBody(e){let r=e.variables.input.attributes??[],n=await Xa();return e.variables.input.attributes=[...r,...n],JSON.stringify(e)}sendBuyNowEvent(){let e=de.get().getCurrentItem();if(!e)return;let r=new Ce(P.EVENT_BUY_NOW_CLICKED,{items:[e]});ge.get(Ue).sendSafe(r)}};var Ro=class{constructor(e,r){this.selectors=e;this.eventName=r;this.selectorString=e.join(",")}static INSTANCE;elements;selectorString;clickListenerCallback=e=>{let r=e.currentTarget,n=new Ce(this.eventName,{class:r.className||void 0,tagName:r.tagName||void 0,id:r.id||void 0});ge.get(Ue).sendSafe(n),this.removeClickListener(this.clickListenerCallback)};listenSilently(){this.listen().catch(e=>b.error(e))}async listen(){this.elements=await Tp(this.selectorString),this.elements.forEach(e=>{e.addEventListener("click",this.clickListenerCallback)})}removeClickListener(e){this.elements?.forEach(r=>{r.removeEventListener("click",e)})}};var Pl=class t extends Ro{static selectors=[".product__thumbnail-list-inner > button","product-gallery-navigation > button",".product-media--thumb-container",".product-images-inner > img",".m-product-media",".swiper-button-control",".media__thumb",".slick-arrow",".productView-img-container.product-single__media",".product-gallery__thumbnail_item_inner"];constructor(){super(t.selectors,P.EVENT_ITEM_THUMBNAIL_CLICKED)}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}};var Ll=class t extends Ro{static selectors=[".jdgm-widget.jdgm-preview-badge.jdgm-preview-badge--with-link.jdgm--done-setup","reviewsio-product-ratings",".ruk_rating_snippet.tracked:not(.hidden)","a > .loox-rating",".yotpo-reviews-star-ratings-widget",".yotpo.lp-hero__reviews",".pr-rating > a",".rivyoReviewWidget"];constructor(){super(t.selectors,P.EVENT_REVIEW_CLICKED)}static getInstance(){return this.INSTANCE||(this.INSTANCE=new t),this.INSTANCE}};var Ml=class{selector=[".gokwik-checkout button","button.cart__checkout-button","button.cart__checkout","button#checkout","button#checkout2",'button[id*="checkout" i]','button[name*="checkout" i]','button[class*="checkout" i]'].join(",");listen(){Ui(()=>{b.verbose("Execution order:","document ready"),this.useLocationHash()})}useLocationHash(){let e=window.location.hash?.substring(1);if(e)if(e.includes(P.HASH_INITIATE_CHECKOUT)){document.dispatchEvent(new Event(P.THIRD_PARTY_CHECKOUT_EVENT));let r=document.querySelector(this.selector);if(!r){b.verbose("No clickable cart checkout button found");return}b.verbose("Clickable cart checkout button found",r),r.click()}else e.includes(P.HASH_OPEN_CART_DRAWER)&&nt.get().open()}};var Ks=class{static attachCheckoutListener(){window.gokwikSdk&&window.gokwikSdk.on("checkout_initiated",async()=>{let e=await we.getCurrent().getNormalisedCart(),r={via:"GoKwik",items:e.items,cartToken:e.token,amount:{value:e.amount,currency:e.currency}},n=new Ce(P.EVENT_CHECKOUT_STARTED,r);ge.get(Ue).sendSafe(n)})}};var Bl=class{static watch(){let e=ql();(e==="1"||e==="on")&&Pt.getInstance().updateDevicePropsSafe({debugTill:this.getDebugMillis()}),e==="on"?sessionStorage.cooeeDebug="1":e==="off"&&sessionStorage.removeItem("cooeeDebug"),sessionStorage.cooeeDebug&&this.renderDebugBar()}static renderDebugBar(){let e=document.createElement("cooee-debugger");e.logs=this.logs,Ui(()=>{document.body.appendChild(e)})}static getDebugMillis(){return new Date().getTime()+6*60*60*1e3}};var Ul=class{async migrate(){}};var ke=class{static globalRef;static authenticated;static async initForMerchantWebsiteOnly(){window.cooeeSDKPreview||(this.initGlobalReference(),await new Ul().migrate(),this.autoAuthenticate(),new Al().meddle(),om(),ge.get(Hn).fetchExperimentsSilently(),new Dl().listen(),new Nl().listen(),new Ol().listen(),new Ml().listen(),ge.get(Co).listen(),ge.get(Ll).listenSilently(),ge.get(Pl).listenSilently(),ge.get(xr).loadPageWidgetsSilently(),this.attachGoKwikListeners(),this.setupPreviewListeners(),Bl.watch())}static async initForAll(){this.injectWidgetAssets()}static initGlobalReference(){window.CooeeSDK||Sn(window,"CooeeSDK",{}),this.globalRef=window.CooeeSDK,Sn(this.globalRef,"config",new Je),Sn(this.globalRef,"runtimeData",new de),Sn(this.globalRef,"uaParser",new Yr),Sn(this.globalRef,"cartChanged$",new $t),b.verbose("Global reference initialised")}static injectWidgetAssets(){bt.injectScriptURL(Ht.widgetURL,"cooee-widget-sdk"),bt.injectStylesheet(Ht.styleURL)}static autoAuthenticate(){let e=jh();e&&this.authenticate({shopifyShop:e})}static authenticate(e){if(this.authenticated)return;b.info("Begin auth after \u23F0",de.get().getJSLoadTimeDiff(),"of DOM load");let r=e.appID?.trim(),n=e.shopifyShop;if((Sp(r)||r.length!==24)&&Sp(n)){b.warn("Cooee App ID or Shop name is not configured");return}this.authenticated=!0,ge.get(Rt).init(e)}static sendEvent(e,r,n){let i=new Ce(e,r,n?.triggerData);n?.occurred&&(i.occurred=n.occurred),ge.get(Ue).sendSafe(i)}static updateProfile(e){for(let r in e)if(r.toLowerCase().startsWith("ce "))throw new Error("User property name cannot start with 'CE '");ge.get(Pt).updateProfileSafe(e)}static setPageName(e){if(!e)return;let r=de.get(),n=r.pageName;if(e===n)return;if(r.pageName=e,e==="cart"&&ge.get(xr).loadOrRenderWidgetsAfterCartChange(),P.BLACKLISTED_PAGE_NAMES.some(s=>e.includes(s))){ge.get(Co).resetScrollID();return}let i={};n&&(i.ps=n);let o=new Ce(P.EVENT_SCREEN_VIEW,i);o.occurred=r.jsLoadTime,ge.get(Ue).sendSafe(o),ge.get(Co).resetScrollID(o.occurred)}static previewPopup(e,r){new Fn(r).render(e)}static previewWidget(e){new At(new Ct(e)).renderSilently()}static setupPreviewListeners(){if(window.opener){try{window.opener.postMessage({action:"COOEE_READY_FOR_PREVIEW"},"*")}catch(e){b.error(e)}window.addEventListener("message",e=>{if(b.verbose("Received event",e),!e.origin.includes("letscooee.com")&&!e.origin.includes("localhost"))return;let r=e.data;typeof r=="object"&&(r.action==="POPUP_PREVIEW"?(this.previewPopup(r.engagementTrigger),e.source?.postMessage({action:"PREVIEW_SUCCESSFUL"},e.origin)):r.action==="WIDGET_PREVIEW"&&(this.previewWidget(r.engagementTrigger),e.source?.postMessage({action:"PREVIEW_SUCCESSFUL"},e.origin)))})}}static attachGoKwikListeners(){let e=de.get();window.addEventListener("kp-modal:opened",()=>{e.isGoKwikPopupOpen=!0}),window.addEventListener("user-loggedin",r=>{let{token:n}=r.detail;n&&this.updateProfile({goKwikToken:n})}),window.gokwikSdk?Ks.attachCheckoutListener():window.addEventListener("gokwikLoaded",Ks.attachCheckoutListener)}};tm();rm();b.verbose("Execution order:","top");window.cooeeShopifyScriptLoaded||(window.cooeeShopifyScriptLoaded=!0,(async()=>(b.verbose("Execution order:","IIFE start"),await ke.initForMerchantWebsiteOnly(),await ke.initForAll(),b.verbose("Execution order:","IIFE end")))());b.verbose("Execution order:","bottom");