@xenia-martech/sdk-js 1.1.0 → 1.2.0-dev.1
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/README.md +50 -0
- package/assets/coverage.json +1 -0
- package/dist/{actions-CKeiofxJ.d.cts → actions-D9_aAvCv.d.cts} +188 -2
- package/dist/{actions-CKeiofxJ.d.ts → actions-D9_aAvCv.d.ts} +188 -2
- package/dist/api-BEPW0Uan.d.cts +88 -0
- package/dist/api-CktVQ6Gl.d.ts +88 -0
- package/dist/{chunk-U2WBBOYT.cjs → chunk-3PYPPIUM.cjs} +35 -10
- package/dist/chunk-3PYPPIUM.cjs.map +1 -0
- package/dist/{chunk-FYSEKFIY.js → chunk-7NGJC7CF.js} +249 -3
- package/dist/chunk-7NGJC7CF.js.map +1 -0
- package/dist/{chunk-WYAMPEVV.js → chunk-DWFVDNU5.js} +28 -3
- package/dist/chunk-DWFVDNU5.js.map +1 -0
- package/dist/{chunk-JEKVN7HK.cjs → chunk-IBNIRT7J.cjs} +251 -2
- package/dist/chunk-IBNIRT7J.cjs.map +1 -0
- package/dist/{chunk-TLTG3BTC.js → chunk-OUZU4Z5B.js} +2 -2
- package/dist/{chunk-TLTG3BTC.js.map → chunk-OUZU4Z5B.js.map} +1 -1
- package/dist/{chunk-5D7SJIO4.cjs → chunk-PKWANLT7.cjs} +2 -2
- package/dist/{chunk-5D7SJIO4.cjs.map → chunk-PKWANLT7.cjs.map} +1 -1
- package/dist/client/index.cjs +287 -9
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +2 -2
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +285 -10
- package/dist/client/index.js.map +1 -1
- package/dist/client/react/index.cjs +375 -13
- package/dist/client/react/index.cjs.map +1 -1
- package/dist/client/react/index.d.cts +53 -3
- package/dist/client/react/index.d.ts +53 -3
- package/dist/client/react/index.js +369 -14
- package/dist/client/react/index.js.map +1 -1
- package/dist/cms/contentful.cjs +138 -0
- package/dist/cms/contentful.cjs.map +1 -0
- package/dist/cms/contentful.d.cts +57 -0
- package/dist/cms/contentful.d.ts +57 -0
- package/dist/cms/contentful.js +134 -0
- package/dist/cms/contentful.js.map +1 -0
- package/dist/{cookie-names-QYMiEMAq.d.cts → cookie-names-BACctagz.d.cts} +1 -1
- package/dist/{cookie-names-8FxbGKGS.d.ts → cookie-names-CLqtmGBM.d.ts} +1 -1
- package/dist/index.cjs +35 -23
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +2 -2
- package/dist/next/index.cjs +41 -9
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.d.cts +32 -3
- package/dist/next/index.d.ts +32 -3
- package/dist/next/index.js +14 -3
- package/dist/next/index.js.map +1 -1
- package/dist/{api-URhxxi4x.d.cts → personalize-content-Clc1oMYY.d.cts} +152 -69
- package/dist/{api-URhxxi4x.d.ts → personalize-content-Clc1oMYY.d.ts} +152 -69
- package/dist/server/index.cjs +29 -17
- package/dist/server/index.d.cts +5 -4
- package/dist/server/index.d.ts +5 -4
- package/dist/server/index.js +4 -4
- package/dist/xenia-sdk.iife.js +3 -3
- package/dist/xenia-sdk.iife.js.map +1 -1
- package/dist/{xenia-server-Cti94W49.d.cts → xenia-server-BWhWD0La.d.ts} +15 -1
- package/dist/{xenia-server-DDtQp6Wi.d.ts → xenia-server-o_wDOcei.d.cts} +15 -1
- package/package.json +15 -1
- package/dist/chunk-FYSEKFIY.js.map +0 -1
- package/dist/chunk-JEKVN7HK.cjs.map +0 -1
- package/dist/chunk-U2WBBOYT.cjs.map +0 -1
- package/dist/chunk-WYAMPEVV.js.map +0 -1
package/dist/xenia-sdk.iife.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var Xenia=(function(exports){'use strict';var qe=new Set(["banner","popup","modal","inline"]),Je=new Set(["top-left","top-right","bottom-left","bottom-right","top","bottom"]),De=new Set(["standard","spin-wheel"]),_e=new Set(["swap","hide","show","setContent","redirect",...qe]);function E(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function u(n){return typeof n=="string"?n:void 0}function ce(n){return typeof n=="number"?n:void 0}function ze(n){if(!E(n))return null;let e=u(n.type);if(!e||!_e.has(e))return null;if(e==="redirect"){let i=u(n.url);return i?{type:e,url:i}:null}if(e==="hide"||e==="show"){let i=u(n.target);return i?{type:e,target:i}:null}if(e==="swap"||e==="setContent"){let i=u(n.target);return i?{type:e,target:i,html:u(n.html),text:u(n.text)}:null}let t=E(n.cta)?{label:u(n.cta.label)??"",url:u(n.cta.url),event:u(n.cta.event)}:void 0;return {type:e,target:u(n.target),title:u(n.title),message:u(n.message),imageUrl:u(n.imageUrl),html:u(n.html),cta:t&&(t.label||t.url)?t:void 0,dismissAfterMs:ce(n.dismissAfterMs),position:Fe(n.position),widgetType:Ne(n.widgetType),segments:Xe(n.segments),formSubmit:Be(n.formSubmit),style:je(n.style),spinnerHtml:u(n.spinnerHtml),winHtml:u(n.winHtml),lossHtml:u(n.lossHtml)}}function Fe(n){let e=u(n);return e&&Je.has(e)?e:void 0}function Ne(n){let e=u(n);return e&&De.has(e)?e:void 0}function Xe(n){if(!Array.isArray(n))return;let e=[];for(let t of n){if(!E(t))continue;let i=u(t.id),r=u(t.label);!i||!r||e.push({id:i,label:r,colorHex:u(t.colorHex),isLoss:t.isLoss===true});}return e.length?e:void 0}function Be(n){if(!E(n))return;let e=u(n.mode);if(e)return {requiresResolve:n.requiresResolve===true,mode:e,flowRef:u(n.flowRef),bindingRef:u(n.bindingRef),successDisplayMs:ce(n.successDisplayMs)}}function je(n){if(!E(n))return;let e={hideCloseButton:n.hideCloseButton===true,hideOverlay:n.hideOverlay===true};return e.hideCloseButton||e.hideOverlay?e:void 0}function U(n){let e;if(Array.isArray(n)?e=n:E(n)&&Array.isArray(n.xeniaActions)&&(e=n.xeniaActions),!Array.isArray(e))return [];let t=[];for(let i of e){let r=ze(i);r&&t.push(r);}return t}var Ue="https://engine.xeniamartech.com/xenia";function T(){return typeof window<"u"&&typeof document<"u"}function ue(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 pe(n){return new Promise(e=>setTimeout(e,n))}var x=class extends Error{constructor(t,i,r){super(r??`Request failed with status ${t}`);this.status=t;this.data=i;this.name="HttpError";}status;data},K=class extends Error{constructor(t){super(`Circuit open for ${t}: failing fast until the cooldown passes`);this.endpoint=t;this.name="CircuitOpenError";}endpoint},H=new Map,W=class{baseUrl;defaultHeaders;timeout;retry;debug;breaker;constructor(e){this.baseUrl=(e.baseUrl??Ue).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;let t=e.circuitBreaker===true?{}:e.circuitBreaker||null;this.breaker=t&&{failureThreshold:t.failureThreshold??3,cooldownMs:t.cooldownMs??3e4};}async request(e){if(!this.breaker)return this.send(e);let t=ue(this.baseUrl+e.path,e.query),i=H.get(t)??{failures:0,openedAt:0};if(i.openedAt){if(Date.now()-i.openedAt<this.breaker.cooldownMs)throw new K(t);i.openedAt=0,i.failures=this.breaker.failureThreshold-1;}try{let r=await this.send(e);return H.delete(t),r}catch(r){throw r instanceof x&&!this.isRetryableStatus(r.status)?(H.delete(t),r):(i.failures+=1,i.failures>=this.breaker.failureThreshold&&(i.openedAt=Date.now(),this.log(`circuit opened for ${e.path} after ${i.failures} failures`)),H.set(t,i),r)}}async send(e){let t=ue(this.baseUrl+e.path,e.query),i=e.method??"GET",r={"Content-Type":"application/json",...this.defaultHeaders,...e.headers},s=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,c;for(let d=0;d<a;d++)try{let p=await this.fetchWithTimeout(t,{method:i,headers:r,body:s,...e.keepalive?{keepalive:!0}:{}},o),m=await this.parseBody(p);if(p.ok)return {response:p,data:m};if(this.isRetryableStatus(p.status)&&d<a-1){let k=this.retryAfterMs(p,l,d);this.log(`retrying ${e.path} after ${k}ms (status ${p.status})`),await pe(k);continue}throw new x(p.status,m)}catch(p){if(c=p,p instanceof x)throw p;if(d<a-1){let m=l*2**d;this.log(`retrying ${e.path} after ${m}ms (network error)`),await pe(m);continue}}throw c instanceof Error?c:new Error("Request failed")}async fetchWithTimeout(e,t,i){let r=new AbortController,s=setTimeout(()=>r.abort(),i);try{return await fetch(e,{...t,signal:r.signal})}catch(o){throw o instanceof Error&&o.name==="AbortError"?new Error(`Request timeout after ${i}ms`,{cause:o}):o}finally{clearTimeout(s);}}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 r=e.headers.get("Retry-After");if(r){let s=Number(r);if(!Number.isNaN(s))return s*1e3}return t*2**i}log(e){this.debug&&console.warn(`[xenia] ${e}`);}};function Ke(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 V=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=Ke(t),r=i?i-3e4:e+5*6e4;return this.cached={token:t,expiresAt:r},t}).finally(()=>{this.inflight=null;}),this.inflight}};function he(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function Qe(n){return n!==void 0&&he(n)?n:void 0}function w(n){let e={};for(let[t,i]of Object.entries(n))i!==void 0&&(e[t]=i);return e}var L=class{http;tenantId;environmentKey;tokenProvider;constructor(e){this.tenantId=e.tenantId,this.environmentKey=e.environmentKey,this.tokenProvider=new V(e),this.http=new W({baseUrl:e.baseUrl,defaultHeaders:e.headers,timeout:e.timeout,retry:e.retry,circuitBreaker:e.circuitBreaker,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:r,data:s}=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:r.status,body:s,actions:U(s),receivedAt:Date.now()}}async submitWidget(e,t){let{response:i,data:r}=await this.http.request({method:"POST",path:"/widget-submissions",query:{ref:e},headers:await this.authHeaders(),body:t??{},noRetry:true}),s=he(r)?r:{};return {status:i.status,body:r,actions:U(r),prize:Qe(s.prize),alreadyPlayed:s.alreadyPlayed===true,dispatched:s.dispatched===true,dispatchError:typeof s.dispatchError=="string"?s.dispatchError:void 0,widgetType:typeof s.widgetType=="string"?s.widgetType:void 0,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:w({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:w({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:w({items:e,data:t.data,locale:t.locale})});return i}};var $="xenia";function Q(n=$){return `${n||$}_vid`}function me(n=$){return `${n||$}_consent`}function fe(n,e,t=365){return `${me(e)}=${encodeURIComponent(JSON.stringify(n))}; path=/; max-age=${Math.floor(t*86400)}; SameSite=Lax`}var Ge=new Set(["eventId","eventType","journeyId","deviceId","visitorId","customerId","email","utmSource","utmMedium","utmCampaign","utmContent","utmId","url","referrer","path","query"]);function ge(n){let e={};for(let[t,i]of Object.entries(n))i!==void 0&&(e[t]=i);return e}function ye(n){let e={},t={};if(n.props)for(let[r,s]of Object.entries(n.props))s!==void 0&&(Ge.has(r)?t[r]=s:e[r]=s);return {...e,...t,...ge(n.context??{}),...ge(n.identity??{}),eventId:n.eventId,...n.eventType?{eventType:n.eventType}:{},...n.journeyId?{journeyId:n.journeyId}:{}}}var A="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ye(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 g(n=Date.now()){let e="",t=n;for(let s=9;s>=0;s--)e=A[t%32]+e,t=Math.floor(t/32);let i=Ye(16),r="";for(let s=0;s<16;s++)r+=A[i[s]%32];return e+r}var G=26;function ve(n){if(n.length<=G)return n;let e="";for(let i of [2166136261,16777619]){let r=i>>>0;for(let s=0;s<n.length;s++)r^=n.charCodeAt(s),r=Math.imul(r,16777619)>>>0,e+=A[r%32];}let t="";for(let i=0;i<G;i++){let r=i+1;for(let s=i;s<e.length;s+=G)r=r*31+A.indexOf(e[s])>>>0;t+=A[r%32];}return t}var q=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();}},J=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 D=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 x&&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 Ze=new Set(["click","view-port","page-load"]);function be(n){let e=n.indexOf("&");if(e===-1)return null;let t=n.slice(0,e),i=n.slice(e+1);return !t||!Ze.has(i)?null:{eventId:t,interactionType:i}}function xe(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"),r=n.getAttribute("data-xenia-personalized");return {contentKey:e,contentEntryId:t??void 0,baseEntryId:i??void 0,personalized:r==null?void 0:r==="true"}}var _=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 r=i.closest(`[${e}]`);if(r){let s=r.getAttribute(e),o=s?be(s):null;o&&o.interactionType==="click"&&!this.throttled(r)&&this.opts.fire(o.eventId,"click");}if(this.opts.fireSlot){let s=i.closest("[data-xenia-slot]");if(s){let o=xe(s);o&&!this.throttled(s)&&this.opts.fireSlot("click",o);}}},document.addEventListener("click",this.clickHandler);}observeSlot(e){if(!this.opts.fireSlot||this.slotObservers.has(e))return;let t=xe(e);if(!t)return;let i=this.opts.fireSlot,{threshold:r,rootMargin:s}=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:r,rootMargin:s});o.observe(e),this.slotObservers.set(e,o);}observeViewport(e,t){if(this.observers.has(e))return;let{threshold:i,rootMargin:r,triggerOnce:s}=this.opts.viewport,o=new IntersectionObserver(a=>{for(let l of a)l.isIntersecting&&(s&&this.triggered.has(e)||this.throttled(e)||(this.opts.fire(t,"view-port"),s&&(this.triggered.add(e),o.disconnect(),this.observers.delete(e))));},{threshold:i,rootMargin:r});o.observe(e),this.observers.set(e,o);}handleElement(e){let t=e.getAttribute(this.attr());if(!t)return;let i=be(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 r=i;this.handleElement(r),this.opts.fireSlot&&r.matches("[data-xenia-slot]")&&this.observeSlot(r),this.scan(r);}}),this.mutationObserver.observe(document.body,{childList:true,subtree:true});}};var et=1800*1e3,z=class{prefix;cookie;deviceId=null;journeyId=null;sessionId=null;constructor(e="xenia",t=true){this.prefix=e,this.cookie=tt(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}}setCustomerId(e){try{e?localStorage.setItem(this.key("customer_id"),e):localStorage.removeItem(this.key("customer_id"));}catch{}}getCustomerId(){try{return localStorage.getItem(this.key("customer_id"))}catch{return null}}setEmail(e){try{e?localStorage.setItem(this.key("email"),e):localStorage.removeItem(this.key("email"));}catch{}}getEmail(){try{return localStorage.getItem(this.key("email"))}catch{return null}}getSessionId(){let e=this.key("session_id"),t=this.key("session_last_activity"),i=Date.now();try{let r=sessionStorage.getItem(e),s=Number(sessionStorage.getItem(t)),a=r&&Number.isFinite(s)&&i-s<et?r:g(i);return sessionStorage.setItem(e,a),sessionStorage.setItem(t,String(i)),this.sessionId=a,a}catch{return this.sessionId||(this.sessionId=g(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"),r=this.utmParam("utm_campaign"),s=this.utmParam("utm_content"),o=this.utmParam("utm_id");t&&(e.utmSource=t),i&&(e.utmMedium=i),r&&(e.utmCampaign=r),s&&(e.utmContent=s),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 tt(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 F(n){let e={};return n.querySelectorAll("[data-xenia-field]").forEach(t=>{let i=t.getAttribute("data-xenia-field");i&&(e[i]=nt(t));}),e}function nt(n){return n instanceof HTMLInputElement?n.type==="checkbox"?n.checked?n.value||"on":"":n.type==="radio"?n.checked?n.value:"":n.value:n instanceof HTMLTextAreaElement||n instanceof HTMLSelectElement?n.value:n.textContent?.trim()??""}function we(n,e){n&&(n instanceof HTMLButtonElement||n instanceof HTMLInputElement||n instanceof HTMLSelectElement||n instanceof HTMLTextAreaElement||n instanceof HTMLFieldSetElement?n.disabled=e:e?n.setAttribute("aria-disabled","true"):n.removeAttribute("aria-disabled"));}function Y(n,e){let t=n.querySelector("[data-xenia-error]");t&&(t.textContent=e);}var Se="xenia-form-submit-style";function it(n){if(n.querySelector(`#${Se}`))return;let e=document.createElement("style");e.id=Se,e.textContent="@keyframes xenia-submit-spin{to{transform:rotate(360deg)}}[data-xenia-submitting]::after{content:'';display:inline-block;width:0.85em;height:0.85em;margin-left:0.5em;vertical-align:-0.15em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:xenia-submit-spin 0.6s linear infinite}",n.prepend(e);}function Z(n,e){n&&(e?n.setAttribute("data-xenia-submitting",""):n.removeAttribute("data-xenia-submitting"));}function rt(n,e){if(!e)return;let t=n instanceof ShadowRoot?n.host:n;t instanceof HTMLElement?(t.style.transition="opacity 220ms ease, transform 220ms ease",t.style.opacity="0",t.style.transform="scale(0.96)",window.setTimeout(e,220)):e();}var st=900;function ot(n,e){let t=n.querySelector("[data-xenia-success]");return t?(t instanceof HTMLElement?t.hidden=false:t.removeAttribute("hidden"),e?e.hidden=true:n.querySelectorAll("[data-xenia-field], [data-xenia-submit]").forEach(i=>{i.hidden=true;}),true):false}function Ee(n,e,t){let i=n.querySelector("form"),r=false;it(n);let s=(o,a)=>{if(r)return;if(!e.formSubmit){Y(n,"This form isn't connected yet.");return}r=true,Y(n,""),we(o,true),Z(o,true);let l=Date.now(),c=e.formSubmit.successDisplayMs??st;t.submitWidgetForm(a).then(()=>{Z(o,false),ot(n,i);let d=Math.max(0,c-(Date.now()-l));window.setTimeout(()=>rt(n,t.dismiss),d);}).catch(()=>{Z(o,false),we(o,false),Y(n,"Something went wrong. Please try again.");}).finally(()=>{r=false;});};i&&i.addEventListener("submit",o=>{o.preventDefault();let a={};new FormData(i).forEach((c,d)=>{typeof c=="string"&&(a[d]=c);});let l=o.submitter??i.querySelector('[type="submit"], button:not([type])');s(l,{...F(n),...a});}),n.querySelectorAll("[data-xenia-submit]").forEach(o=>{i?.contains(o)||o.addEventListener("click",()=>s(o,F(n)));});}function ee(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Ce(n){return ee(n).replace(/"/g,""")}function N(n,e){e&&n.querySelectorAll(".xenia-close, [data-xenia-close], [class*='close' i], [id*='close' i], [class*='backdrop' i], [id*='backdrop' i]").forEach(i=>{i.removeAttribute("onclick"),i.addEventListener("click",e);}),n.querySelectorAll("[class*='backdrop' i], [id*='backdrop' i]").forEach(t=>{t instanceof HTMLElement&&t.children.length===0&&!t.textContent?.trim()&&(t.style.opacity="0.5");});}var C=260,M=C/2,R=C/2,Re=["#7c3aed","#2563eb","#059669","#d97706","#dc2626","#0891b2"],at="transform 3.2s cubic-bezier(0.15, 0.85, 0.25, 1)",lt='<div class="xenia-wheel-pointer" aria-hidden="true"></div>',ne=320,ke=`opacity ${ne}ms ease, transform ${ne}ms ease`,dt=900,te=(n,e)=>`perspective(${dt}px) translateZ(${e}px) scale(${n})`;function ie(n,e){let t=n*Math.PI/180;return {x:R+e*Math.sin(t),y:R-e*Math.cos(t)}}function ct(n,e){let t=ie(n,M),i=ie(e,M),r=e-n>180?1:0;return `M ${R},${R} L ${t.x},${t.y} A ${M},${M} 0 ${r} 1 ${i.x},${i.y} Z`}function ut(n,e,t=0){if(e<=0)return 0;let i=360/e,s=(360-(n*i+i/2))%360;return t*360+s}function Te(n,e){let t=n?Array.from(n.children):[],i=e?Array.from(e.children):[];e&&(e.hidden=false),i.forEach(r=>{r instanceof HTMLElement&&(r.style.transition="none",r.style.opacity="0",r.style.transform=te(.94,-60));}),i.forEach(r=>{r instanceof HTMLElement&&r.offsetHeight;}),Ae(()=>{t.forEach(r=>{r instanceof HTMLElement&&(r.style.transition=ke,r.style.opacity="0",r.style.transform=te(.94,-60));}),i.forEach(r=>{r instanceof HTMLElement&&(r.style.transition=ke,r.style.opacity="1",r.style.transform=te(1,0));});}),n&&setTimeout(()=>{n.hidden=true;},ne);}function Ae(n){typeof requestAnimationFrame=="function"?requestAnimationFrame(n):setTimeout(n,0);}function pt(n){let t=360/(n.length||1),i=n.map((r,s)=>{let o=s*t,a=o+t,l=r.colorHex||Re[s%Re.length],c=o+t/2,d=ie(c,M*.62);return `<path d="${ct(o,a)}" fill="${Ce(l)}" stroke="#fff" stroke-width="1"></path><text x="${d.x}" y="${d.y}" fill="#fff" font-size="12" text-anchor="middle" transform="rotate(${c} ${d.x} ${d.y})">${ee(r.label)}</text>`}).join("");return `<svg class="xenia-wheel-svg" viewBox="0 0 ${C} ${C}" width="${C}" height="${C}"><g class="xenia-wheel-dial">${i}</g><circle class="xenia-wheel-hub" cx="${R}" cy="${R}" r="6"></circle></svg>`}var Me={html(n){return `<div class="xenia-spin-wheel"><div data-xenia-wheel-face>${n.spinnerHtml??""}</div><div class="xenia-widget-result" data-xenia-wheel-result hidden>${n.winHtml??""}</div><div class="xenia-widget-result" data-xenia-wheel-loss hidden>${n.lossHtml??""}</div></div>`},wire(n,e,t){N(n,t.dismiss);let i=e.segments??[],r=n.querySelector("[data-xenia-wheel-face]"),s=n.querySelector("[data-xenia-spin]"),o=n.querySelector("[data-xenia-wheel-result]"),a=n.querySelector("[data-xenia-wheel-loss]"),l=n.querySelector("[data-xenia-error]"),c=n.querySelector("[data-xenia-wheel-slot]");c&&c.insertAdjacentHTML("afterbegin",pt(i)+lt);let d=n.querySelector(".xenia-wheel-dial");if(!s||!e.formSubmit)return;n.querySelectorAll("[data-xenia-wheel-cta]").forEach(v=>{v.addEventListener("click",()=>t.fireCta());});let p=(v,f,b)=>{n.querySelectorAll("[data-xenia-wheel-prize]").forEach(S=>{S.textContent=v;});let O=f?a:o,I=f?o:a;I&&(I.hidden=true),Te(r,O),b||(k=true,n.querySelectorAll("[data-xenia-spin-again]").forEach(S=>{S.hidden=true;}));},m=false,k=false;n.querySelectorAll("[data-xenia-spin-again]").forEach(v=>{v.addEventListener("click",()=>{if(k)return;let f=o&&!o.hidden?o:a&&!a.hidden?a:null;f&&(m=false,s.disabled=false,l&&(l.textContent=""),Te(f,r));});}),s.addEventListener("click",()=>{if(m)return;m=true,s.disabled=true,l&&(l.textContent="");let v=F(n);t.submitWidgetForm(v).then(f=>{let b=i.findIndex($e=>$e.id===f.prize?.segmentId),O=f.prize?.label??i[b]?.label??"",I=b>=0&&!!i[b]?.isLoss,S=f.alreadyPlayed!==true;if(b<0||!d){p(O,I,S);return}let We=3+Math.floor(Math.random()*3),Ve=ut(b,i.length||1,We),le=/rotate\(([-\d.]+)deg\)/.exec(d.style.transform),Le=le?parseFloat(le[1]):0;d.style.transition="none",d.style.transform=`rotate(${Le%360}deg)`,d.getBoundingClientRect(),d.style.transition=at;let de=()=>{d.removeEventListener("transitionend",de),p(O,I,S);};d.addEventListener("transitionend",de),Ae(()=>{d.style.transform=`rotate(${Ve}deg)`;});}).catch(()=>{m=false,s.disabled=false,l&&(l.textContent="Something went wrong. Please try again.");});});}};var re={"spin-wheel":Me};function j(n,e=document){if(!n)return null;let t=e.querySelector(`[data-xenia-slot="${ht(n)}"]`);if(t)return t;try{return e.querySelector(n)}catch{return null}}function ht(n){let e=window;return e.CSS?.escape?e.CSS.escape(n):n.replace(/["\\]/g,"\\$&")}function X(n,e){let t=j(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 se(n){let e=j(n);return !e||!(e instanceof HTMLElement)?false:(e.dataset.xeniaHidden="1",e.style.setProperty("display","none","important"),true)}function oe(n){let e=j(n);return !e||!(e instanceof HTMLElement)?false:(delete e.dataset.xeniaHidden,e.style.removeProperty("display"),true)}var mt=new Set(["banner","popup","modal","inline"]);function ft(n){return mt.has(n)}var B=class{host=null;shadow=null;onCta;messageTemplate;messageStyles;messageComponent;submitWidgetFormFn;mounted=new Map;constructor(e,t){this.onCta=e,this.messageTemplate=t?.messageTemplate,this.messageStyles=t?.messageStyles,this.messageComponent=t?.messageComponent,this.submitWidgetFormFn=t?.submitWidgetForm;}apply(e){let t=0;for(let i of e)this.applyOne(i)&&t++;return t}applyOne(e){switch(e.type){case "swap":return X(e.target,{html:e.html,text:e.text});case "setContent":return X(e.target,{html:e.html,text:e.text});case "hide":return se(e.target);case "show":return oe(e.target);case "redirect":try{return window.location.assign(e.url),!0}catch{return false}default:return ft(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?`${Oe}
|
|
2
|
-
${this.messageStyles}`:
|
|
1
|
+
var Xenia=(function(exports){'use strict';var Xe=new Set(["banner","popup","modal","inline"]),je=new Set(["top-left","top-right","bottom-left","bottom-right","top","bottom"]),Be=new Set(["standard","spin-wheel"]),Ue=new Set(["swap","hide","show","setContent","redirect",...Xe]);function I(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function f(n){return typeof n=="string"?n:void 0}function fe(n){return typeof n=="number"?n:void 0}function Ke(n){if(!I(n))return null;let e=f(n.type);if(!e||!Ue.has(e))return null;if(e==="redirect"){let i=f(n.url);return i?{type:e,url:i}:null}if(e==="hide"||e==="show"){let i=f(n.target);return i?{type:e,target:i}:null}if(e==="swap"||e==="setContent"){let i=f(n.target);return i?{type:e,target:i,html:f(n.html),text:f(n.text)}:null}let t=I(n.cta)?{label:f(n.cta.label)??"",url:f(n.cta.url),event:f(n.cta.event)}:void 0;return {type:e,target:f(n.target),title:f(n.title),message:f(n.message),imageUrl:f(n.imageUrl),html:f(n.html),cta:t&&(t.label||t.url)?t:void 0,dismissAfterMs:fe(n.dismissAfterMs),position:Qe(n.position),widgetType:Ge(n.widgetType),segments:Ye(n.segments),formSubmit:Ze(n.formSubmit),style:et(n.style),spinnerHtml:f(n.spinnerHtml),winHtml:f(n.winHtml),lossHtml:f(n.lossHtml)}}function Qe(n){let e=f(n);return e&&je.has(e)?e:void 0}function Ge(n){let e=f(n);return e&&Be.has(e)?e:void 0}function Ye(n){if(!Array.isArray(n))return;let e=[];for(let t of n){if(!I(t))continue;let i=f(t.id),r=f(t.label);!i||!r||e.push({id:i,label:r,colorHex:f(t.colorHex),isLoss:t.isLoss===true});}return e.length?e:void 0}function Ze(n){if(!I(n))return;let e=f(n.mode);if(e)return {requiresResolve:n.requiresResolve===true,mode:e,flowRef:f(n.flowRef),bindingRef:f(n.bindingRef),successDisplayMs:fe(n.successDisplayMs)}}function et(n){if(!I(n))return;let e={hideCloseButton:n.hideCloseButton===true,hideOverlay:n.hideOverlay===true};return e.hideCloseButton||e.hideOverlay?e:void 0}function Y(n){let e;if(Array.isArray(n)?e=n:I(n)&&Array.isArray(n.xeniaActions)&&(e=n.xeniaActions),!Array.isArray(e))return [];let t=[];for(let i of e){let r=Ke(i);r&&t.push(r);}return t}var tt="https://engine.xeniamartech.com/xenia";function O(){return typeof window<"u"&&typeof document<"u"}function ge(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 ye(n){return new Promise(e=>setTimeout(e,n))}var C=class extends Error{constructor(t,i,r){super(r??`Request failed with status ${t}`);this.status=t;this.data=i;this.name="HttpError";}status;data},Z=class extends Error{constructor(t){super(`Circuit open for ${t}: failing fast until the cooldown passes`);this.endpoint=t;this.name="CircuitOpenError";}endpoint},L=new Map,q=class{baseUrl;defaultHeaders;timeout;retry;debug;breaker;constructor(e){this.baseUrl=(e.baseUrl??tt).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;let t=e.circuitBreaker===true?{}:e.circuitBreaker||null;this.breaker=t&&{failureThreshold:t.failureThreshold??3,cooldownMs:t.cooldownMs??3e4};}async request(e){if(!this.breaker)return this.send(e);let t=ge(this.baseUrl+e.path,e.query),i=L.get(t)??{failures:0,openedAt:0};if(i.openedAt){if(Date.now()-i.openedAt<this.breaker.cooldownMs)throw new Z(t);i.openedAt=0,i.failures=this.breaker.failureThreshold-1;}try{let r=await this.send(e);return L.delete(t),r}catch(r){throw r instanceof C&&!this.isRetryableStatus(r.status)?(L.delete(t),r):(i.failures+=1,i.failures>=this.breaker.failureThreshold&&(i.openedAt=Date.now(),this.log(`circuit opened for ${e.path} after ${i.failures} failures`)),L.set(t,i),r)}}async send(e){let t=ge(this.baseUrl+e.path,e.query),i=e.method??"GET",r={"Content-Type":"application/json",...this.defaultHeaders,...e.headers},s=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,d=e.retry?.baseDelayMs??this.retry.baseDelayMs,l;for(let c=0;c<a;c++)try{let p=await this.fetchWithTimeout(t,{method:i,headers:r,body:s,...e.keepalive?{keepalive:!0}:{}},o),y=await this.parseBody(p);if(p.ok)return {response:p,data:y};if(this.isRetryableStatus(p.status)&&c<a-1){let u=this.retryAfterMs(p,d,c);this.log(`retrying ${e.path} after ${u}ms (status ${p.status})`),await ye(u);continue}throw new C(p.status,y)}catch(p){if(l=p,p instanceof C)throw p;if(c<a-1){let y=d*2**c;this.log(`retrying ${e.path} after ${y}ms (network error)`),await ye(y);continue}}throw l instanceof Error?l:new Error("Request failed")}async fetchWithTimeout(e,t,i){let r=new AbortController,s=setTimeout(()=>r.abort(),i);try{return await fetch(e,{...t,signal:r.signal})}catch(o){throw o instanceof Error&&o.name==="AbortError"?new Error(`Request timeout after ${i}ms`,{cause:o}):o}finally{clearTimeout(s);}}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 r=e.headers.get("Retry-After");if(r){let s=Number(r);if(!Number.isNaN(s))return s*1e3}return t*2**i}log(e){this.debug&&console.warn(`[xenia] ${e}`);}};function nt(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 $=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=nt(t),r=i?i-3e4:e+5*6e4;return this.cached={token:t,expiresAt:r},t}).finally(()=>{this.inflight=null;}),this.inflight}};function ve(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function it(n){return n!==void 0&&ve(n)?n:void 0}function E(n){let e={};for(let[t,i]of Object.entries(n))i!==void 0&&(e[t]=i);return e}var z=class{http;tenantId;environmentKey;tokenProvider;constructor(e){this.tenantId=e.tenantId,this.environmentKey=e.environmentKey,this.tokenProvider=new $(e),this.http=new q({baseUrl:e.baseUrl,defaultHeaders:e.headers,timeout:e.timeout,retry:e.retry,circuitBreaker:e.circuitBreaker,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:r,data:s}=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:r.status,body:s,actions:Y(s),receivedAt:Date.now()}}async submitWidget(e,t){let{response:i,data:r}=await this.http.request({method:"POST",path:"/widget-submissions",query:{ref:e},headers:await this.authHeaders(),body:t??{},noRetry:true}),s=ve(r)?r:{};return {status:i.status,body:r,actions:Y(r),prize:it(s.prize),alreadyPlayed:s.alreadyPlayed===true,dispatched:s.dispatched===true,dispatchError:typeof s.dispatchError=="string"?s.dispatchError:void 0,widgetType:typeof s.widgetType=="string"?s.widgetType:void 0,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:E({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:E({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:E({items:e,data:t.data,locale:t.locale})});return i}async resolveEntries(e,t={}){let{data:i}=await this.http.request({method:"POST",path:"/api/personalization/resolve-entries",headers:await this.authHeaders(),body:E({entryIds:e,data:t.data,locale:t.locale})});return i}};var D="xenia";function ee(n=D){return `${n||D}_vid`}function be(n=D){return `${n||D}_consent`}function xe(n,e,t=365){return `${be(e)}=${encodeURIComponent(JSON.stringify(n))}; path=/; max-age=${Math.floor(t*86400)}; SameSite=Lax`}var rt=new Set(["eventId","eventType","journeyId","deviceId","visitorId","customerId","email","utmSource","utmMedium","utmCampaign","utmContent","utmId","url","referrer","path","query"]);function we(n){let e={};for(let[t,i]of Object.entries(n))i!==void 0&&(e[t]=i);return e}function Se(n){let e={},t={};if(n.props)for(let[r,s]of Object.entries(n.props))s!==void 0&&(rt.has(r)?t[r]=s:e[r]=s);return {...e,...t,...we(n.context??{}),...we(n.identity??{}),eventId:n.eventId,...n.eventType?{eventType:n.eventType}:{},...n.journeyId?{journeyId:n.journeyId}:{}}}var W="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function st(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 k(n=Date.now()){let e="",t=n;for(let s=9;s>=0;s--)e=W[t%32]+e,t=Math.floor(t/32);let i=st(16),r="";for(let s=0;s<16;s++)r+=W[i[s]%32];return e+r}var te=26;function Ee(n){if(n.length<=te)return n;let e="";for(let i of [2166136261,16777619]){let r=i>>>0;for(let s=0;s<n.length;s++)r^=n.charCodeAt(s),r=Math.imul(r,16777619)>>>0,e+=W[r%32];}let t="";for(let i=0;i<te;i++){let r=i+1;for(let s=i;s<e.length;s+=te)r=r*31+W.indexOf(e[s])>>>0;t+=W[r%32];}return t}var ot=n=>n&&typeof n=="object"&&typeof structuredClone=="function"?structuredClone(n):n;async function ie(n,e){let{cms:t}=e,i=e.maxRounds??3,r=Date.now()+(e.timeoutMs??300),s=[],o=u=>{s.push(u);try{e.onApplied?.(u);}catch{}},a=n;try{!e.inPlace&&typeof structuredClone=="function"&&(a=structuredClone(a)),a=t.prepare?t.prepare(a):a;}catch(u){return {content:n,applied:s,complete:false,error:u}}let d={root:a},l=new WeakSet,c=new Map,p=[{parent:d,key:"root",value:d.root}],y=(u,m,g)=>{l.add(u.entry),t.clearMarker?.(u.entry);let v=m.items.map(ot);if(!m.decision||v.length===0)return lt(u,t);for(let h of v)h&&typeof h=="object"&&l.add(h);let b=m.decision.op??u.marker.op??"replace",S=Ie(u,b,m.decision.field??u.marker.field,v,t);return o({target:u.id,kind:"runtime",op:b,entryIds:v.map(h=>t.entryId(h)).filter(h=>!!h),contentKey:m.decision.contentKey,bucket:m.decision.bucket,round:g}),S};for(let u=0;;u++){let m=at(p,t,l,u,o,h=>{let w=c.get(h.id);return w?y(h,w,u):void 0});if(m.size===0)return {content:d.root,applied:s,complete:true};if(!e.resolve||u>=i)return {content:d.root,applied:s,complete:!e.resolve};ke(e,{content:d.root,round:u,pending:[...m.keys()]});let g,v,b;try{g=await Ce(e.resolve([...m.keys()]),r),{entriesById:v,queried:b}=await Ce(dt(g,t,e.locale),r);}catch(h){return {content:d.root,applied:s,complete:false,error:h===ne?void 0:h}}let S=new Map(g.map(h=>[h.target,h]));p=[];for(let h of m.values()){let w=S.get(h.id),G=w?w.ids?w.ids.map(P=>v.get(P)).filter(P=>P!==void 0):b.get(w)??[]:[],M={decision:w,items:G};c.set(h.id,M),p.push(...y(h,M,u));}ke(e,{content:d.root,round:u,pending:[]});}}function ke(n,e){try{n.onProgress?.(e);}catch{}}function at(n,e,t,i,r,s){let o=new Map,a=new WeakSet,d=new WeakSet,l=[...n];for(;l.length>0;){let c=l.shift(),p=c.value;if(!p||typeof p!="object"||d.has(p))continue;let y=t.has(p)?void 0:e.entryId(p),u=y?e.marker(p):null;if(y&&u?.kind==="runtime"){let m=s({id:y,marker:u,entry:p,slots:[c]});if(m){l.push(...m);continue}let g=o.get(y);if(g)g.slots.push(c);else if(o.set(y,{id:y,marker:u,entry:p,slots:[c]}),u.op==="items"&&u.field){let v=e.getField(p,u.field);v&&typeof v=="object"&&d.add(v),l.push(...Re(p));}continue}if(y&&u?.kind==="static"){let m=e.staticVariants(p).filter(g=>g&&typeof g=="object");if(t.add(p),e.clearMarker?.(p),m.length>0){for(let b of m)t.add(b);let g=u.op??"replace",v={entry:p,slots:[c]};l.push(...Ie(v,g,u.field,m,e)),r({target:y,kind:"static",op:g,entryIds:m.map(b=>e.entryId(b)).filter(b=>!!b),round:i});continue}}a.has(p)||(a.add(p),l.push(...Re(p)));}return o}function Ie(n,e,t,i,r){if(e==="items"){if(t)return r.setField(n.entry,t,i),[{parent:n.entry,key:t,value:r.getField(n.entry,t)}];if(r.mergeItems)return r.mergeItems(n.entry,i[0]),n.slots.map(o=>({...o,value:n.entry}));e="replace";}let s=[];for(let o of n.slots){let a=e==="expand"&&Array.isArray(o.parent)?i:[i[0]];if(Array.isArray(o.parent)){let d=o.parent.indexOf(n.entry);if(d<0)continue;o.parent.splice(d,1,...a);}else o.parent[o.key]=a[0];for(let d of a)s.push({parent:o.parent,key:o.key,value:d});}return s}function lt(n,e){return n.marker.op==="items"&&n.marker.field?[{parent:n.entry,key:n.marker.field,value:e.getField(n.entry,n.marker.field)}]:n.slots.map(t=>({...t,value:n.entry}))}function Re(n){return Array.isArray(n)?n.map((e,t)=>({parent:n,key:t,value:e})):Object.keys(n).map(e=>({parent:n,key:e,value:n[e]}))}async function dt(n,e,t){let i=[...new Set(n.flatMap(l=>l.ids??[]))],r=n.filter(l=>!l.ids&&l.query),[s,...o]=await Promise.all([i.length>0?e.fetchEntries(i,t):Promise.resolve([]),...r.map(l=>e.queryEntries(l.query,t).catch(()=>[]))]),a=new Map;for(let l of s){let c=e.entryId(l);c&&a.set(c,l);}let d=new Map;return r.forEach((l,c)=>d.set(l,o[c])),{entriesById:a,queried:d}}var ne=Symbol("timeout");function Ce(n,e){let t=e-Date.now();if(t<=0)return Promise.reject(ne);let i;return Promise.race([n,new Promise((r,s)=>{i=setTimeout(()=>s(ne),t);})]).finally(()=>clearTimeout(i))}async function Te(n,e){let t;try{if(!e.cms.fetchPage)throw new Error("This CMS adapter cannot fetch pages; use personalizeContent(page)");t=await e.cms.fetchPage(n,e.locale);}catch(i){return {content:null,applied:[],complete:false,error:i}}return t==null?{content:null,applied:[],complete:true}:ie(t,e)}var N=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();}},J=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 F=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 C&&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 ct=new Set(["click","view-port","page-load"]);function Ae(n){let e=n.indexOf("&");if(e===-1)return null;let t=n.slice(0,e),i=n.slice(e+1);return !t||!ct.has(i)?null:{eventId:t,interactionType:i}}function Me(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"),r=n.getAttribute("data-xenia-personalized");return {contentKey:e,contentEntryId:t??void 0,baseEntryId:i??void 0,personalized:r==null?void 0:r==="true"}}var _=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 r=i.closest(`[${e}]`);if(r){let s=r.getAttribute(e),o=s?Ae(s):null;o&&o.interactionType==="click"&&!this.throttled(r)&&this.opts.fire(o.eventId,"click");}if(this.opts.fireSlot){let s=i.closest("[data-xenia-slot]");if(s){let o=Me(s);o&&!this.throttled(s)&&this.opts.fireSlot("click",o);}}},document.addEventListener("click",this.clickHandler);}observeSlot(e){if(!this.opts.fireSlot||this.slotObservers.has(e))return;let t=Me(e);if(!t)return;let i=this.opts.fireSlot,{threshold:r,rootMargin:s}=this.opts.viewport,o=new IntersectionObserver(a=>{for(let d of a)d.isIntersecting&&(this.slotImpressed.has(e)||(this.slotImpressed.add(e),i("impression",t),o.disconnect(),this.slotObservers.delete(e)));},{threshold:r,rootMargin:s});o.observe(e),this.slotObservers.set(e,o);}observeViewport(e,t){if(this.observers.has(e))return;let{threshold:i,rootMargin:r,triggerOnce:s}=this.opts.viewport,o=new IntersectionObserver(a=>{for(let d of a)d.isIntersecting&&(s&&this.triggered.has(e)||this.throttled(e)||(this.opts.fire(t,"view-port"),s&&(this.triggered.add(e),o.disconnect(),this.observers.delete(e))));},{threshold:i,rootMargin:r});o.observe(e),this.observers.set(e,o);}handleElement(e){let t=e.getAttribute(this.attr());if(!t)return;let i=Ae(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 r=i;this.handleElement(r),this.opts.fireSlot&&r.matches("[data-xenia-slot]")&&this.observeSlot(r),this.scan(r);}}),this.mutationObserver.observe(document.body,{childList:true,subtree:true});}};var ut=1800*1e3,X=class{prefix;cookie;deviceId=null;journeyId=null;sessionId=null;constructor(e="xenia",t=true){this.prefix=e,this.cookie=pt(t);}key(e){return `${this.prefix}_${e}`}cookieName(){return ee(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}}setCustomerId(e){try{e?localStorage.setItem(this.key("customer_id"),e):localStorage.removeItem(this.key("customer_id"));}catch{}}getCustomerId(){try{return localStorage.getItem(this.key("customer_id"))}catch{return null}}setEmail(e){try{e?localStorage.setItem(this.key("email"),e):localStorage.removeItem(this.key("email"));}catch{}}getEmail(){try{return localStorage.getItem(this.key("email"))}catch{return null}}getSessionId(){let e=this.key("session_id"),t=this.key("session_last_activity"),i=Date.now();try{let r=sessionStorage.getItem(e),s=Number(sessionStorage.getItem(t)),a=r&&Number.isFinite(s)&&i-s<ut?r:k(i);return sessionStorage.setItem(e,a),sessionStorage.setItem(t,String(i)),this.sessionId=a,a}catch{return this.sessionId||(this.sessionId=k(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"),r=this.utmParam("utm_campaign"),s=this.utmParam("utm_content"),o=this.utmParam("utm_id");t&&(e.utmSource=t),i&&(e.utmMedium=i),r&&(e.utmCampaign=r),s&&(e.utmContent=s),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 pt(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 j(n){let e={};return n.querySelectorAll("[data-xenia-field]").forEach(t=>{let i=t.getAttribute("data-xenia-field");i&&(e[i]=mt(t));}),e}function mt(n){return n instanceof HTMLInputElement?n.type==="checkbox"?n.checked?n.value||"on":"":n.type==="radio"?n.checked?n.value:"":n.value:n instanceof HTMLTextAreaElement||n instanceof HTMLSelectElement?n.value:n.textContent?.trim()??""}function Pe(n,e){n&&(n instanceof HTMLButtonElement||n instanceof HTMLInputElement||n instanceof HTMLSelectElement||n instanceof HTMLTextAreaElement||n instanceof HTMLFieldSetElement?n.disabled=e:e?n.setAttribute("aria-disabled","true"):n.removeAttribute("aria-disabled"));}function re(n,e){let t=n.querySelector("[data-xenia-error]");t&&(t.textContent=e);}var Oe="xenia-form-submit-style";function ht(n){if(n.querySelector(`#${Oe}`))return;let e=document.createElement("style");e.id=Oe,e.textContent="@keyframes xenia-submit-spin{to{transform:rotate(360deg)}}[data-xenia-submitting]::after{content:'';display:inline-block;width:0.85em;height:0.85em;margin-left:0.5em;vertical-align:-0.15em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:xenia-submit-spin 0.6s linear infinite}",n.prepend(e);}function se(n,e){n&&(e?n.setAttribute("data-xenia-submitting",""):n.removeAttribute("data-xenia-submitting"));}function ft(n,e){if(!e)return;let t=n instanceof ShadowRoot?n.host:n;t instanceof HTMLElement?(t.style.transition="opacity 220ms ease, transform 220ms ease",t.style.opacity="0",t.style.transform="scale(0.96)",window.setTimeout(e,220)):e();}var gt=900;function yt(n,e){let t=n.querySelector("[data-xenia-success]");return t?(t instanceof HTMLElement?t.hidden=false:t.removeAttribute("hidden"),e?e.hidden=true:n.querySelectorAll("[data-xenia-field], [data-xenia-submit]").forEach(i=>{i.hidden=true;}),true):false}function We(n,e,t){let i=n.querySelector("form"),r=false;ht(n);let s=(o,a)=>{if(r)return;if(!e.formSubmit){re(n,"This form isn't connected yet.");return}r=true,re(n,""),Pe(o,true),se(o,true);let d=Date.now(),l=e.formSubmit.successDisplayMs??gt;t.submitWidgetForm(a).then(()=>{se(o,false),yt(n,i);let c=Math.max(0,l-(Date.now()-d));window.setTimeout(()=>ft(n,t.dismiss),c);}).catch(()=>{se(o,false),Pe(o,false),re(n,"Something went wrong. Please try again.");}).finally(()=>{r=false;});};i&&i.addEventListener("submit",o=>{o.preventDefault();let a={};new FormData(i).forEach((l,c)=>{typeof l=="string"&&(a[c]=l);});let d=o.submitter??i.querySelector('[type="submit"], button:not([type])');s(d,{...j(n),...a});}),n.querySelectorAll("[data-xenia-submit]").forEach(o=>{i?.contains(o)||o.addEventListener("click",()=>s(o,j(n)));});}function oe(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function He(n){return oe(n).replace(/"/g,""")}function B(n,e){e&&n.querySelectorAll(".xenia-close, [data-xenia-close], [class*='close' i], [id*='close' i], [class*='backdrop' i], [id*='backdrop' i]").forEach(i=>{i.removeAttribute("onclick"),i.addEventListener("click",e);}),n.querySelectorAll("[class*='backdrop' i], [id*='backdrop' i]").forEach(t=>{t instanceof HTMLElement&&t.children.length===0&&!t.textContent?.trim()&&(t.style.opacity="0.5");});}var T=260,H=T/2,A=T/2,Ve=["#7c3aed","#2563eb","#059669","#d97706","#dc2626","#0891b2"],vt="transform 3.2s cubic-bezier(0.15, 0.85, 0.25, 1)",bt='<div class="xenia-wheel-pointer" aria-hidden="true"></div>',le=320,Le=`opacity ${le}ms ease, transform ${le}ms ease`,xt=900,ae=(n,e)=>`perspective(${xt}px) translateZ(${e}px) scale(${n})`;function de(n,e){let t=n*Math.PI/180;return {x:A+e*Math.sin(t),y:A-e*Math.cos(t)}}function wt(n,e){let t=de(n,H),i=de(e,H),r=e-n>180?1:0;return `M ${A},${A} L ${t.x},${t.y} A ${H},${H} 0 ${r} 1 ${i.x},${i.y} Z`}function St(n,e,t=0){if(e<=0)return 0;let i=360/e,s=(360-(n*i+i/2))%360;return t*360+s}function $e(n,e){let t=n?Array.from(n.children):[],i=e?Array.from(e.children):[];e&&(e.hidden=false),i.forEach(r=>{r instanceof HTMLElement&&(r.style.transition="none",r.style.opacity="0",r.style.transform=ae(.94,-60));}),i.forEach(r=>{r instanceof HTMLElement&&r.offsetHeight;}),ze(()=>{t.forEach(r=>{r instanceof HTMLElement&&(r.style.transition=Le,r.style.opacity="0",r.style.transform=ae(.94,-60));}),i.forEach(r=>{r instanceof HTMLElement&&(r.style.transition=Le,r.style.opacity="1",r.style.transform=ae(1,0));});}),n&&setTimeout(()=>{n.hidden=true;},le);}function ze(n){typeof requestAnimationFrame=="function"?requestAnimationFrame(n):setTimeout(n,0);}function Et(n){let t=360/(n.length||1),i=n.map((r,s)=>{let o=s*t,a=o+t,d=r.colorHex||Ve[s%Ve.length],l=o+t/2,c=de(l,H*.62);return `<path d="${wt(o,a)}" fill="${He(d)}" stroke="#fff" stroke-width="1"></path><text x="${c.x}" y="${c.y}" fill="#fff" font-size="12" text-anchor="middle" transform="rotate(${l} ${c.x} ${c.y})">${oe(r.label)}</text>`}).join("");return `<svg class="xenia-wheel-svg" viewBox="0 0 ${T} ${T}" width="${T}" height="${T}"><g class="xenia-wheel-dial">${i}</g><circle class="xenia-wheel-hub" cx="${A}" cy="${A}" r="6"></circle></svg>`}var De={html(n){return `<div class="xenia-spin-wheel"><div data-xenia-wheel-face>${n.spinnerHtml??""}</div><div class="xenia-widget-result" data-xenia-wheel-result hidden>${n.winHtml??""}</div><div class="xenia-widget-result" data-xenia-wheel-loss hidden>${n.lossHtml??""}</div></div>`},wire(n,e,t){B(n,t.dismiss);let i=e.segments??[],r=n.querySelector("[data-xenia-wheel-face]"),s=n.querySelector("[data-xenia-spin]"),o=n.querySelector("[data-xenia-wheel-result]"),a=n.querySelector("[data-xenia-wheel-loss]"),d=n.querySelector("[data-xenia-error]"),l=n.querySelector("[data-xenia-wheel-slot]");l&&l.insertAdjacentHTML("afterbegin",Et(i)+bt);let c=n.querySelector(".xenia-wheel-dial");if(!s||!e.formSubmit)return;n.querySelectorAll("[data-xenia-wheel-cta]").forEach(m=>{m.addEventListener("click",()=>t.fireCta());});let p=(m,g,v)=>{n.querySelectorAll("[data-xenia-wheel-prize]").forEach(h=>{h.textContent=m;});let b=g?a:o,S=g?o:a;S&&(S.hidden=true),$e(r,b),v||(u=true,n.querySelectorAll("[data-xenia-spin-again]").forEach(h=>{h.hidden=true;}));},y=false,u=false;n.querySelectorAll("[data-xenia-spin-again]").forEach(m=>{m.addEventListener("click",()=>{if(u)return;let g=o&&!o.hidden?o:a&&!a.hidden?a:null;g&&(y=false,s.disabled=false,d&&(d.textContent=""),$e(g,r));});}),s.addEventListener("click",()=>{if(y)return;y=true,s.disabled=true,d&&(d.textContent="");let m=j(n);t.submitWidgetForm(m).then(g=>{let v=i.findIndex(_e=>_e.id===g.prize?.segmentId),b=g.prize?.label??i[v]?.label??"",S=v>=0&&!!i[v]?.isLoss,h=g.alreadyPlayed!==true;if(v<0||!c){p(b,S,h);return}let w=3+Math.floor(Math.random()*3),G=St(v,i.length||1,w),M=/rotate\(([-\d.]+)deg\)/.exec(c.style.transform),P=M?parseFloat(M[1]):0;c.style.transition="none",c.style.transform=`rotate(${P%360}deg)`,c.getBoundingClientRect(),c.style.transition=vt;let he=()=>{c.removeEventListener("transitionend",he),p(b,S,h);};c.addEventListener("transitionend",he),ze(()=>{c.style.transform=`rotate(${G}deg)`;});}).catch(()=>{y=false,s.disabled=false,d&&(d.textContent="Something went wrong. Please try again.");});});}};var ce={"spin-wheel":De};function Q(n,e=document){if(!n)return null;let t=e.querySelector(`[data-xenia-slot="${kt(n)}"]`);if(t)return t;try{return e.querySelector(n)}catch{return null}}function kt(n){let e=window;return e.CSS?.escape?e.CSS.escape(n):n.replace(/["\\]/g,"\\$&")}function U(n,e){let t=Q(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 ue(n){let e=Q(n);return !e||!(e instanceof HTMLElement)?false:(e.dataset.xeniaHidden="1",e.style.setProperty("display","none","important"),true)}function pe(n){let e=Q(n);return !e||!(e instanceof HTMLElement)?false:(delete e.dataset.xeniaHidden,e.style.removeProperty("display"),true)}var Rt=new Set(["banner","popup","modal","inline"]);function Ct(n){return Rt.has(n)}var K=class{host=null;shadow=null;onCta;messageTemplate;messageStyles;messageComponent;submitWidgetFormFn;mounted=new Map;constructor(e,t){this.onCta=e,this.messageTemplate=t?.messageTemplate,this.messageStyles=t?.messageStyles,this.messageComponent=t?.messageComponent,this.submitWidgetFormFn=t?.submitWidgetForm;}apply(e){let t=0;for(let i of e)this.applyOne(i)&&t++;return t}applyOne(e){switch(e.type){case "swap":return U(e.target,{html:e.html,text:e.text});case "setContent":return U(e.target,{html:e.html,text:e.text});case "hide":return ue(e.target);case "show":return pe(e.target);case "redirect":try{return window.location.assign(e.url),!0}catch{return false}default:return Ct(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?`${Je}
|
|
2
|
+
${this.messageStyles}`:Je,e}renderMessage(e){let t=e.html===void 0&&!!this.messageComponent;if(e.type==="inline"){if(!e.target)return false;let l=Q(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(),r=document.createElement("div"),s=this.positionClass(e.type,e.position),o=e.html!==void 0?" xenia-custom-bg":"",a=e.style?.hideOverlay?" xenia-no-overlay":"";r.className=`xenia-msg xenia-${e.type}${s?` ${s}`:""}${o}${a}`,i.appendChild(r);let d=()=>{this.unmount(r),r.remove();};if(t?this.mountComponent(r,e,e.type,d):(r.innerHTML=this.cardHtml(e,e.type),this.wireCard(r,e,d)),e.dismissAfterMs&&e.dismissAfterMs>0){let l=setTimeout(d,e.dismissAfterMs),c=()=>clearTimeout(l);r.addEventListener("click",c,{once:true}),r.addEventListener("focusin",c,{once:true});}return true}mountComponent(e,t,i,r){if(!this.messageComponent)return;let s={action:t,variant:i,close:r,fireCta:()=>{t.cta?.event&&this.onCta?.(t.cta.event,t.cta),t.cta?.url&&window.location.assign(t.cta.url),r();}},o=this.messageComponent(e,s);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){let i=e.widgetType?ce[e.widgetType]:void 0;if(i)return i.html(e,t);if(e.html!==void 0)return It(e.html,t);if(this.messageTemplate){let l={action:e,variant:t,escapeHtml:V,escapeAttr:Ne};return this.messageTemplate(l)}let r=e.imageUrl?`<img class="xenia-img" src="${Ne(e.imageUrl)}" alt="" />`:"",s=e.title?`<div class="xenia-title">${V(e.title)}</div>`:"",o=e.message?`<div class="xenia-body">${V(e.message)}</div>`:"",a=e.cta?`<button class="xenia-cta" type="button">${V(e.cta.label)}</button>`:"";return `<div class="xenia-card">${t==="inline"?"":'<button class="xenia-close" type="button" aria-label="Close">\xD7</button>'}${r}<div class="xenia-content">${s}${o}${a}</div></div>`}wireCard(e,t,i){let r=t.widgetType?ce[t.widgetType]:void 0;if(r){r.wire(e,t,this.buildWidgetCtx(t,i));return}B(e,i);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?.();}),We(e,t,this.buildWidgetCtx(t,i));}buildWidgetCtx(e,t){let i=k();return {dismiss:t,fireCta:()=>{e.cta?.event&&this.onCta?.(e.cta.event,e.cta),e.cta?.url&&window.location.assign(e.cta.url),t?.();},submitWidgetForm:r=>!e.formSubmit||!this.submitWidgetFormFn?Promise.reject(new Error("xenia: this action has no formSubmit config, or no submitWidgetForm handler is wired (construct the ActionRenderer via XeniaClient to get one)")):this.submitWidgetFormFn(e.formSubmit,r,{idempotencyKey:i})}}};function It(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 V(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Ne(n){return V(n).replace(/"/g,""")}var Je=`
|
|
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); }
|
|
@@ -76,6 +76,6 @@ ${this.messageStyles}`:Oe,e}renderMessage(e){let t=e.html===void 0&&!!this.messa
|
|
|
76
76
|
.xenia-widget-result-cta { margin-top: 8px; background: var(--xenia-cta-bg, #111); color: var(--xenia-cta-color, #fff);
|
|
77
77
|
border: 0; border-radius: var(--xenia-cta-radius, 8px); padding: var(--xenia-cta-padding, 8px 14px);
|
|
78
78
|
font-size: var(--xenia-cta-size, 14px); font-family: inherit; cursor: pointer; }
|
|
79
|
-
`;var
|
|
79
|
+
`;var me=class{api;identity;responses;options;renderer;analyticsQueue;tracker=null;booting=null;generation=0;consentState;listeners=new Map;constructor(e){this.options=e;let t=e.prefix??"xenia";this.identity=new X(t,e.visitorCookie??true),e.visitorId&&this.identity.identify(e.visitorId),this.api=new z(e),this.responses=e.persistResponses===false||!O()?new N:new J(t),this.renderer=new K((i,r)=>this.onCtaEvent(i,r),{messageTemplate:e.messageTemplate,messageStyles:e.messageStyles,messageComponent:e.messageComponent,submitWidgetForm:(i,r,s)=>this.submitWidgetForm(i,r,s)}),this.consentState={...e.consent},this.analyticsQueue=new F({debug:e.debug,send:(i,r)=>this.api.sendEvents(i.map(s=>({...s,consent:this.consentState})),r)});}init(){return O()?this.booting??=this.boot():Promise.resolve()}async boot(){let e=this.generation;await this.identity.resolveDeviceId(),e===this.generation&&(this.analyticsAllowed()&&this.analyticsQueue.start(),this.options.autoTrack!==false&&(this.tracker=new _({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:(t,i)=>this.track(t,{interactionType:i},{trigger:true}),fireSlot:(t,i)=>{this.track("customEvent",{customEventName:t==="impression"?"personalization_impression":"personalization_click",contentKey:i.contentKey,contentEntryId:i.contentEntryId??null,baseEntryId:i.baseEntryId??null},{trigger:false});}}),this.tracker.start()));}destroy(){this.tracker?.stop(),this.tracker=null,this.renderer.destroy(),this.analyticsQueue.stop(),this.booting=null,this.generation++;}identify(e,t){this.identity.identify(e),t?.customerId!==void 0&&this.identity.setCustomerId(t.customerId),t?.email!==void 0&&this.identity.setEmail(t.email),this.api.identify({xeniaVisitorId:e,userId:t?.customerId,email:t?.email}).then(i=>this.emit("identify",i)).catch(i=>this.emitError(i));}setJourneyId(e){this.identity.setJourneyId(e);}track(e,t,i={}){if(!O())return;let r=i.trigger===true;if(!r&&this.dntBlocked())return;let s=this.buildEvent(e,t,i);this.emit("event",{eventName:e,event:s}),r?this.analyticsQueue.sendImmediate(s).catch(o=>this.emitError(o)):(this.analyticsQueue.enqueue(s),this.analyticsAllowed()&&this.analyticsQueue.start());}buildEvent(e,t,i){let r=this.identity.collectContext(),s;try{s=Intl.DateTimeFormat().resolvedOptions().timeZone;}catch{}return {eventName:e,eventId:i.eventId?Ee(i.eventId):k(),eventVersion:1,occurredAtMs:Date.now(),source:"xenia-js-sdk",identity:{sessionId:this.identity.getSessionId(),...i.identity,xeniaVisitorId:r.visitorId??this.identity.getDeviceId()??void 0},context:{pagePath:r.path,referrer:r.referrer,userAgent:navigator.userAgent,locale:navigator.language,timezone:s,journeyId:this.identity.getJourneyId()??void 0,utmSource:r.utmSource,utmMedium:r.utmMedium,utmCampaign:r.utmCampaign,utmContent:r.utmContent,...i.context},properties:this.withUtmId(t,r.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))}async personalizeContent(e,t){return ie(e,{...t,resolve:this.entryResolver(t)})}async personalizePage(e,t){return Te(e,{...t,resolve:this.entryResolver(t)})}entryResolver(e){let t=this.withVisitor({data:e.data,locale:e.locale});return async i=>(await this.api.resolveEntries(i,t)).decisions??[]}resolveVisitorId(){return this.identity.getVisitorId()??this.identity.getDeviceId()??void 0}withVisitor(e){let t=this.identity.collectContext(),i=this.resolveVisitorId(),r=E({path:t.path,query:t.query,deviceId:this.identity.getDeviceId()??void 0,visitorId:i,customerId:this.identity.getCustomerId()??void 0,email:this.identity.getEmail()??void 0,url:t.url,referrer:t.referrer,utmSource:t.utmSource,utmMedium:t.utmMedium,utmCampaign:t.utmCampaign,utmContent:t.utmContent,utmId:t.utmId});return i&&(r._xenia_vid=i),Object.keys(r).length===0?e:{...e,data:{...e?.data??{},...r}}}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 r=this.identity.collectContext(),s=Se({eventId:e,journeyId:this.identity.getJourneyId()??void 0,identity:{deviceId:this.identity.getDeviceId()??void 0,visitorId:this.resolveVisitorId()},context:r,props:t}),o=await this.api.webhook(e,s,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)}async submitWidgetForm(e,t,i){let r=this.identity.collectContext(),s=i?.idempotencyKey??k(),o=e.flowRef??e.bindingRef,a={visitorId:this.resolveVisitorId(),deviceId:this.identity.getDeviceId()??void 0,idempotencyKey:s,mode:e.mode,ref:o,url:r.url,referrer:r.referrer,path:r.path,query:r.query,utmSource:r.utmSource,utmMedium:r.utmMedium,utmCampaign:r.utmCampaign,utmContent:r.utmContent,utmId:r.utmId},d=e.flowRef?await this.api.webhook(e.flowRef,E({...a,...t}),"POST"):await this.api.submitWidget(e.bindingRef??"",E({...a,fields:t}));return this.emit("response",{triggerId:o,response:d}),(i?.apply??this.options.autoApplyActions!==false)&&d.actions.length&&this.applyActions(d.actions),d}swapContent(e,t){return U(e,t)}hideContent(e){return ue(e)}showContent(e){return pe(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();if(this.consentState={...this.consentState,...e},O())try{document.cookie=xe(this.consentState,this.options.prefix);}catch{}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(r){this.emitError(r);}}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 Fe(n){return new me(n)}var R=null;function x(n){if(!R)throw console.warn(`[xenia] ${n}() called before init().`),new Error("Xenia not initialized");return R}var xn={init(n){R&&R.destroy(),R=Fe(n),R.init();},destroy(){R?.destroy(),R=null;},track(n,e,t){x("track").track(n,e,t);},identify(n){x("identify").identify(n);},consent(n){return x("consent").consent(n)},resolve(n,e){return x("resolve").resolve(n,e)},resolveBatch(n,e){return x("resolveBatch").resolveBatch(n,e)},setJourneyId(n){x("setJourneyId").setJourneyId(n);},request(n,e){return x("request").request(n,e)},getResponse(n){return x("getResponse").getResponse(n)},swapContent(n,e){return x("swapContent").swapContent(n,e)},hideContent(n){return x("hideContent").hideContent(n)},showContent(n){return x("showContent").showContent(n)}};exports.Xenia=xn;return exports;})({});
|
|
80
80
|
Xenia=Xenia&&(Xenia.Xenia||Xenia.default)||Xenia;if(typeof window!=='undefined'){window.Xenia=Xenia;}
|
|
81
81
|
//# sourceMappingURL=xenia-sdk.iife.js.map
|