@xenia-martech/sdk-js 1.0.0-dev.28 → 1.0.0-dev.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/index.cjs +14 -0
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.js +14 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/react/index.cjs +14 -0
- package/dist/client/react/index.cjs.map +1 -1
- package/dist/client/react/index.js +14 -0
- package/dist/client/react/index.js.map +1 -1
- package/dist/xenia-sdk.iife.js +14 -3
- package/dist/xenia-sdk.iife.js.map +1 -1
- package/package.json +1 -1
package/dist/xenia-sdk.iife.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var Xenia=(function(exports){'use strict';var We=new Set(["banner","popup","modal","inline"]),He=new Set(["top-left","top-right","bottom-left","bottom-right","top","bottom"]),Ve=new Set(["standard","spin-wheel"]),Le=new Set(["swap","hide","show","setContent","redirect",...We]);function S(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function c(n){return typeof n=="string"?n:void 0}function le(n){return typeof n=="number"?n:void 0}function $e(n){if(!S(n))return null;let e=c(n.type);if(!e||!Le.has(e))return null;if(e==="redirect"){let i=c(n.url);return i?{type:e,url:i}:null}if(e==="hide"||e==="show"){let i=c(n.target);return i?{type:e,target:i}:null}if(e==="swap"||e==="setContent"){let i=c(n.target);return i?{type:e,target:i,html:c(n.html),text:c(n.text)}:null}let t=S(n.cta)?{label:c(n.cta.label)??"",url:c(n.cta.url),event:c(n.cta.event)}:void 0;return {type:e,target:c(n.target),title:c(n.title),message:c(n.message),imageUrl:c(n.imageUrl),html:c(n.html),cta:t&&(t.label||t.url)?t:void 0,dismissAfterMs:le(n.dismissAfterMs),position:qe(n.position),widgetType:Je(n.widgetType),segments:De(n.segments),formSubmit:_e(n.formSubmit),style:ze(n.style),spinnerHtml:c(n.spinnerHtml),winHtml:c(n.winHtml),lossHtml:c(n.lossHtml)}}function qe(n){let e=c(n);return e&&He.has(e)?e:void 0}function Je(n){let e=c(n);return e&&Ve.has(e)?e:void 0}function De(n){if(!Array.isArray(n))return;let e=[];for(let t of n){if(!S(t))continue;let i=c(t.id),r=c(t.label);!i||!r||e.push({id:i,label:r,colorHex:c(t.colorHex),isLoss:t.isLoss===true});}return e.length?e:void 0}function _e(n){if(!S(n))return;let e=c(n.mode);if(e)return {requiresResolve:n.requiresResolve===true,mode:e,flowRef:c(n.flowRef),bindingRef:c(n.bindingRef),successDisplayMs:le(n.successDisplayMs)}}function ze(n){if(!S(n))return;let e={hideCloseButton:n.hideCloseButton===true,hideOverlay:n.hideOverlay===true};return e.hideCloseButton||e.hideOverlay?e:void 0}function j(n){let e;if(Array.isArray(n)?e=n:S(n)&&Array.isArray(n.xeniaActions)&&(e=n.xeniaActions),!Array.isArray(e))return [];let t=[];for(let i of e){let r=$e(i);r&&t.push(r);}return t}var Fe="https://engine.xeniamartech.com/xenia";function W(){return typeof window<"u"&&typeof document<"u"}function Ne(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 de(n){return new Promise(e=>setTimeout(e,n))}var E=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},O=class{baseUrl;defaultHeaders;timeout;retry;debug;constructor(e){this.baseUrl=(e.baseUrl??Fe).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=Ne(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,u;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),h=await this.parseBody(p);if(p.ok)return {response:p,data:h};if(this.isRetryableStatus(p.status)&&d<a-1){let I=this.retryAfterMs(p,l,d);this.log(`retrying ${e.path} after ${I}ms (status ${p.status})`),await de(I);continue}throw new E(p.status,h)}catch(p){if(u=p,p instanceof E)throw p;if(d<a-1){let h=l*2**d;this.log(`retrying ${e.path} after ${h}ms (network error)`),await de(h);continue}}throw u instanceof Error?u: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 Xe(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 H=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=Xe(t),r=i?i-3e4:e+5*6e4;return this.cached={token:t,expiresAt:r},t}).finally(()=>{this.inflight=null;}),this.inflight}};function ue(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function Be(n){return n!==void 0&&ue(n)?n:void 0}function x(n){let e={};for(let[t,i]of Object.entries(n))i!==void 0&&(e[t]=i);return e}var V=class{http;tenantId;environmentKey;tokenProvider;constructor(e){this.tenantId=e.tenantId,this.environmentKey=e.environmentKey,this.tokenProvider=new H(e),this.http=new O({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: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:j(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=ue(r)?r:{};return {status:i.status,body:r,actions:j(r),prize:Be(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:x({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:x({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:x({items:e,data:t.data,locale:t.locale})});return i}};var je=new Set(["eventId","eventType","journeyId","deviceId","visitorId","customerId","email","utmSource","utmMedium","utmCampaign","utmContent","utmId","url","referrer","path","query"]);function ce(n){let e={};for(let[t,i]of Object.entries(n))i!==void 0&&(e[t]=i);return e}function pe(n){let e={},t={};if(n.props)for(let[r,s]of Object.entries(n.props))s!==void 0&&(je.has(r)?t[r]=s:e[r]=s);return {...e,...t,...ce(n.context??{}),...ce(n.identity??{}),eventId:n.eventId,...n.eventType?{eventType:n.eventType}:{},...n.journeyId?{journeyId:n.journeyId}:{}}}var A="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ue(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=Ue(16),r="";for(let s=0;s<16;s++)r+=A[i[s]%32];return e+r}var U=26;function me(n){if(n.length<=U)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<U;i++){let r=i+1;for(let s=i;s<e.length;s+=U)r=r*31+A.indexOf(e[s])>>>0;t+=A[r%32];}return t}var L=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();}},$=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 q=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 E&&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 Ke=new Set(["click","view-port","page-load"]);function he(n){let e=n.indexOf("&");if(e===-1)return null;let t=n.slice(0,e),i=n.slice(e+1);return !t||!Ke.has(i)?null:{eventId:t,interactionType:i}}function fe(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 J=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?he(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=fe(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=fe(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=he(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 D="xenia";function K(n=D){return `${n||D}_vid`}var Ge=1800*1e3,_=class{prefix;cookie;deviceId=null;journeyId=null;sessionId=null;constructor(e="xenia",t=true){this.prefix=e,this.cookie=Ye(t);}key(e){return `${this.prefix}_${e}`}cookieName(){return K(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<Ge?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 Ye(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 z(n){let e={};return n.querySelectorAll("[data-xenia-field]").forEach(t=>{let i=t.getAttribute("data-xenia-field");i&&(e[i]=Ze(t));}),e}function Ze(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 ge(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 Q(n,e){let t=n.querySelector("[data-xenia-error]");t&&(t.textContent=e);}var ye="xenia-form-submit-style";function et(n){if(n.querySelector(`#${ye}`))return;let e=document.createElement("style");e.id=ye,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 G(n,e){n&&(e?n.setAttribute("data-xenia-submitting",""):n.removeAttribute("data-xenia-submitting"));}function tt(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 nt=900;function it(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 ve(n,e,t){let i=n.querySelector("form"),r=false;et(n);let s=(o,a)=>{if(r)return;if(!e.formSubmit){Q(n,"This form isn't connected yet.");return}r=true,Q(n,""),ge(o,true),G(o,true);let l=Date.now(),u=e.formSubmit.successDisplayMs??nt;t.submitWidgetForm(a).then(()=>{G(o,false),it(n,i);let d=Math.max(0,u-(Date.now()-l));window.setTimeout(()=>tt(n,t.dismiss),d);}).catch(()=>{G(o,false),ge(o,false),Q(n,"Something went wrong. Please try again.");}).finally(()=>{r=false;});};i&&i.addEventListener("submit",o=>{o.preventDefault();let a={};new FormData(i).forEach((u,d)=>{typeof u=="string"&&(a[d]=u);});let l=o.submitter??i.querySelector('[type="submit"], button:not([type])');s(l,{...z(n),...a});}),n.querySelectorAll("[data-xenia-submit]").forEach(o=>{i?.contains(o)||o.addEventListener("click",()=>s(o,z(n)));});}function Y(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function be(n){return Y(n).replace(/"/g,""")}function F(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 R=260,T=R/2,C=R/2,xe=["#7c3aed","#2563eb","#059669","#d97706","#dc2626","#0891b2"],rt="transform 3.2s cubic-bezier(0.15, 0.85, 0.25, 1)",st='<div class="xenia-wheel-pointer" aria-hidden="true"></div>',ee=320,we=`opacity ${ee}ms ease, transform ${ee}ms ease`,ot=900,Z=(n,e)=>`perspective(${ot}px) translateZ(${e}px) scale(${n})`;function te(n,e){let t=n*Math.PI/180;return {x:C+e*Math.sin(t),y:C-e*Math.cos(t)}}function at(n,e){let t=te(n,T),i=te(e,T),r=e-n>180?1:0;return `M ${C},${C} L ${t.x},${t.y} A ${T},${T} 0 ${r} 1 ${i.x},${i.y} Z`}function lt(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 Ee(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=Z(.94,-60));}),Re(()=>{t.forEach(r=>{r instanceof HTMLElement&&(r.style.transition=we,r.style.opacity="0",r.style.transform=Z(.94,-60));}),i.forEach(r=>{r instanceof HTMLElement&&(r.style.transition=we,r.style.opacity="1",r.style.transform=Z(1,0));});}),n&&setTimeout(()=>{n.hidden=true;},ee);}function Re(n){typeof requestAnimationFrame=="function"?requestAnimationFrame(n):setTimeout(n,0);}function dt(n){let t=360/(n.length||1),i=n.map((r,s)=>{let o=s*t,a=o+t,l=r.colorHex||xe[s%xe.length],u=o+t/2,d=te(u,T*.62);return `<path d="${at(o,a)}" fill="${be(l)}" stroke="#fff" stroke-width="1"></path><text x="${d.x}" y="${d.y}" fill="#fff" font-size="12" text-anchor="middle" transform="rotate(${u} ${d.x} ${d.y})">${Y(r.label)}</text>`}).join("");return `<svg class="xenia-wheel-svg" viewBox="0 0 ${R} ${R}" width="${R}" height="${R}"><g class="xenia-wheel-dial">${i}</g><circle class="xenia-wheel-hub" cx="${C}" cy="${C}" r="6"></circle></svg>`}var Ce={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){F(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]"),u=n.querySelector("[data-xenia-wheel-slot]");u&&u.insertAdjacentHTML("afterbegin",dt(i)+st);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(w=>{w.textContent=v;});let P=f?a:o,k=f?o:a;k&&(k.hidden=true),Ee(r,P),b||(I=true,n.querySelectorAll("[data-xenia-spin-again]").forEach(w=>{w.hidden=true;}));},h=false,I=false;n.querySelectorAll("[data-xenia-spin-again]").forEach(v=>{v.addEventListener("click",()=>{if(I)return;let f=o&&!o.hidden?o:a&&!a.hidden?a:null;f&&(h=false,s.disabled=false,l&&(l.textContent=""),Ee(f,r));});}),s.addEventListener("click",()=>{if(h)return;h=true,s.disabled=true,l&&(l.textContent="");let v=z(n);t.submitWidgetForm(v).then(f=>{let b=i.findIndex(Oe=>Oe.id===f.prize?.segmentId),P=f.prize?.label??i[b]?.label??"",k=b>=0&&!!i[b]?.isLoss,w=f.alreadyPlayed!==true;if(b<0||!d){p(P,k,w);return}let Te=3+Math.floor(Math.random()*3),Me=lt(b,i.length||1,Te),oe=/rotate\(([-\d.]+)deg\)/.exec(d.style.transform),Pe=oe?parseFloat(oe[1]):0;d.style.transition="none",d.style.transform=`rotate(${Pe%360}deg)`,d.getBoundingClientRect(),d.style.transition=rt;let ae=()=>{d.removeEventListener("transitionend",ae),p(P,k,w);};d.addEventListener("transitionend",ae),Re(()=>{d.style.transform=`rotate(${Me}deg)`;});}).catch(()=>{h=false,s.disabled=false,l&&(l.textContent="Something went wrong. Please try again.");});});}};var ne={"spin-wheel":Ce};function B(n,e=document){if(!n)return null;let t=e.querySelector(`[data-xenia-slot="${ut(n)}"]`);if(t)return t;try{return e.querySelector(n)}catch{return null}}function ut(n){let e=window;return e.CSS?.escape?e.CSS.escape(n):n.replace(/["\\]/g,"\\$&")}function N(n,e){let t=B(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 ie(n){let e=B(n);return !e||!(e instanceof HTMLElement)?false:(e.dataset.xeniaHidden="1",e.style.setProperty("display","none","important"),true)}function re(n){let e=B(n);return !e||!(e instanceof HTMLElement)?false:(delete e.dataset.xeniaHidden,e.style.removeProperty("display"),true)}var ct=new Set(["banner","popup","modal","inline"]);function pt(n){return ct.has(n)}var X=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 N(e.target,{html:e.html,text:e.text});case "setContent":return N(e.target,{html:e.html,text:e.text});case "hide":return ie(e.target);case "show":return re(e.target);case "redirect":try{return window.location.assign(e.url),!0}catch{return false}default:return pt(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?`${ke}
|
|
2
|
-
${this.messageStyles}`:ke,e}renderMessage(e){let t=e.html===void 0&&!!this.messageComponent;if(e.type==="inline"){if(!e.target)return false;let
|
|
1
|
+
var Xenia=(function(exports){'use strict';var He=new Set(["banner","popup","modal","inline"]),We=new Set(["top-left","top-right","bottom-left","bottom-right","top","bottom"]),Ve=new Set(["standard","spin-wheel"]),Le=new Set(["swap","hide","show","setContent","redirect",...He]);function S(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function u(n){return typeof n=="string"?n:void 0}function le(n){return typeof n=="number"?n:void 0}function $e(n){if(!S(n))return null;let e=u(n.type);if(!e||!Le.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=S(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:le(n.dismissAfterMs),position:qe(n.position),widgetType:Je(n.widgetType),segments:De(n.segments),formSubmit:ze(n.formSubmit),style:Fe(n.style),spinnerHtml:u(n.spinnerHtml),winHtml:u(n.winHtml),lossHtml:u(n.lossHtml)}}function qe(n){let e=u(n);return e&&We.has(e)?e:void 0}function Je(n){let e=u(n);return e&&Ve.has(e)?e:void 0}function De(n){if(!Array.isArray(n))return;let e=[];for(let t of n){if(!S(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 ze(n){if(!S(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:le(n.successDisplayMs)}}function Fe(n){if(!S(n))return;let e={hideCloseButton:n.hideCloseButton===true,hideOverlay:n.hideOverlay===true};return e.hideCloseButton||e.hideOverlay?e:void 0}function j(n){let e;if(Array.isArray(n)?e=n:S(n)&&Array.isArray(n.xeniaActions)&&(e=n.xeniaActions),!Array.isArray(e))return [];let t=[];for(let i of e){let r=$e(i);r&&t.push(r);}return t}var _e="https://engine.xeniamartech.com/xenia";function H(){return typeof window<"u"&&typeof document<"u"}function Ne(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 de(n){return new Promise(e=>setTimeout(e,n))}var E=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},O=class{baseUrl;defaultHeaders;timeout;retry;debug;constructor(e){this.baseUrl=(e.baseUrl??_e).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=Ne(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),h=await this.parseBody(p);if(p.ok)return {response:p,data:h};if(this.isRetryableStatus(p.status)&&d<a-1){let I=this.retryAfterMs(p,l,d);this.log(`retrying ${e.path} after ${I}ms (status ${p.status})`),await de(I);continue}throw new E(p.status,h)}catch(p){if(c=p,p instanceof E)throw p;if(d<a-1){let h=l*2**d;this.log(`retrying ${e.path} after ${h}ms (network error)`),await de(h);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 Xe(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=Xe(t),r=i?i-3e4:e+5*6e4;return this.cached={token:t,expiresAt:r},t}).finally(()=>{this.inflight=null;}),this.inflight}};function ce(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function Be(n){return n!==void 0&&ce(n)?n:void 0}function x(n){let e={};for(let[t,i]of Object.entries(n))i!==void 0&&(e[t]=i);return e}var V=class{http;tenantId;environmentKey;tokenProvider;constructor(e){this.tenantId=e.tenantId,this.environmentKey=e.environmentKey,this.tokenProvider=new W(e),this.http=new O({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: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:j(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=ce(r)?r:{};return {status:i.status,body:r,actions:j(r),prize:Be(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:x({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:x({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:x({items:e,data:t.data,locale:t.locale})});return i}};var je=new Set(["eventId","eventType","journeyId","deviceId","visitorId","customerId","email","utmSource","utmMedium","utmCampaign","utmContent","utmId","url","referrer","path","query"]);function ue(n){let e={};for(let[t,i]of Object.entries(n))i!==void 0&&(e[t]=i);return e}function pe(n){let e={},t={};if(n.props)for(let[r,s]of Object.entries(n.props))s!==void 0&&(je.has(r)?t[r]=s:e[r]=s);return {...e,...t,...ue(n.context??{}),...ue(n.identity??{}),eventId:n.eventId,...n.eventType?{eventType:n.eventType}:{},...n.journeyId?{journeyId:n.journeyId}:{}}}var T="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function Ue(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=T[t%32]+e,t=Math.floor(t/32);let i=Ue(16),r="";for(let s=0;s<16;s++)r+=T[i[s]%32];return e+r}var U=26;function me(n){if(n.length<=U)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+=T[r%32];}let t="";for(let i=0;i<U;i++){let r=i+1;for(let s=i;s<e.length;s+=U)r=r*31+T.indexOf(e[s])>>>0;t+=T[r%32];}return t}var L=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();}},$=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 q=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 E&&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 Ke=new Set(["click","view-port","page-load"]);function he(n){let e=n.indexOf("&");if(e===-1)return null;let t=n.slice(0,e),i=n.slice(e+1);return !t||!Ke.has(i)?null:{eventId:t,interactionType:i}}function fe(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 J=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?he(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=fe(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=fe(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=he(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 D="xenia";function K(n=D){return `${n||D}_vid`}var Ge=1800*1e3,z=class{prefix;cookie;deviceId=null;journeyId=null;sessionId=null;constructor(e="xenia",t=true){this.prefix=e,this.cookie=Ye(t);}key(e){return `${this.prefix}_${e}`}cookieName(){return K(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<Ge?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 Ye(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]=Ze(t));}),e}function Ze(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 ge(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 Q(n,e){let t=n.querySelector("[data-xenia-error]");t&&(t.textContent=e);}var ye="xenia-form-submit-style";function et(n){if(n.querySelector(`#${ye}`))return;let e=document.createElement("style");e.id=ye,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 G(n,e){n&&(e?n.setAttribute("data-xenia-submitting",""):n.removeAttribute("data-xenia-submitting"));}function tt(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 nt=900;function it(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 ve(n,e,t){let i=n.querySelector("form"),r=false;et(n);let s=(o,a)=>{if(r)return;if(!e.formSubmit){Q(n,"This form isn't connected yet.");return}r=true,Q(n,""),ge(o,true),G(o,true);let l=Date.now(),c=e.formSubmit.successDisplayMs??nt;t.submitWidgetForm(a).then(()=>{G(o,false),it(n,i);let d=Math.max(0,c-(Date.now()-l));window.setTimeout(()=>tt(n,t.dismiss),d);}).catch(()=>{G(o,false),ge(o,false),Q(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 Y(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function be(n){return Y(n).replace(/"/g,""")}function _(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 R=260,A=R/2,C=R/2,xe=["#7c3aed","#2563eb","#059669","#d97706","#dc2626","#0891b2"],rt="transform 3.2s cubic-bezier(0.15, 0.85, 0.25, 1)",st='<div class="xenia-wheel-pointer" aria-hidden="true"></div>',ee=320,we=`opacity ${ee}ms ease, transform ${ee}ms ease`,ot=900,Z=(n,e)=>`perspective(${ot}px) translateZ(${e}px) scale(${n})`;function te(n,e){let t=n*Math.PI/180;return {x:C+e*Math.sin(t),y:C-e*Math.cos(t)}}function at(n,e){let t=te(n,A),i=te(e,A),r=e-n>180?1:0;return `M ${C},${C} L ${t.x},${t.y} A ${A},${A} 0 ${r} 1 ${i.x},${i.y} Z`}function lt(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 Ee(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=Z(.94,-60));}),i.forEach(r=>{r instanceof HTMLElement&&r.offsetHeight;}),Re(()=>{t.forEach(r=>{r instanceof HTMLElement&&(r.style.transition=we,r.style.opacity="0",r.style.transform=Z(.94,-60));}),i.forEach(r=>{r instanceof HTMLElement&&(r.style.transition=we,r.style.opacity="1",r.style.transform=Z(1,0));});}),n&&setTimeout(()=>{n.hidden=true;},ee);}function Re(n){typeof requestAnimationFrame=="function"?requestAnimationFrame(n):setTimeout(n,0);}function dt(n){let t=360/(n.length||1),i=n.map((r,s)=>{let o=s*t,a=o+t,l=r.colorHex||xe[s%xe.length],c=o+t/2,d=te(c,A*.62);return `<path d="${at(o,a)}" fill="${be(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})">${Y(r.label)}</text>`}).join("");return `<svg class="xenia-wheel-svg" viewBox="0 0 ${R} ${R}" width="${R}" height="${R}"><g class="xenia-wheel-dial">${i}</g><circle class="xenia-wheel-hub" cx="${C}" cy="${C}" r="6"></circle></svg>`}var Ce={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,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",dt(i)+st);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(w=>{w.textContent=v;});let P=f?a:o,k=f?o:a;k&&(k.hidden=true),Ee(r,P),b||(I=true,n.querySelectorAll("[data-xenia-spin-again]").forEach(w=>{w.hidden=true;}));},h=false,I=false;n.querySelectorAll("[data-xenia-spin-again]").forEach(v=>{v.addEventListener("click",()=>{if(I)return;let f=o&&!o.hidden?o:a&&!a.hidden?a:null;f&&(h=false,s.disabled=false,l&&(l.textContent=""),Ee(f,r));});}),s.addEventListener("click",()=>{if(h)return;h=true,s.disabled=true,l&&(l.textContent="");let v=F(n);t.submitWidgetForm(v).then(f=>{let b=i.findIndex(Oe=>Oe.id===f.prize?.segmentId),P=f.prize?.label??i[b]?.label??"",k=b>=0&&!!i[b]?.isLoss,w=f.alreadyPlayed!==true;if(b<0||!d){p(P,k,w);return}let Ae=3+Math.floor(Math.random()*3),Me=lt(b,i.length||1,Ae),oe=/rotate\(([-\d.]+)deg\)/.exec(d.style.transform),Pe=oe?parseFloat(oe[1]):0;d.style.transition="none",d.style.transform=`rotate(${Pe%360}deg)`,d.getBoundingClientRect(),d.style.transition=rt;let ae=()=>{d.removeEventListener("transitionend",ae),p(P,k,w);};d.addEventListener("transitionend",ae),Re(()=>{d.style.transform=`rotate(${Me}deg)`;});}).catch(()=>{h=false,s.disabled=false,l&&(l.textContent="Something went wrong. Please try again.");});});}};var ne={"spin-wheel":Ce};function B(n,e=document){if(!n)return null;let t=e.querySelector(`[data-xenia-slot="${ct(n)}"]`);if(t)return t;try{return e.querySelector(n)}catch{return null}}function ct(n){let e=window;return e.CSS?.escape?e.CSS.escape(n):n.replace(/["\\]/g,"\\$&")}function N(n,e){let t=B(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 ie(n){let e=B(n);return !e||!(e instanceof HTMLElement)?false:(e.dataset.xeniaHidden="1",e.style.setProperty("display","none","important"),true)}function re(n){let e=B(n);return !e||!(e instanceof HTMLElement)?false:(delete e.dataset.xeniaHidden,e.style.removeProperty("display"),true)}var ut=new Set(["banner","popup","modal","inline"]);function pt(n){return ut.has(n)}var X=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 N(e.target,{html:e.html,text:e.text});case "setContent":return N(e.target,{html:e.html,text:e.text});case "hide":return ie(e.target);case "show":return re(e.target);case "redirect":try{return window.location.assign(e.url),!0}catch{return false}default:return pt(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?`${ke}
|
|
2
|
+
${this.messageStyles}`:ke,e}renderMessage(e){let t=e.html===void 0&&!!this.messageComponent;if(e.type==="inline"){if(!e.target)return false;let c=B(e.target);return c?(this.unmount(c),t?(c.innerHTML="",this.mountComponent(c,e,"inline",()=>this.unmount(c))):(c.innerHTML=this.cardHtml(e,"inline"),this.wireCard(c,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 l=()=>{this.unmount(r),r.remove();};if(t?this.mountComponent(r,e,e.type,l):(r.innerHTML=this.cardHtml(e,e.type),this.wireCard(r,e,l)),e.dismissAfterMs&&e.dismissAfterMs>0){let c=setTimeout(l,e.dismissAfterMs),d=()=>clearTimeout(c);r.addEventListener("click",d,{once:true}),r.addEventListener("focusin",d,{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?ne[e.widgetType]:void 0;if(i)return i.html(e,t);if(e.html!==void 0)return mt(e.html,t);if(this.messageTemplate){let c={action:e,variant:t,escapeHtml:M,escapeAttr:Ie};return this.messageTemplate(c)}let r=e.imageUrl?`<img class="xenia-img" src="${Ie(e.imageUrl)}" alt="" />`:"",s=e.title?`<div class="xenia-title">${M(e.title)}</div>`:"",o=e.message?`<div class="xenia-body">${M(e.message)}</div>`:"",a=e.cta?`<button class="xenia-cta" type="button">${M(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?ne[t.widgetType]:void 0;if(r){r.wire(e,t,this.buildWidgetCtx(t,i));return}_(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?.();}),ve(e,t,this.buildWidgetCtx(t,i));}buildWidgetCtx(e,t){let i=g();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 mt(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 M(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Ie(n){return M(n).replace(/"/g,""")}var ke=`
|
|
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); }
|
|
@@ -43,6 +43,17 @@ ${this.messageStyles}`:ke,e}renderMessage(e){let t=e.html===void 0&&!!this.messa
|
|
|
43
43
|
border: 0; border-radius: var(--xenia-cta-radius, 8px); padding: var(--xenia-cta-padding, 8px 14px);
|
|
44
44
|
font-size: var(--xenia-cta-size, 14px); font-family: inherit; cursor: pointer; }
|
|
45
45
|
.xenia-wheel-spin:disabled { opacity: 0.6; cursor: default; }
|
|
46
|
+
/* The spinner face and the win/loss screens are siblings toggled via the 'hidden' attribute \u2014
|
|
47
|
+
during crossFadeReveal's ~320ms crossfade, BOTH the outgoing and incoming screen are visible
|
|
48
|
+
(not hidden) at once, so without this they'd stack in normal block flow and roughly double
|
|
49
|
+
this box's height for that window. Since .xenia-modal's flexbox re-centers on every height
|
|
50
|
+
change, that briefly-doubled height yanks the whole card to a new position with ZERO
|
|
51
|
+
animation \u2014 right before the scale-down transition starts animating smoothly from that
|
|
52
|
+
already-jumped spot, reading as "not scaling from center". Grid-stacking every child into the
|
|
53
|
+
same cell (sized to the tallest non-hidden one) makes the outgoing/incoming screens overlay in
|
|
54
|
+
place instead of stacking, so there is no discrete height jump to correct for. */
|
|
55
|
+
.xenia-spin-wheel { display: grid; }
|
|
56
|
+
.xenia-spin-wheel > * { grid-area: 1 / 1; }
|
|
46
57
|
/* No animation/transform here \u2014 spin-wheel's win/loss screens are ALWAYS full
|
|
47
58
|
custom HTML now (winHtml/lossHtml), never this class's own generated icon/title/prize/cta
|
|
48
59
|
content (those sub-classes below are unreachable dead CSS, kept only for backwards-compat with
|
|
@@ -65,6 +76,6 @@ ${this.messageStyles}`:ke,e}renderMessage(e){let t=e.html===void 0&&!!this.messa
|
|
|
65
76
|
.xenia-widget-result-cta { margin-top: 8px; background: var(--xenia-cta-bg, #111); color: var(--xenia-cta-color, #fff);
|
|
66
77
|
border: 0; border-radius: var(--xenia-cta-radius, 8px); padding: var(--xenia-cta-padding, 8px 14px);
|
|
67
78
|
font-size: var(--xenia-cta-size, 14px); font-family: inherit; cursor: pointer; }
|
|
68
|
-
`;var se=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
|
|
79
|
+
`;var se=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 z(t,e.visitorCookie??true),e.visitorId&&this.identity.identify(e.visitorId),this.api=new V(e),this.responses=e.persistResponses===false||!H()?new L:new $(t),this.renderer=new X((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 q({debug:e.debug,send:(i,r)=>this.api.sendEvents(i.map(s=>({...s,consent:this.consentState})),r)});}async init(){this.ready||!H()||(await this.identity.resolveDeviceId(),this.ready=true,this.analyticsAllowed()&&this.analyticsQueue.start(),this.options.autoTrack!==false&&(this.tracker=new J({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,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(!H())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?me(i.eventId):g(),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))}resolveVisitorId(){return this.identity.getVisitorId()??this.identity.getDeviceId()??void 0}withVisitor(e){let t=this.identity.collectContext(),i=this.resolveVisitorId(),r=x({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=pe({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??g(),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},l=e.flowRef?await this.api.webhook(e.flowRef,x({...a,...t}),"POST"):await this.api.submitWidget(e.bindingRef??"",x({...a,fields:t}));return this.emit("response",{triggerId:o,response:l}),(i?.apply??this.options.autoApplyActions!==false)&&l.actions.length&&this.applyActions(l.actions),l}swapContent(e,t){return N(e,t)}hideContent(e){return ie(e)}showContent(e){return re(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(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 Te(n){return new se(n)}var y=null;function m(n){if(!y)throw console.warn(`[xenia] ${n}() called before init().`),new Error("Xenia not initialized");return y}var nn={init(n){y&&y.destroy(),y=Te(n),y.init();},destroy(){y?.destroy(),y=null;},track(n,e,t){m("track").track(n,e,t);},identify(n){m("identify").identify(n);},consent(n){return m("consent").consent(n)},resolve(n,e){return m("resolve").resolve(n,e)},resolveBatch(n,e){return m("resolveBatch").resolveBatch(n,e)},setJourneyId(n){m("setJourneyId").setJourneyId(n);},request(n,e){return m("request").request(n,e)},getResponse(n){return m("getResponse").getResponse(n)},swapContent(n,e){return m("swapContent").swapContent(n,e)},hideContent(n){return m("hideContent").hideContent(n)},showContent(n){return m("showContent").showContent(n)}};exports.Xenia=nn;return exports;})({});
|
|
69
80
|
Xenia=Xenia&&(Xenia.Xenia||Xenia.default)||Xenia;if(typeof window!=='undefined'){window.Xenia=Xenia;}
|
|
70
81
|
//# sourceMappingURL=xenia-sdk.iife.js.map
|