@xenia-martech/sdk-js 1.0.0-dev.25 → 1.0.0-dev.26

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.
Files changed (36) hide show
  1. package/README.md +10 -44
  2. package/dist/{actions-DfuHrjUL.d.cts → actions-DFLoSXO_.d.cts} +8 -6
  3. package/dist/{actions-DfuHrjUL.d.ts → actions-DFLoSXO_.d.ts} +8 -6
  4. package/dist/{chunk-JEFNAD5J.cjs → chunk-3KYKKIIG.cjs} +4 -3
  5. package/dist/chunk-3KYKKIIG.cjs.map +1 -0
  6. package/dist/{chunk-PTYUK4P3.js → chunk-D37RD3UC.js} +4 -3
  7. package/dist/chunk-D37RD3UC.js.map +1 -0
  8. package/dist/client/index.cjs +2 -1
  9. package/dist/client/index.cjs.map +1 -1
  10. package/dist/client/index.d.cts +2 -2
  11. package/dist/client/index.d.ts +2 -2
  12. package/dist/client/index.js +2 -1
  13. package/dist/client/index.js.map +1 -1
  14. package/dist/client/react/index.cjs +2 -1
  15. package/dist/client/react/index.cjs.map +1 -1
  16. package/dist/client/react/index.d.cts +3 -3
  17. package/dist/client/react/index.d.ts +3 -3
  18. package/dist/client/react/index.js +2 -1
  19. package/dist/client/react/index.js.map +1 -1
  20. package/dist/{cookie-names-BQ-L04A8.d.cts → cookie-names-LgNDAreS.d.cts} +8 -6
  21. package/dist/{cookie-names-BQ-L04A8.d.ts → cookie-names-LgNDAreS.d.ts} +8 -6
  22. package/dist/index.cjs +19 -19
  23. package/dist/index.d.cts +4 -3
  24. package/dist/index.d.ts +4 -3
  25. package/dist/index.js +1 -1
  26. package/dist/server/index.cjs +12 -12
  27. package/dist/server/index.cjs.map +1 -1
  28. package/dist/server/index.d.cts +8 -5
  29. package/dist/server/index.d.ts +8 -5
  30. package/dist/server/index.js +2 -2
  31. package/dist/server/index.js.map +1 -1
  32. package/dist/xenia-sdk.iife.js +3 -3
  33. package/dist/xenia-sdk.iife.js.map +1 -1
  34. package/package.json +1 -1
  35. package/dist/chunk-JEFNAD5J.cjs.map +0 -1
  36. package/dist/chunk-PTYUK4P3.js.map +0 -1
@@ -1,5 +1,5 @@
1
- var Xenia=(function(exports){'use strict';var G=new Set(["banner","popup","modal","inline"]),Y=new Set(["top-left","top-right","bottom-left","bottom-right","top","bottom"]),Z=new Set(["swap","hide","show","setContent","redirect",...G]);function V(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function d(n){return typeof n=="string"?n:void 0}function ee(n){return typeof n=="number"?n:void 0}function te(n){if(!V(n))return null;let e=d(n.type);if(!e||!Z.has(e))return null;if(e==="redirect"){let i=d(n.url);return i?{type:e,url:i}:null}if(e==="hide"||e==="show"){let i=d(n.target);return i?{type:e,target:i}:null}if(e==="swap"||e==="setContent"){let i=d(n.target);return i?{type:e,target:i,html:d(n.html),text:d(n.text)}:null}let t=V(n.cta)?{label:d(n.cta.label)??"",url:d(n.cta.url),event:d(n.cta.event)}:void 0;return {type:e,target:d(n.target),title:d(n.title),message:d(n.message),imageUrl:d(n.imageUrl),html:d(n.html),cta:t&&t.label?t:void 0,dismissAfterMs:ee(n.dismissAfterMs),position:ne(n.position)}}function ne(n){let e=d(n);return e&&Y.has(e)?e:void 0}function z(n){let e;if(Array.isArray(n)?e=n:V(n)&&Array.isArray(n.xeniaActions)&&(e=n.xeniaActions),!Array.isArray(e))return [];let t=[];for(let i of e){let s=te(i);s&&t.push(s);}return t}function x(){return typeof window<"u"&&typeof document<"u"}function ie(n,e){if(!e||Object.keys(e).length===0)return n;let t=new URLSearchParams(e),i=n.includes("?")?"&":"?";return `${n}${i}${t.toString()}`}function _(n){return new Promise(e=>setTimeout(e,n))}var m=class extends Error{constructor(t,i,s){super(s??`Request failed with status ${t}`);this.status=t;this.data=i;this.name="HttpError";}status;data},b=class{baseUrl;defaultHeaders;timeout;retry;debug;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.defaultHeaders=e.defaultHeaders??{},this.timeout=e.timeout??8e3,this.retry={attempts:e.retry?.attempts??2,baseDelayMs:e.retry?.baseDelayMs??300},this.debug=e.debug??false;}async request(e){let t=ie(this.baseUrl+e.path,e.query),i=e.method??"GET",s={"Content-Type":"application/json",...this.defaultHeaders,...e.headers},r=e.body!==void 0?JSON.stringify(e.body):void 0,o=e.timeout??this.timeout,a=e.noRetry?1:(e.retry?.attempts??this.retry.attempts)+1,l=e.retry?.baseDelayMs??this.retry.baseDelayMs,P;for(let h=0;h<a;h++)try{let u=await this.fetchWithTimeout(t,{method:i,headers:s,body:r,...e.keepalive?{keepalive:!0}:{}},o),f=await this.parseBody(u);if(u.ok)return {response:u,data:f};if(this.isRetryableStatus(u.status)&&h<a-1){let D=this.retryAfterMs(u,l,h);this.log(`retrying ${e.path} after ${D}ms (status ${u.status})`),await _(D);continue}throw new m(u.status,f)}catch(u){if(P=u,u instanceof m)throw u;if(h<a-1){let f=l*2**h;this.log(`retrying ${e.path} after ${f}ms (network error)`),await _(f);continue}}throw P instanceof Error?P:new Error("Request failed")}async fetchWithTimeout(e,t,i){let s=new AbortController,r=setTimeout(()=>s.abort(),i);try{return await fetch(e,{...t,signal:s.signal})}catch(o){throw o instanceof Error&&o.name==="AbortError"?new Error(`Request timeout after ${i}ms`,{cause:o}):o}finally{clearTimeout(r);}}async parseBody(e){let t=await e.text().catch(()=>"");if(!t)return null;try{return JSON.parse(t)}catch{return t}}isRetryableStatus(e){return e===429||e>=500&&e<=599}retryAfterMs(e,t,i){let s=e.headers.get("Retry-After");if(s){let r=Number(s);if(!Number.isNaN(r))return r*1e3}return t*2**i}log(e){this.debug&&console.warn(`[xenia] ${e}`);}};function se(n){try{let e=n.split(".")[1];if(!e)return;let t=JSON.parse(atob(e.replace(/-/g,"+").replace(/_/g,"/")));return typeof t.exp=="number"?t.exp*1e3:void 0}catch{return}}var w=class{config;cached=null;inflight=null;constructor(e){this.config=e;}hasSource(){return !!(this.config.token||this.config.getToken)}getToken=async()=>{if(this.config.token&&!this.config.getToken)return this.config.token;let e=Date.now();if(this.cached&&this.cached.expiresAt>e)return this.cached.token;if(this.inflight)return this.inflight;if(!this.config.getToken)throw new Error("No token source: set config.token or config.getToken.");return this.inflight=Promise.resolve(this.config.getToken()).then(t=>{let i=se(t),s=i?i-3e4:e+5*6e4;return this.cached={token:t,expiresAt:s},t}).finally(()=>{this.inflight=null;}),this.inflight}};function J(n){let e={};for(let[t,i]of Object.entries(n))i!==void 0&&(e[t]=i);return e}var k=class{http;tenantId;environmentKey;tokenProvider;constructor(e){this.tenantId=e.tenantId,this.environmentKey=e.environmentKey,this.tokenProvider=new w(e),this.http=new b({baseUrl:e.baseUrl,defaultHeaders:e.headers,timeout:e.timeout,retry:e.retry,debug:e.debug});}tenantHeaders(){return {"X-Tenant-Id":this.tenantId,"X-Environment":this.environmentKey}}async authHeaders(){let e=this.tenantHeaders();if(!this.tokenProvider.hasSource())return e;let t=await this.tokenProvider.getToken();return t&&(e.Authorization=`Bearer ${t}`),e}async webhook(e,t,i="POST"){let{response:s,data:r}=await this.http.request({method:i,path:"/flow",query:{id:e},headers:await this.authHeaders(),body:i==="POST"?t??{}:void 0,noRetry:true});return {status:s.status,body:r,actions:z(r),receivedAt:Date.now()}}async sendEvents(e,t){let{data:i}=await this.http.request({method:"POST",path:"/api/events/v1",headers:await this.authHeaders(),body:{events:e},keepalive:t?.keepalive});return i}async identify(e){let{data:t}=await this.http.request({method:"POST",path:"/api/events/v1/identify",headers:await this.authHeaders(),body:e});return t}async consent(e,t){let{data:i}=await this.http.request({method:"POST",path:"/api/events/v1/consent",headers:await this.authHeaders(),body:J({xeniaVisitorId:e,analytics:t.analytics===true,marketing:t.marketing===true,personalization:t.personalization===true,consentSource:t.consentSource,consentVersion:t.consentVersion})});return i}async resolve(e,t={}){let{data:i}=await this.http.request({method:"POST",path:"/api/personalization/resolve",query:t.merge!==void 0?{merge:String(t.merge)}:void 0,headers:await this.authHeaders(),body:J({contentKey:e,data:t.data,locale:t.locale})});return i}async resolveBatch(e,t={}){let{data:i}=await this.http.request({method:"POST",path:"/api/personalization/resolve-batch",query:t.merge!==void 0?{merge:String(t.merge)}:void 0,headers:await this.authHeaders(),body:J({items:e,data:t.data,locale:t.locale})});return i}};var re=new Set(["eventId","eventType","journeyId","deviceId","visitorId","customerId","email","utmSource","utmMedium","utmCampaign","utmContent","utmId","url","referrer","path","query"]);function L(n){let e={};for(let[t,i]of Object.entries(n))i!==void 0&&(e[t]=i);return e}function j(n){let e={},t={};if(n.props)for(let[s,r]of Object.entries(n.props))r!==void 0&&(re.has(s)?t[s]=r:e[s]=r);return {...e,...t,...L(n.context??{}),...L(n.identity??{}),eventId:n.eventId,...n.eventType?{eventType:n.eventType}:{},...n.journeyId?{journeyId:n.journeyId}:{}}}var g="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function oe(n){let e=new Uint8Array(n);if(typeof crypto<"u"&&crypto.getRandomValues)crypto.getRandomValues(e);else for(let t=0;t<n;t++)e[t]=Math.floor(Math.random()*256);return e}function v(n=Date.now()){let e="",t=n;for(let r=9;r>=0;r--)e=g[t%32]+e,t=Math.floor(t/32);let i=oe(16),s="";for(let r=0;r<16;r++)s+=g[i[r]%32];return e+s}var H=26;function B(n){if(n.length<=H)return n;let e="";for(let i of [2166136261,16777619]){let s=i>>>0;for(let r=0;r<n.length;r++)s^=n.charCodeAt(r),s=Math.imul(s,16777619)>>>0,e+=g[s%32];}let t="";for(let i=0;i<H;i++){let s=i+1;for(let r=i;r<e.length;r+=H)s=s*31+g.indexOf(e[r])>>>0;t+=g[s%32];}return t}var I=class{map=new Map;set(e,t){this.map.set(e,t);}get(e){return this.map.get(e)}keys(){return [...this.map.keys()]}clear(){this.map.clear();}},S=class{nsKey;constructor(e="xenia"){this.nsKey=`${e}_responses`;}read(){try{let e=localStorage.getItem(this.nsKey);return e?JSON.parse(e):{}}catch{return {}}}write(e){try{localStorage.setItem(this.nsKey,JSON.stringify(e));}catch{}}set(e,t){let i=this.read();i[e]=t,this.write(i);}get(e){return this.read()[e]}keys(){return Object.keys(this.read())}clear(){try{localStorage.removeItem(this.nsKey);}catch{}}};var C=class{queue=[];send;batchSize;flushIntervalMs;maxQueueSize;debug;timer=null;flushing=false;listenersAttached=false;allowed=false;onPageHide=()=>this.flushOnUnload();onVisibilityChange=()=>{document.visibilityState==="hidden"&&this.flushOnUnload();};constructor(e){this.send=e.send,this.batchSize=e.batchSize??20,this.flushIntervalMs=e.flushIntervalMs??3e3,this.maxQueueSize=e.maxQueueSize??200,this.debug=e.debug??false;}start(){this.allowed=true,!(this.timer||typeof window>"u")&&(this.timer=setInterval(()=>{this.flush();},this.flushIntervalMs),window.addEventListener("pagehide",this.onPageHide),document.addEventListener("visibilitychange",this.onVisibilityChange),this.listenersAttached=true);}stop(){this.allowed=false,this.timer&&clearInterval(this.timer),this.timer=null,this.listenersAttached&&(window.removeEventListener("pagehide",this.onPageHide),document.removeEventListener("visibilitychange",this.onVisibilityChange),this.listenersAttached=false);}enqueue(e){this.queue.length>=this.maxQueueSize&&this.queue.shift(),this.queue.push(e),this.allowed&&this.queue.length>=this.batchSize&&this.flush();}async sendImmediate(e){try{await this.send([e],{keepalive:!0});}catch(t){this.isPermanentFailure(t)||this.requeue([e]),this.debug&&console.warn("[xenia] immediate send failed",t);}}async flush(){if(!this.allowed||this.flushing||this.queue.length===0)return;this.flushing=true;let e=this.queue.splice(0,this.batchSize);try{await this.send(e);}catch(t){this.isPermanentFailure(t)||this.requeue(e),this.debug&&console.warn("[xenia] analytics flush failed",t);}finally{this.flushing=false;}}isPermanentFailure(e){return e instanceof m&&e.status>=400&&e.status<500}flushOnUnload(){if(!this.allowed||this.queue.length===0)return;let e=this.queue.splice(0,this.queue.length);this.send(e,{keepalive:true}).catch(()=>{});}requeue(e){let t=this.maxQueueSize-this.queue.length;t<=0||this.queue.unshift(...e.slice(0,t));}};var ae=new Set(["click","view-port","page-load"]);function U(n){let e=n.indexOf("&");if(e===-1)return null;let t=n.slice(0,e),i=n.slice(e+1);return !t||!ae.has(i)?null:{eventId:t,interactionType:i}}function Q(n){let e=n.getAttribute("data-xenia-content-key");if(!e)return null;let t=n.getAttribute("data-xenia-content-entry-id"),i=n.getAttribute("data-xenia-base-entry-id"),s=n.getAttribute("data-xenia-personalized");return {contentKey:e,contentEntryId:t??void 0,baseEntryId:i??void 0,personalized:s==null?void 0:s==="true"}}var E=class{opts;throttleTimers=new Map;observers=new Map;slotObservers=new Map;triggered=new Set;slotImpressed=new Set;clickHandler=null;mutationObserver=null;constructor(e){this.opts=e;}start(){this.setupClicks(),this.scan(document),this.setupMutations();}stop(){this.clickHandler&&document.removeEventListener("click",this.clickHandler),this.clickHandler=null,this.mutationObserver?.disconnect(),this.mutationObserver=null,this.observers.forEach(e=>e.disconnect()),this.observers.clear(),this.slotObservers.forEach(e=>e.disconnect()),this.slotObservers.clear(),this.throttleTimers.clear(),this.triggered.clear(),this.slotImpressed.clear();}attr(){return `data-${this.opts.prefix}`}throttled(e){if(this.opts.throttleMs<=0)return false;let t=Date.now(),i=this.throttleTimers.get(e)??0;return t-i>=this.opts.throttleMs?(this.throttleTimers.set(e,t),false):true}setupClicks(){let e=this.attr();this.clickHandler=t=>{let i=t.target;if(!i)return;let s=i.closest(`[${e}]`);if(s){let r=s.getAttribute(e),o=r?U(r):null;o&&o.interactionType==="click"&&!this.throttled(s)&&this.opts.fire(o.eventId,"click");}if(this.opts.fireSlot){let r=i.closest("[data-xenia-slot]");if(r){let o=Q(r);o&&!this.throttled(r)&&this.opts.fireSlot("click",o);}}},document.addEventListener("click",this.clickHandler);}observeSlot(e){if(!this.opts.fireSlot||this.slotObservers.has(e))return;let t=Q(e);if(!t)return;let i=this.opts.fireSlot,{threshold:s,rootMargin:r}=this.opts.viewport,o=new IntersectionObserver(a=>{for(let l of a)l.isIntersecting&&(this.slotImpressed.has(e)||(this.slotImpressed.add(e),i("impression",t),o.disconnect(),this.slotObservers.delete(e)));},{threshold:s,rootMargin:r});o.observe(e),this.slotObservers.set(e,o);}observeViewport(e,t){if(this.observers.has(e))return;let{threshold:i,rootMargin:s,triggerOnce:r}=this.opts.viewport,o=new IntersectionObserver(a=>{for(let l of a)l.isIntersecting&&(r&&this.triggered.has(e)||this.throttled(e)||(this.opts.fire(t,"view-port"),r&&(this.triggered.add(e),o.disconnect(),this.observers.delete(e))));},{threshold:i,rootMargin:s});o.observe(e),this.observers.set(e,o);}handleElement(e){let t=e.getAttribute(this.attr());if(!t)return;let i=U(t);i&&(i.interactionType==="view-port"?this.observeViewport(e,i.eventId):i.interactionType==="page-load"&&this.opts.fire(i.eventId,"page-load"));}scan(e){e.querySelectorAll(`[${this.attr()}]`).forEach(t=>this.handleElement(t)),this.opts.fireSlot&&e.querySelectorAll("[data-xenia-slot]").forEach(t=>this.observeSlot(t));}setupMutations(){this.mutationObserver=new MutationObserver(e=>{for(let t of e)for(let i of t.addedNodes){if(i.nodeType!==Node.ELEMENT_NODE)continue;let s=i;this.handleElement(s),this.opts.fireSlot&&s.matches("[data-xenia-slot]")&&this.observeSlot(s),this.scan(s);}}),this.mutationObserver.observe(document.body,{childList:true,subtree:true});}};var R="xenia";function q(n=R){return `${n||R}_vid`}var de=1800*1e3,M=class{prefix;cookie;deviceId=null;journeyId=null;sessionId=null;constructor(e="xenia",t=true){this.prefix=e,this.cookie=ue(t);}key(e){return `${this.prefix}_${e}`}cookieName(){return q(this.prefix)}writeVisitorCookie(e){if(!(!this.cookie||!e))try{if(typeof document>"u")return;let t=[`${this.cookieName()}=${encodeURIComponent(e)}`,"path=/",`max-age=${Math.floor(this.cookie.maxAgeDays*86400)}`,`SameSite=${this.cookie.sameSite}`];this.cookie.domain&&t.push(`domain=${this.cookie.domain}`),this.cookie.secure&&t.push("Secure"),document.cookie=t.join("; ");}catch{}}async resolveDeviceId(){if(this.deviceId)return this.writeVisitorCookie(this.getVisitorId()??this.deviceId),this.deviceId;let e=this.key("device_id");try{let i=localStorage.getItem(e);if(i)return this.deviceId=i,this.writeVisitorCookie(this.getVisitorId()??i),i}catch{}let t=await this.mediaDeviceId();t||(t=await this.fingerprint()),this.deviceId=t;try{localStorage.setItem(e,t);}catch{}return this.writeVisitorCookie(this.getVisitorId()??t),t}getDeviceId(){return this.deviceId}async mediaDeviceId(){try{if(!navigator.mediaDevices?.enumerateDevices)return null;let e=await navigator.mediaDevices.enumerateDevices();return (e.find(i=>i.kind==="videoinput"&&i.deviceId)||e.find(i=>i.kind==="audioinput"&&i.deviceId)||e.find(i=>i.kind==="audiooutput"&&i.deviceId))?.deviceId||null}catch{return null}}async fingerprint(){let e=[navigator.userAgent,navigator.language,screen.width,screen.height,screen.colorDepth,new Date().getTimezoneOffset()].join("|"),t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e));return Array.from(new Uint8Array(t)).map(i=>i.toString(16).padStart(2,"0")).join("")}identify(e){if(e){try{localStorage.setItem(this.key("visitor_id"),e);}catch{}this.writeVisitorCookie(e);}}getVisitorId(){try{return localStorage.getItem(this.key("visitor_id"))}catch{return null}}getSessionId(){let e=this.key("session_id"),t=this.key("session_last_activity"),i=Date.now();try{let s=sessionStorage.getItem(e),r=Number(sessionStorage.getItem(t)),a=s&&Number.isFinite(r)&&i-r<de?s:v(i);return sessionStorage.setItem(e,a),sessionStorage.setItem(t,String(i)),this.sessionId=a,a}catch{return this.sessionId||(this.sessionId=v(i)),this.sessionId}}setJourneyId(e){this.journeyId=e&&e.trim()?e.trim():null;}getJourneyId(){return this.journeyId||this.utmParam("utm_id")||null}utmParam(e){try{let t=new URLSearchParams(window.location.search).get(e);if(t){try{sessionStorage.setItem(this.key(e),t);}catch{}return t}try{return sessionStorage.getItem(this.key(e))}catch{}}catch{}return null}collectContext(){let e={},t=this.utmParam("utm_source"),i=this.utmParam("utm_medium"),s=this.utmParam("utm_campaign"),r=this.utmParam("utm_content"),o=this.utmParam("utm_id");t&&(e.utmSource=t),i&&(e.utmMedium=i),s&&(e.utmCampaign=s),r&&(e.utmContent=r),o&&(e.utmId=o);try{e.url=window.location.href,e.path=window.location.pathname,e.query=Object.fromEntries(new URLSearchParams(window.location.search)),document.referrer&&(e.referrer=document.referrer);}catch{}let a=this.getVisitorId();return a&&(e.visitorId=a),e}};function ue(n){if(n===false)return null;let e=n===true?{}:n,t=e.sameSite??"Lax",i=t==="None"?true:e.secure??false;return {sameSite:t,secure:i,maxAgeDays:e.maxAgeDays??365,domain:e.domain}}function O(n,e=document){if(!n)return null;let t=e.querySelector(`[data-xenia-slot="${ce(n)}"]`);if(t)return t;try{return e.querySelector(n)}catch{return null}}function ce(n){let e=window;return e.CSS?.escape?e.CSS.escape(n):n.replace(/["\\]/g,"\\$&")}function A(n,e){let t=O(n);return t?(e.html!==void 0?t.innerHTML=e.html:e.text!==void 0&&(t.textContent=e.text),t.removeAttribute("hidden"),true):false}function X(n){let e=O(n);return !e||!(e instanceof HTMLElement)?false:(e.dataset.xeniaHidden="1",e.style.setProperty("display","none","important"),true)}function $(n){let e=O(n);return !e||!(e instanceof HTMLElement)?false:(delete e.dataset.xeniaHidden,e.style.removeProperty("display"),true)}var pe=new Set(["banner","popup","modal","inline"]);function he(n){return pe.has(n)}var T=class{host=null;shadow=null;onCta;messageTemplate;messageStyles;messageComponent;mounted=new Map;constructor(e,t){this.onCta=e,this.messageTemplate=t?.messageTemplate,this.messageStyles=t?.messageStyles,this.messageComponent=t?.messageComponent;}apply(e){let t=0;for(let i of e)this.applyOne(i)&&t++;return t}applyOne(e){switch(e.type){case "swap":return A(e.target,{html:e.html,text:e.text});case "setContent":return A(e.target,{html:e.html,text:e.text});case "hide":return X(e.target);case "show":return $(e.target);case "redirect":try{return window.location.assign(e.url),!0}catch{return false}default:return he(e.type)?this.renderMessage(e):false}}destroy(){this.mounted.forEach(e=>e()),this.mounted.clear(),this.host?.remove(),this.host=null,this.shadow=null;}ensureShadow(){if(this.shadow)return this.shadow;let e=document.createElement("div");e.setAttribute("data-xenia-ui",""),document.body.appendChild(e);let t=e.attachShadow({mode:"open"});return t.appendChild(this.styleEl()),this.host=e,this.shadow=t,t}styleEl(){let e=document.createElement("style");return e.textContent=this.messageStyles?`${K}
2
- ${this.messageStyles}`:K,e}renderMessage(e){let t=e.html===void 0&&!!this.messageComponent;if(e.type==="inline"){if(!e.target)return false;let l=O(e.target);return l?(this.unmount(l),t?(l.innerHTML="",this.mountComponent(l,e,"inline",()=>this.unmount(l))):(l.innerHTML=this.cardHtml(e,"inline"),this.wireCard(l,e)),true):false}let i=this.ensureShadow(),s=document.createElement("div"),r=this.positionClass(e.type,e.position),o=e.html!==void 0?" xenia-custom-bg":"";s.className=`xenia-msg xenia-${e.type}${r?` ${r}`:""}${o}`,i.appendChild(s);let a=()=>{this.unmount(s),s.remove();};return t?this.mountComponent(s,e,e.type,a):(s.innerHTML=this.cardHtml(e,e.type),this.wireCard(s,e,a)),e.dismissAfterMs&&e.dismissAfterMs>0&&setTimeout(a,e.dismissAfterMs),true}mountComponent(e,t,i,s){if(!this.messageComponent)return;let r={action:t,variant:i,close:s,fireCta:()=>{t.cta?.event&&this.onCta?.(t.cta.event,t.cta),t.cta?.url&&window.location.assign(t.cta.url),s();}},o=this.messageComponent(e,r);o&&this.mounted.set(e,o);}unmount(e){let t=this.mounted.get(e);t&&(t(),this.mounted.delete(e));}positionClass(e,t){return e==="popup"?`xenia-pos-${t==="top-left"||t==="top-right"||t==="bottom-left"?t:"bottom-right"}`:e==="banner"?`xenia-pos-${t==="top"?"top":"bottom"}`:""}cardHtml(e,t){if(e.html!==void 0)return me(e.html,t);if(this.messageTemplate){let l={action:e,variant:t,escapeHtml:y,escapeAttr:W};return this.messageTemplate(l)}let i=e.imageUrl?`<img class="xenia-img" src="${W(e.imageUrl)}" alt="" />`:"",s=e.title?`<div class="xenia-title">${y(e.title)}</div>`:"",r=e.message?`<div class="xenia-body">${y(e.message)}</div>`:"",o=e.cta?`<button class="xenia-cta" type="button">${y(e.cta.label)}</button>`:"";return `<div class="xenia-card">${t==="inline"?"":'<button class="xenia-close" type="button" aria-label="Close">\xD7</button>'}${i}<div class="xenia-content">${s}${r}${o}</div></div>`}wireCard(e,t,i){i&&e.querySelectorAll(".xenia-close, [data-xenia-close], [class*='close' i], [id*='close' i], [class*='backdrop' i], [id*='backdrop' i]").forEach(o=>{o.removeAttribute("onclick"),o.addEventListener("click",i);}),e.querySelectorAll("[class*='backdrop' i], [id*='backdrop' i]").forEach(r=>{r instanceof HTMLElement&&r.children.length===0&&!r.textContent?.trim()&&(r.style.opacity="0.5");});let s=e.querySelector(".xenia-cta, [data-xenia-cta]");s&&t.cta&&s.addEventListener("click",()=>{t.cta?.event&&this.onCta?.(t.cta.event,t.cta),t.cta?.url&&window.location.assign(t.cta.url),i?.();});}};function me(n,e){return e==="modal"?`<div class="xenia-custom-html">${n}</div>`:`<div class="xenia-custom-html"><style>.xenia-custom-html{position:relative}.xenia-custom-html>*{position:static!important;inset:auto!important;top:auto!important;right:auto!important;bottom:auto!important;left:auto!important}</style>${n}</div>`}function y(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function W(n){return y(n).replace(/"/g,"&quot;")}var K=`
1
+ var Xenia=(function(exports){'use strict';var G=new Set(["banner","popup","modal","inline"]),Y=new Set(["top-left","top-right","bottom-left","bottom-right","top","bottom"]),Z=new Set(["swap","hide","show","setContent","redirect",...G]);function V(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function d(n){return typeof n=="string"?n:void 0}function ee(n){return typeof n=="number"?n:void 0}function te(n){if(!V(n))return null;let e=d(n.type);if(!e||!Z.has(e))return null;if(e==="redirect"){let i=d(n.url);return i?{type:e,url:i}:null}if(e==="hide"||e==="show"){let i=d(n.target);return i?{type:e,target:i}:null}if(e==="swap"||e==="setContent"){let i=d(n.target);return i?{type:e,target:i,html:d(n.html),text:d(n.text)}:null}let t=V(n.cta)?{label:d(n.cta.label)??"",url:d(n.cta.url),event:d(n.cta.event)}:void 0;return {type:e,target:d(n.target),title:d(n.title),message:d(n.message),imageUrl:d(n.imageUrl),html:d(n.html),cta:t&&t.label?t:void 0,dismissAfterMs:ee(n.dismissAfterMs),position:ne(n.position)}}function ne(n){let e=d(n);return e&&Y.has(e)?e:void 0}function _(n){let e;if(Array.isArray(n)?e=n:V(n)&&Array.isArray(n.xeniaActions)&&(e=n.xeniaActions),!Array.isArray(e))return [];let t=[];for(let i of e){let s=te(i);s&&t.push(s);}return t}var ie="https://engine.xeniamartech.com/xenia";function x(){return typeof window<"u"&&typeof document<"u"}function se(n,e){if(!e||Object.keys(e).length===0)return n;let t=new URLSearchParams(e),i=n.includes("?")?"&":"?";return `${n}${i}${t.toString()}`}function z(n){return new Promise(e=>setTimeout(e,n))}var m=class extends Error{constructor(t,i,s){super(s??`Request failed with status ${t}`);this.status=t;this.data=i;this.name="HttpError";}status;data},b=class{baseUrl;defaultHeaders;timeout;retry;debug;constructor(e){this.baseUrl=(e.baseUrl??ie).replace(/\/+$/,""),this.defaultHeaders=e.defaultHeaders??{},this.timeout=e.timeout??8e3,this.retry={attempts:e.retry?.attempts??2,baseDelayMs:e.retry?.baseDelayMs??300},this.debug=e.debug??false;}async request(e){let t=se(this.baseUrl+e.path,e.query),i=e.method??"GET",s={"Content-Type":"application/json",...this.defaultHeaders,...e.headers},r=e.body!==void 0?JSON.stringify(e.body):void 0,o=e.timeout??this.timeout,a=e.noRetry?1:(e.retry?.attempts??this.retry.attempts)+1,l=e.retry?.baseDelayMs??this.retry.baseDelayMs,P;for(let h=0;h<a;h++)try{let u=await this.fetchWithTimeout(t,{method:i,headers:s,body:r,...e.keepalive?{keepalive:!0}:{}},o),f=await this.parseBody(u);if(u.ok)return {response:u,data:f};if(this.isRetryableStatus(u.status)&&h<a-1){let D=this.retryAfterMs(u,l,h);this.log(`retrying ${e.path} after ${D}ms (status ${u.status})`),await z(D);continue}throw new m(u.status,f)}catch(u){if(P=u,u instanceof m)throw u;if(h<a-1){let f=l*2**h;this.log(`retrying ${e.path} after ${f}ms (network error)`),await z(f);continue}}throw P instanceof Error?P:new Error("Request failed")}async fetchWithTimeout(e,t,i){let s=new AbortController,r=setTimeout(()=>s.abort(),i);try{return await fetch(e,{...t,signal:s.signal})}catch(o){throw o instanceof Error&&o.name==="AbortError"?new Error(`Request timeout after ${i}ms`,{cause:o}):o}finally{clearTimeout(r);}}async parseBody(e){let t=await e.text().catch(()=>"");if(!t)return null;try{return JSON.parse(t)}catch{return t}}isRetryableStatus(e){return e===429||e>=500&&e<=599}retryAfterMs(e,t,i){let s=e.headers.get("Retry-After");if(s){let r=Number(s);if(!Number.isNaN(r))return r*1e3}return t*2**i}log(e){this.debug&&console.warn(`[xenia] ${e}`);}};function re(n){try{let e=n.split(".")[1];if(!e)return;let t=JSON.parse(atob(e.replace(/-/g,"+").replace(/_/g,"/")));return typeof t.exp=="number"?t.exp*1e3:void 0}catch{return}}var w=class{config;cached=null;inflight=null;constructor(e){this.config=e;}hasSource(){return !!(this.config.token||this.config.getToken)}getToken=async()=>{if(this.config.token&&!this.config.getToken)return this.config.token;let e=Date.now();if(this.cached&&this.cached.expiresAt>e)return this.cached.token;if(this.inflight)return this.inflight;if(!this.config.getToken)throw new Error("No token source: set config.token or config.getToken.");return this.inflight=Promise.resolve(this.config.getToken()).then(t=>{let i=re(t),s=i?i-3e4:e+5*6e4;return this.cached={token:t,expiresAt:s},t}).finally(()=>{this.inflight=null;}),this.inflight}};function J(n){let e={};for(let[t,i]of Object.entries(n))i!==void 0&&(e[t]=i);return e}var k=class{http;tenantId;environmentKey;tokenProvider;constructor(e){this.tenantId=e.tenantId,this.environmentKey=e.environmentKey,this.tokenProvider=new w(e),this.http=new b({baseUrl:e.baseUrl,defaultHeaders:e.headers,timeout:e.timeout,retry:e.retry,debug:e.debug});}tenantHeaders(){return {"X-Tenant-Id":this.tenantId,"X-Environment":this.environmentKey}}async authHeaders(){let e=this.tenantHeaders();if(!this.tokenProvider.hasSource())return e;let t=await this.tokenProvider.getToken();return t&&(e.Authorization=`Bearer ${t}`),e}async webhook(e,t,i="POST"){let{response:s,data:r}=await this.http.request({method:i,path:"/flow",query:{id:e},headers:await this.authHeaders(),body:i==="POST"?t??{}:void 0,noRetry:true});return {status:s.status,body:r,actions:_(r),receivedAt:Date.now()}}async sendEvents(e,t){let{data:i}=await this.http.request({method:"POST",path:"/api/events/v1",headers:await this.authHeaders(),body:{events:e},keepalive:t?.keepalive});return i}async identify(e){let{data:t}=await this.http.request({method:"POST",path:"/api/events/v1/identify",headers:await this.authHeaders(),body:e});return t}async consent(e,t){let{data:i}=await this.http.request({method:"POST",path:"/api/events/v1/consent",headers:await this.authHeaders(),body:J({xeniaVisitorId:e,analytics:t.analytics===true,marketing:t.marketing===true,personalization:t.personalization===true,consentSource:t.consentSource,consentVersion:t.consentVersion})});return i}async resolve(e,t={}){let{data:i}=await this.http.request({method:"POST",path:"/api/personalization/resolve",query:t.merge!==void 0?{merge:String(t.merge)}:void 0,headers:await this.authHeaders(),body:J({contentKey:e,data:t.data,locale:t.locale})});return i}async resolveBatch(e,t={}){let{data:i}=await this.http.request({method:"POST",path:"/api/personalization/resolve-batch",query:t.merge!==void 0?{merge:String(t.merge)}:void 0,headers:await this.authHeaders(),body:J({items:e,data:t.data,locale:t.locale})});return i}};var oe=new Set(["eventId","eventType","journeyId","deviceId","visitorId","customerId","email","utmSource","utmMedium","utmCampaign","utmContent","utmId","url","referrer","path","query"]);function L(n){let e={};for(let[t,i]of Object.entries(n))i!==void 0&&(e[t]=i);return e}function j(n){let e={},t={};if(n.props)for(let[s,r]of Object.entries(n.props))r!==void 0&&(oe.has(s)?t[s]=r:e[s]=r);return {...e,...t,...L(n.context??{}),...L(n.identity??{}),eventId:n.eventId,...n.eventType?{eventType:n.eventType}:{},...n.journeyId?{journeyId:n.journeyId}:{}}}var g="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ae(n){let e=new Uint8Array(n);if(typeof crypto<"u"&&crypto.getRandomValues)crypto.getRandomValues(e);else for(let t=0;t<n;t++)e[t]=Math.floor(Math.random()*256);return e}function v(n=Date.now()){let e="",t=n;for(let r=9;r>=0;r--)e=g[t%32]+e,t=Math.floor(t/32);let i=ae(16),s="";for(let r=0;r<16;r++)s+=g[i[r]%32];return e+s}var H=26;function B(n){if(n.length<=H)return n;let e="";for(let i of [2166136261,16777619]){let s=i>>>0;for(let r=0;r<n.length;r++)s^=n.charCodeAt(r),s=Math.imul(s,16777619)>>>0,e+=g[s%32];}let t="";for(let i=0;i<H;i++){let s=i+1;for(let r=i;r<e.length;r+=H)s=s*31+g.indexOf(e[r])>>>0;t+=g[s%32];}return t}var I=class{map=new Map;set(e,t){this.map.set(e,t);}get(e){return this.map.get(e)}keys(){return [...this.map.keys()]}clear(){this.map.clear();}},S=class{nsKey;constructor(e="xenia"){this.nsKey=`${e}_responses`;}read(){try{let e=localStorage.getItem(this.nsKey);return e?JSON.parse(e):{}}catch{return {}}}write(e){try{localStorage.setItem(this.nsKey,JSON.stringify(e));}catch{}}set(e,t){let i=this.read();i[e]=t,this.write(i);}get(e){return this.read()[e]}keys(){return Object.keys(this.read())}clear(){try{localStorage.removeItem(this.nsKey);}catch{}}};var C=class{queue=[];send;batchSize;flushIntervalMs;maxQueueSize;debug;timer=null;flushing=false;listenersAttached=false;allowed=false;onPageHide=()=>this.flushOnUnload();onVisibilityChange=()=>{document.visibilityState==="hidden"&&this.flushOnUnload();};constructor(e){this.send=e.send,this.batchSize=e.batchSize??20,this.flushIntervalMs=e.flushIntervalMs??3e3,this.maxQueueSize=e.maxQueueSize??200,this.debug=e.debug??false;}start(){this.allowed=true,!(this.timer||typeof window>"u")&&(this.timer=setInterval(()=>{this.flush();},this.flushIntervalMs),window.addEventListener("pagehide",this.onPageHide),document.addEventListener("visibilitychange",this.onVisibilityChange),this.listenersAttached=true);}stop(){this.allowed=false,this.timer&&clearInterval(this.timer),this.timer=null,this.listenersAttached&&(window.removeEventListener("pagehide",this.onPageHide),document.removeEventListener("visibilitychange",this.onVisibilityChange),this.listenersAttached=false);}enqueue(e){this.queue.length>=this.maxQueueSize&&this.queue.shift(),this.queue.push(e),this.allowed&&this.queue.length>=this.batchSize&&this.flush();}async sendImmediate(e){try{await this.send([e],{keepalive:!0});}catch(t){this.isPermanentFailure(t)||this.requeue([e]),this.debug&&console.warn("[xenia] immediate send failed",t);}}async flush(){if(!this.allowed||this.flushing||this.queue.length===0)return;this.flushing=true;let e=this.queue.splice(0,this.batchSize);try{await this.send(e);}catch(t){this.isPermanentFailure(t)||this.requeue(e),this.debug&&console.warn("[xenia] analytics flush failed",t);}finally{this.flushing=false;}}isPermanentFailure(e){return e instanceof m&&e.status>=400&&e.status<500}flushOnUnload(){if(!this.allowed||this.queue.length===0)return;let e=this.queue.splice(0,this.queue.length);this.send(e,{keepalive:true}).catch(()=>{});}requeue(e){let t=this.maxQueueSize-this.queue.length;t<=0||this.queue.unshift(...e.slice(0,t));}};var le=new Set(["click","view-port","page-load"]);function U(n){let e=n.indexOf("&");if(e===-1)return null;let t=n.slice(0,e),i=n.slice(e+1);return !t||!le.has(i)?null:{eventId:t,interactionType:i}}function Q(n){let e=n.getAttribute("data-xenia-content-key");if(!e)return null;let t=n.getAttribute("data-xenia-content-entry-id"),i=n.getAttribute("data-xenia-base-entry-id"),s=n.getAttribute("data-xenia-personalized");return {contentKey:e,contentEntryId:t??void 0,baseEntryId:i??void 0,personalized:s==null?void 0:s==="true"}}var E=class{opts;throttleTimers=new Map;observers=new Map;slotObservers=new Map;triggered=new Set;slotImpressed=new Set;clickHandler=null;mutationObserver=null;constructor(e){this.opts=e;}start(){this.setupClicks(),this.scan(document),this.setupMutations();}stop(){this.clickHandler&&document.removeEventListener("click",this.clickHandler),this.clickHandler=null,this.mutationObserver?.disconnect(),this.mutationObserver=null,this.observers.forEach(e=>e.disconnect()),this.observers.clear(),this.slotObservers.forEach(e=>e.disconnect()),this.slotObservers.clear(),this.throttleTimers.clear(),this.triggered.clear(),this.slotImpressed.clear();}attr(){return `data-${this.opts.prefix}`}throttled(e){if(this.opts.throttleMs<=0)return false;let t=Date.now(),i=this.throttleTimers.get(e)??0;return t-i>=this.opts.throttleMs?(this.throttleTimers.set(e,t),false):true}setupClicks(){let e=this.attr();this.clickHandler=t=>{let i=t.target;if(!i)return;let s=i.closest(`[${e}]`);if(s){let r=s.getAttribute(e),o=r?U(r):null;o&&o.interactionType==="click"&&!this.throttled(s)&&this.opts.fire(o.eventId,"click");}if(this.opts.fireSlot){let r=i.closest("[data-xenia-slot]");if(r){let o=Q(r);o&&!this.throttled(r)&&this.opts.fireSlot("click",o);}}},document.addEventListener("click",this.clickHandler);}observeSlot(e){if(!this.opts.fireSlot||this.slotObservers.has(e))return;let t=Q(e);if(!t)return;let i=this.opts.fireSlot,{threshold:s,rootMargin:r}=this.opts.viewport,o=new IntersectionObserver(a=>{for(let l of a)l.isIntersecting&&(this.slotImpressed.has(e)||(this.slotImpressed.add(e),i("impression",t),o.disconnect(),this.slotObservers.delete(e)));},{threshold:s,rootMargin:r});o.observe(e),this.slotObservers.set(e,o);}observeViewport(e,t){if(this.observers.has(e))return;let{threshold:i,rootMargin:s,triggerOnce:r}=this.opts.viewport,o=new IntersectionObserver(a=>{for(let l of a)l.isIntersecting&&(r&&this.triggered.has(e)||this.throttled(e)||(this.opts.fire(t,"view-port"),r&&(this.triggered.add(e),o.disconnect(),this.observers.delete(e))));},{threshold:i,rootMargin:s});o.observe(e),this.observers.set(e,o);}handleElement(e){let t=e.getAttribute(this.attr());if(!t)return;let i=U(t);i&&(i.interactionType==="view-port"?this.observeViewport(e,i.eventId):i.interactionType==="page-load"&&this.opts.fire(i.eventId,"page-load"));}scan(e){e.querySelectorAll(`[${this.attr()}]`).forEach(t=>this.handleElement(t)),this.opts.fireSlot&&e.querySelectorAll("[data-xenia-slot]").forEach(t=>this.observeSlot(t));}setupMutations(){this.mutationObserver=new MutationObserver(e=>{for(let t of e)for(let i of t.addedNodes){if(i.nodeType!==Node.ELEMENT_NODE)continue;let s=i;this.handleElement(s),this.opts.fireSlot&&s.matches("[data-xenia-slot]")&&this.observeSlot(s),this.scan(s);}}),this.mutationObserver.observe(document.body,{childList:true,subtree:true});}};var R="xenia";function q(n=R){return `${n||R}_vid`}var ue=1800*1e3,M=class{prefix;cookie;deviceId=null;journeyId=null;sessionId=null;constructor(e="xenia",t=true){this.prefix=e,this.cookie=ce(t);}key(e){return `${this.prefix}_${e}`}cookieName(){return q(this.prefix)}writeVisitorCookie(e){if(!(!this.cookie||!e))try{if(typeof document>"u")return;let t=[`${this.cookieName()}=${encodeURIComponent(e)}`,"path=/",`max-age=${Math.floor(this.cookie.maxAgeDays*86400)}`,`SameSite=${this.cookie.sameSite}`];this.cookie.domain&&t.push(`domain=${this.cookie.domain}`),this.cookie.secure&&t.push("Secure"),document.cookie=t.join("; ");}catch{}}async resolveDeviceId(){if(this.deviceId)return this.writeVisitorCookie(this.getVisitorId()??this.deviceId),this.deviceId;let e=this.key("device_id");try{let i=localStorage.getItem(e);if(i)return this.deviceId=i,this.writeVisitorCookie(this.getVisitorId()??i),i}catch{}let t=await this.mediaDeviceId();t||(t=await this.fingerprint()),this.deviceId=t;try{localStorage.setItem(e,t);}catch{}return this.writeVisitorCookie(this.getVisitorId()??t),t}getDeviceId(){return this.deviceId}async mediaDeviceId(){try{if(!navigator.mediaDevices?.enumerateDevices)return null;let e=await navigator.mediaDevices.enumerateDevices();return (e.find(i=>i.kind==="videoinput"&&i.deviceId)||e.find(i=>i.kind==="audioinput"&&i.deviceId)||e.find(i=>i.kind==="audiooutput"&&i.deviceId))?.deviceId||null}catch{return null}}async fingerprint(){let e=[navigator.userAgent,navigator.language,screen.width,screen.height,screen.colorDepth,new Date().getTimezoneOffset()].join("|"),t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e));return Array.from(new Uint8Array(t)).map(i=>i.toString(16).padStart(2,"0")).join("")}identify(e){if(e){try{localStorage.setItem(this.key("visitor_id"),e);}catch{}this.writeVisitorCookie(e);}}getVisitorId(){try{return localStorage.getItem(this.key("visitor_id"))}catch{return null}}getSessionId(){let e=this.key("session_id"),t=this.key("session_last_activity"),i=Date.now();try{let s=sessionStorage.getItem(e),r=Number(sessionStorage.getItem(t)),a=s&&Number.isFinite(r)&&i-r<ue?s:v(i);return sessionStorage.setItem(e,a),sessionStorage.setItem(t,String(i)),this.sessionId=a,a}catch{return this.sessionId||(this.sessionId=v(i)),this.sessionId}}setJourneyId(e){this.journeyId=e&&e.trim()?e.trim():null;}getJourneyId(){return this.journeyId||this.utmParam("utm_id")||null}utmParam(e){try{let t=new URLSearchParams(window.location.search).get(e);if(t){try{sessionStorage.setItem(this.key(e),t);}catch{}return t}try{return sessionStorage.getItem(this.key(e))}catch{}}catch{}return null}collectContext(){let e={},t=this.utmParam("utm_source"),i=this.utmParam("utm_medium"),s=this.utmParam("utm_campaign"),r=this.utmParam("utm_content"),o=this.utmParam("utm_id");t&&(e.utmSource=t),i&&(e.utmMedium=i),s&&(e.utmCampaign=s),r&&(e.utmContent=r),o&&(e.utmId=o);try{e.url=window.location.href,e.path=window.location.pathname,e.query=Object.fromEntries(new URLSearchParams(window.location.search)),document.referrer&&(e.referrer=document.referrer);}catch{}let a=this.getVisitorId();return a&&(e.visitorId=a),e}};function ce(n){if(n===false)return null;let e=n===true?{}:n,t=e.sameSite??"Lax",i=t==="None"?true:e.secure??false;return {sameSite:t,secure:i,maxAgeDays:e.maxAgeDays??365,domain:e.domain}}function O(n,e=document){if(!n)return null;let t=e.querySelector(`[data-xenia-slot="${pe(n)}"]`);if(t)return t;try{return e.querySelector(n)}catch{return null}}function pe(n){let e=window;return e.CSS?.escape?e.CSS.escape(n):n.replace(/["\\]/g,"\\$&")}function A(n,e){let t=O(n);return t?(e.html!==void 0?t.innerHTML=e.html:e.text!==void 0&&(t.textContent=e.text),t.removeAttribute("hidden"),true):false}function X(n){let e=O(n);return !e||!(e instanceof HTMLElement)?false:(e.dataset.xeniaHidden="1",e.style.setProperty("display","none","important"),true)}function $(n){let e=O(n);return !e||!(e instanceof HTMLElement)?false:(delete e.dataset.xeniaHidden,e.style.removeProperty("display"),true)}var he=new Set(["banner","popup","modal","inline"]);function me(n){return he.has(n)}var T=class{host=null;shadow=null;onCta;messageTemplate;messageStyles;messageComponent;mounted=new Map;constructor(e,t){this.onCta=e,this.messageTemplate=t?.messageTemplate,this.messageStyles=t?.messageStyles,this.messageComponent=t?.messageComponent;}apply(e){let t=0;for(let i of e)this.applyOne(i)&&t++;return t}applyOne(e){switch(e.type){case "swap":return A(e.target,{html:e.html,text:e.text});case "setContent":return A(e.target,{html:e.html,text:e.text});case "hide":return X(e.target);case "show":return $(e.target);case "redirect":try{return window.location.assign(e.url),!0}catch{return false}default:return me(e.type)?this.renderMessage(e):false}}destroy(){this.mounted.forEach(e=>e()),this.mounted.clear(),this.host?.remove(),this.host=null,this.shadow=null;}ensureShadow(){if(this.shadow)return this.shadow;let e=document.createElement("div");e.setAttribute("data-xenia-ui",""),document.body.appendChild(e);let t=e.attachShadow({mode:"open"});return t.appendChild(this.styleEl()),this.host=e,this.shadow=t,t}styleEl(){let e=document.createElement("style");return e.textContent=this.messageStyles?`${K}
2
+ ${this.messageStyles}`:K,e}renderMessage(e){let t=e.html===void 0&&!!this.messageComponent;if(e.type==="inline"){if(!e.target)return false;let l=O(e.target);return l?(this.unmount(l),t?(l.innerHTML="",this.mountComponent(l,e,"inline",()=>this.unmount(l))):(l.innerHTML=this.cardHtml(e,"inline"),this.wireCard(l,e)),true):false}let i=this.ensureShadow(),s=document.createElement("div"),r=this.positionClass(e.type,e.position),o=e.html!==void 0?" xenia-custom-bg":"";s.className=`xenia-msg xenia-${e.type}${r?` ${r}`:""}${o}`,i.appendChild(s);let a=()=>{this.unmount(s),s.remove();};return t?this.mountComponent(s,e,e.type,a):(s.innerHTML=this.cardHtml(e,e.type),this.wireCard(s,e,a)),e.dismissAfterMs&&e.dismissAfterMs>0&&setTimeout(a,e.dismissAfterMs),true}mountComponent(e,t,i,s){if(!this.messageComponent)return;let r={action:t,variant:i,close:s,fireCta:()=>{t.cta?.event&&this.onCta?.(t.cta.event,t.cta),t.cta?.url&&window.location.assign(t.cta.url),s();}},o=this.messageComponent(e,r);o&&this.mounted.set(e,o);}unmount(e){let t=this.mounted.get(e);t&&(t(),this.mounted.delete(e));}positionClass(e,t){return e==="popup"?`xenia-pos-${t==="top-left"||t==="top-right"||t==="bottom-left"?t:"bottom-right"}`:e==="banner"?`xenia-pos-${t==="top"?"top":"bottom"}`:""}cardHtml(e,t){if(e.html!==void 0)return fe(e.html,t);if(this.messageTemplate){let l={action:e,variant:t,escapeHtml:y,escapeAttr:W};return this.messageTemplate(l)}let i=e.imageUrl?`<img class="xenia-img" src="${W(e.imageUrl)}" alt="" />`:"",s=e.title?`<div class="xenia-title">${y(e.title)}</div>`:"",r=e.message?`<div class="xenia-body">${y(e.message)}</div>`:"",o=e.cta?`<button class="xenia-cta" type="button">${y(e.cta.label)}</button>`:"";return `<div class="xenia-card">${t==="inline"?"":'<button class="xenia-close" type="button" aria-label="Close">\xD7</button>'}${i}<div class="xenia-content">${s}${r}${o}</div></div>`}wireCard(e,t,i){i&&e.querySelectorAll(".xenia-close, [data-xenia-close], [class*='close' i], [id*='close' i], [class*='backdrop' i], [id*='backdrop' i]").forEach(o=>{o.removeAttribute("onclick"),o.addEventListener("click",i);}),e.querySelectorAll("[class*='backdrop' i], [id*='backdrop' i]").forEach(r=>{r instanceof HTMLElement&&r.children.length===0&&!r.textContent?.trim()&&(r.style.opacity="0.5");});let s=e.querySelector(".xenia-cta, [data-xenia-cta]");s&&t.cta&&s.addEventListener("click",()=>{t.cta?.event&&this.onCta?.(t.cta.event,t.cta),t.cta?.url&&window.location.assign(t.cta.url),i?.();});}};function fe(n,e){return e==="modal"?`<div class="xenia-custom-html">${n}</div>`:`<div class="xenia-custom-html"><style>.xenia-custom-html{position:relative}.xenia-custom-html>*{position:static!important;inset:auto!important;top:auto!important;right:auto!important;bottom:auto!important;left:auto!important}</style>${n}</div>`}function y(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function W(n){return y(n).replace(/"/g,"&quot;")}var K=`
3
3
  :host { all: initial; }
4
4
  .xenia-msg { position: fixed; z-index: var(--xenia-z-index, 2147483000);
5
5
  font-family: var(--xenia-font-family, system-ui, sans-serif); }
@@ -31,6 +31,6 @@ ${this.messageStyles}`:K,e}renderMessage(e){let t=e.html===void 0&&!!this.messag
31
31
  font-size: var(--xenia-cta-size, 14px); cursor: pointer; }
32
32
  .xenia-close { position: absolute; top: 6px; right: 8px; background: none; border: 0;
33
33
  font-size: var(--xenia-close-size, 20px); line-height: 1; cursor: pointer; color: var(--xenia-close-color, #999); }
34
- `;var N=class{api;identity;responses;options;renderer;analyticsQueue;tracker=null;ready=false;consentState;listeners=new Map;constructor(e){this.options=e;let t=e.prefix??"xenia";this.identity=new M(t,e.visitorCookie??true),e.visitorId&&this.identity.identify(e.visitorId),this.api=new k(e),this.responses=e.persistResponses===false||!x()?new I:new S(t),this.renderer=new T((i,s)=>this.onCtaEvent(i,s),{messageTemplate:e.messageTemplate,messageStyles:e.messageStyles,messageComponent:e.messageComponent}),this.consentState={...e.consent},this.analyticsQueue=new C({debug:e.debug,send:(i,s)=>this.api.sendEvents(i.map(r=>({...r,consent:this.consentState})),s)});}async init(){this.ready||!x()||(await this.identity.resolveDeviceId(),this.ready=true,this.analyticsAllowed()&&this.analyticsQueue.start(),this.options.autoTrack!==false&&(this.tracker=new E({prefix:this.options.prefix??"xenia",throttleMs:this.options.throttleMs??1e3,viewport:{threshold:this.options.viewport?.threshold??.5,rootMargin:this.options.viewport?.rootMargin,triggerOnce:this.options.viewport?.triggerOnce??true},fire:(e,t)=>this.track(e,{interactionType:t},{trigger:true}),fireSlot:(e,t)=>{this.track("customEvent",{customEventName:e==="impression"?"personalization_impression":"personalization_click",contentKey:t.contentKey,contentEntryId:t.contentEntryId??null,baseEntryId:t.baseEntryId??null},{trigger:false});}}),this.tracker.start()));}destroy(){this.tracker?.stop(),this.tracker=null,this.renderer.destroy(),this.analyticsQueue.stop(),this.ready=false;}identify(e){this.identity.identify(e),this.api.identify({xeniaVisitorId:e}).then(t=>this.emit("identify",t)).catch(t=>this.emitError(t));}setJourneyId(e){this.identity.setJourneyId(e);}track(e,t,i={}){if(!x())return;let s=i.trigger===true;if(!s&&this.dntBlocked())return;let r=this.buildEvent(e,t,i);this.emit("event",{eventName:e,event:r}),s?this.analyticsQueue.sendImmediate(r).catch(o=>this.emitError(o)):(this.analyticsQueue.enqueue(r),this.analyticsAllowed()&&this.analyticsQueue.start());}buildEvent(e,t,i){let s=this.identity.collectContext(),r;try{r=Intl.DateTimeFormat().resolvedOptions().timeZone;}catch{}return {eventName:e,eventId:i.eventId?B(i.eventId):v(),eventVersion:1,occurredAtMs:Date.now(),source:"xenia-js-sdk",identity:{sessionId:this.identity.getSessionId(),...i.identity,xeniaVisitorId:s.visitorId??this.identity.getDeviceId()??void 0},context:{pagePath:s.path,referrer:s.referrer,userAgent:navigator.userAgent,locale:navigator.language,timezone:r,journeyId:this.identity.getJourneyId()??void 0,utmSource:s.utmSource,utmMedium:s.utmMedium,utmCampaign:s.utmCampaign,utmContent:s.utmContent,...i.context},properties:this.withUtmId(t,s.utmId),trigger:i.trigger===true?true:void 0}}withUtmId(e,t){return !t||e&&(e.utm_id!==void 0||e.utmId!==void 0)?e:{...e,utm_id:t}}async resolve(e,t){return this.api.resolve(e,this.withVisitor(t))}async resolveBatch(e,t){return this.api.resolveBatch(e,this.withVisitor(t))}resolveVisitorId(){return this.identity.getVisitorId()??this.identity.getDeviceId()??void 0}withVisitor(e){let t=this.resolveVisitorId();return t?{...e,data:{...e?.data??{},_xenia_vid:t}}:e}dntBlocked(){if(this.options.respectDnt===false)return false;try{let e=navigator,t=navigator.doNotTrack??window.doNotTrack;if(t==="1"||t==="yes"||e.globalPrivacyControl===!0)return !0}catch{}return false}analyticsAllowed(){return this.consentState.analytics===true}async request(e,t,i){let s=this.identity.collectContext(),r=j({eventId:e,journeyId:this.identity.getJourneyId()??void 0,identity:{deviceId:this.identity.getDeviceId()??void 0,visitorId:this.resolveVisitorId()},context:s,props:t}),o=await this.api.webhook(e,r,i?.method??"POST");return this.responses.set(e,o),this.emit("response",{triggerId:e,response:o}),(i?.apply??this.options.autoApplyActions!==false)&&o.actions.length&&this.applyActions(o.actions),o}getResponse(e){return this.responses.get(e)}swapContent(e,t){return A(e,t)}hideContent(e){return X(e)}showContent(e){return $(e)}applyActions(e){let t=this.renderer.apply(e);return this.emit("actions",{actions:e,applied:t}),t}async consent(e){let t=this.analyticsAllowed();this.consentState={...this.consentState,...e},this.analyticsAllowed()&&!t?(this.analyticsQueue.start(),this.analyticsQueue.flush()):!this.analyticsAllowed()&&t&&this.analyticsQueue.stop();let i=this.identity.getVisitorId()??this.identity.getDeviceId();if(i)try{await this.api.consent(i,e);}catch(s){this.emitError(s);}}on(e,t){let i=this.listeners.get(e)??new Set;return i.add(t),this.listeners.set(e,i),()=>i.delete(t)}emit(e,t){this.listeners.get(e)?.forEach(i=>{try{i(t);}catch{}});}emitError(e){let t=e instanceof Error?e:new Error(String(e));this.options.debug&&console.error("[xenia]",t),this.emit("error",t);}onCtaEvent(e,t){this.track(e,{ctaLabel:t.label,ctaUrl:t.url??null},{trigger:true});}};function F(n){return new N(n)}var p=null;function c(n){if(!p)throw console.warn(`[xenia] ${n}() called before init().`),new Error("Xenia not initialized");return p}var Ue={init(n){p&&p.destroy(),p=F(n),p.init();},destroy(){p?.destroy(),p=null;},track(n,e,t){c("track").track(n,e,t);},identify(n){c("identify").identify(n);},consent(n){return c("consent").consent(n)},resolve(n,e){return c("resolve").resolve(n,e)},resolveBatch(n,e){return c("resolveBatch").resolveBatch(n,e)},setJourneyId(n){c("setJourneyId").setJourneyId(n);},request(n,e){return c("request").request(n,e)},getResponse(n){return c("getResponse").getResponse(n)},swapContent(n,e){return c("swapContent").swapContent(n,e)},hideContent(n){return c("hideContent").hideContent(n)},showContent(n){return c("showContent").showContent(n)}};exports.Xenia=Ue;return exports;})({});
34
+ `;var N=class{api;identity;responses;options;renderer;analyticsQueue;tracker=null;ready=false;consentState;listeners=new Map;constructor(e){this.options=e;let t=e.prefix??"xenia";this.identity=new M(t,e.visitorCookie??true),e.visitorId&&this.identity.identify(e.visitorId),this.api=new k(e),this.responses=e.persistResponses===false||!x()?new I:new S(t),this.renderer=new T((i,s)=>this.onCtaEvent(i,s),{messageTemplate:e.messageTemplate,messageStyles:e.messageStyles,messageComponent:e.messageComponent}),this.consentState={...e.consent},this.analyticsQueue=new C({debug:e.debug,send:(i,s)=>this.api.sendEvents(i.map(r=>({...r,consent:this.consentState})),s)});}async init(){this.ready||!x()||(await this.identity.resolveDeviceId(),this.ready=true,this.analyticsAllowed()&&this.analyticsQueue.start(),this.options.autoTrack!==false&&(this.tracker=new E({prefix:this.options.prefix??"xenia",throttleMs:this.options.throttleMs??1e3,viewport:{threshold:this.options.viewport?.threshold??.5,rootMargin:this.options.viewport?.rootMargin,triggerOnce:this.options.viewport?.triggerOnce??true},fire:(e,t)=>this.track(e,{interactionType:t},{trigger:true}),fireSlot:(e,t)=>{this.track("customEvent",{customEventName:e==="impression"?"personalization_impression":"personalization_click",contentKey:t.contentKey,contentEntryId:t.contentEntryId??null,baseEntryId:t.baseEntryId??null},{trigger:false});}}),this.tracker.start()));}destroy(){this.tracker?.stop(),this.tracker=null,this.renderer.destroy(),this.analyticsQueue.stop(),this.ready=false;}identify(e){this.identity.identify(e),this.api.identify({xeniaVisitorId:e}).then(t=>this.emit("identify",t)).catch(t=>this.emitError(t));}setJourneyId(e){this.identity.setJourneyId(e);}track(e,t,i={}){if(!x())return;let s=i.trigger===true;if(!s&&this.dntBlocked())return;let r=this.buildEvent(e,t,i);this.emit("event",{eventName:e,event:r}),s?this.analyticsQueue.sendImmediate(r).catch(o=>this.emitError(o)):(this.analyticsQueue.enqueue(r),this.analyticsAllowed()&&this.analyticsQueue.start());}buildEvent(e,t,i){let s=this.identity.collectContext(),r;try{r=Intl.DateTimeFormat().resolvedOptions().timeZone;}catch{}return {eventName:e,eventId:i.eventId?B(i.eventId):v(),eventVersion:1,occurredAtMs:Date.now(),source:"xenia-js-sdk",identity:{sessionId:this.identity.getSessionId(),...i.identity,xeniaVisitorId:s.visitorId??this.identity.getDeviceId()??void 0},context:{pagePath:s.path,referrer:s.referrer,userAgent:navigator.userAgent,locale:navigator.language,timezone:r,journeyId:this.identity.getJourneyId()??void 0,utmSource:s.utmSource,utmMedium:s.utmMedium,utmCampaign:s.utmCampaign,utmContent:s.utmContent,...i.context},properties:this.withUtmId(t,s.utmId),trigger:i.trigger===true?true:void 0}}withUtmId(e,t){return !t||e&&(e.utm_id!==void 0||e.utmId!==void 0)?e:{...e,utm_id:t}}async resolve(e,t){return this.api.resolve(e,this.withVisitor(t))}async resolveBatch(e,t){return this.api.resolveBatch(e,this.withVisitor(t))}resolveVisitorId(){return this.identity.getVisitorId()??this.identity.getDeviceId()??void 0}withVisitor(e){let t=this.resolveVisitorId();return t?{...e,data:{...e?.data??{},_xenia_vid:t}}:e}dntBlocked(){if(this.options.respectDnt===false)return false;try{let e=navigator,t=navigator.doNotTrack??window.doNotTrack;if(t==="1"||t==="yes"||e.globalPrivacyControl===!0)return !0}catch{}return false}analyticsAllowed(){return this.consentState.analytics===true}async request(e,t,i){let s=this.identity.collectContext(),r=j({eventId:e,journeyId:this.identity.getJourneyId()??void 0,identity:{deviceId:this.identity.getDeviceId()??void 0,visitorId:this.resolveVisitorId()},context:s,props:t}),o=await this.api.webhook(e,r,i?.method??"POST");return this.responses.set(e,o),this.emit("response",{triggerId:e,response:o}),(i?.apply??this.options.autoApplyActions!==false)&&o.actions.length&&this.applyActions(o.actions),o}getResponse(e){return this.responses.get(e)}swapContent(e,t){return A(e,t)}hideContent(e){return X(e)}showContent(e){return $(e)}applyActions(e){let t=this.renderer.apply(e);return this.emit("actions",{actions:e,applied:t}),t}async consent(e){let t=this.analyticsAllowed();this.consentState={...this.consentState,...e},this.analyticsAllowed()&&!t?(this.analyticsQueue.start(),this.analyticsQueue.flush()):!this.analyticsAllowed()&&t&&this.analyticsQueue.stop();let i=this.identity.getVisitorId()??this.identity.getDeviceId();if(i)try{await this.api.consent(i,e);}catch(s){this.emitError(s);}}on(e,t){let i=this.listeners.get(e)??new Set;return i.add(t),this.listeners.set(e,i),()=>i.delete(t)}emit(e,t){this.listeners.get(e)?.forEach(i=>{try{i(t);}catch{}});}emitError(e){let t=e instanceof Error?e:new Error(String(e));this.options.debug&&console.error("[xenia]",t),this.emit("error",t);}onCtaEvent(e,t){this.track(e,{ctaLabel:t.label,ctaUrl:t.url??null},{trigger:true});}};function F(n){return new N(n)}var p=null;function c(n){if(!p)throw console.warn(`[xenia] ${n}() called before init().`),new Error("Xenia not initialized");return p}var Qe={init(n){p&&p.destroy(),p=F(n),p.init();},destroy(){p?.destroy(),p=null;},track(n,e,t){c("track").track(n,e,t);},identify(n){c("identify").identify(n);},consent(n){return c("consent").consent(n)},resolve(n,e){return c("resolve").resolve(n,e)},resolveBatch(n,e){return c("resolveBatch").resolveBatch(n,e)},setJourneyId(n){c("setJourneyId").setJourneyId(n);},request(n,e){return c("request").request(n,e)},getResponse(n){return c("getResponse").getResponse(n)},swapContent(n,e){return c("swapContent").swapContent(n,e)},hideContent(n){return c("hideContent").hideContent(n)},showContent(n){return c("showContent").showContent(n)}};exports.Xenia=Qe;return exports;})({});
35
35
  Xenia=Xenia&&(Xenia.Xenia||Xenia.default)||Xenia;if(typeof window!=='undefined'){window.Xenia=Xenia;}
36
36
  //# sourceMappingURL=xenia-sdk.iife.js.map