@prosdevlab/experience-sdk 0.2.0 → 0.3.0
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 +47 -10
- package/dist/experience-sdk.d.ts +47 -3
- package/dist/experience-sdk.global.js +283 -64
- package/dist/experience-sdk.global.js.map +1 -1
- package/dist/experience-sdk.js +283 -64
- package/dist/experience-sdk.js.map +1 -1
- package/package.json +2 -2
package/dist/experience-sdk.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
var
|
|
1
|
+
var V=class{storage=new Map;get(e){return this.storage.get(e)??null}set(e,t,n){this.storage.set(e,t);}remove(e){this.storage.delete(e);}clear(){this.storage.clear();}isSupported(){return true}},Ne=class{fallback=null;defaultOptions;constructor(e={}){this.defaultOptions={path:"/",sameSite:"lax",...e};}get(e){if(!this.isSupported())return this.getFallback().get(e);try{let t=`${encodeURIComponent(e)}=`,n=document.cookie.split(";");for(let r of n)if(r=r.trim(),r.startsWith(t))return decodeURIComponent(r.substring(t.length));return null}catch(t){return console.warn("Cookie get failed:",t),this.getFallback().get(e)}}set(e,t,n){if(!this.isSupported()){this.getFallback().set(e,t);return}try{let r={...this.defaultOptions,...n},o=[`${encodeURIComponent(e)}=${encodeURIComponent(t)}`];if(r.ttl){let c=new Date;c.setTime(c.getTime()+r.ttl*1e3),o.push(`expires=${c.toUTCString()}`);}r.path&&o.push(`path=${r.path}`),r.domain&&o.push(`domain=${r.domain}`),r.secure&&o.push("secure"),r.sameSite&&o.push(`samesite=${r.sameSite}`),document.cookie=o.join("; ");}catch(r){console.warn("Cookie set failed, falling back to memory:",r),this.getFallback().set(e,t);}}remove(e){if(!this.isSupported()){this.getFallback().remove(e);return}try{let t=this.defaultOptions,n=[`${encodeURIComponent(e)}=`,"expires=Thu, 01 Jan 1970 00:00:00 UTC"];t.path&&n.push(`path=${t.path}`),t.domain&&n.push(`domain=${t.domain}`),document.cookie=n.join("; ");}catch(t){console.warn("Cookie remove failed:",t),this.getFallback().remove(e);}}clear(){if(!this.isSupported()){this.getFallback().clear();return}try{let e=document.cookie.split(";");for(let t of e){t=t.trim();let n=t.indexOf("="),r=n>-1?t.substring(0,n):t;this.remove(decodeURIComponent(r));}}catch(e){console.warn("Cookie clear failed:",e),this.getFallback().clear();}}isSupported(){try{if(typeof document>"u"||!document.cookie)return !1;let e="__cookie_test__";document.cookie=`${e}=test; path=/`;let t=document.cookie.indexOf(e)!==-1;return document.cookie=`${e}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`,t}catch{return false}}getFallback(){return this.fallback||(this.fallback=new V),this.fallback}},Oe=class{fallback=null;get(e){if(!this.isSupported())return this.getFallback().get(e);try{return localStorage.getItem(e)}catch(t){return console.warn("localStorage.getItem failed:",t),this.getFallback().get(e)}}set(e,t,n){if(!this.isSupported()){this.getFallback().set(e,t);return}try{localStorage.setItem(e,t);}catch(r){console.warn("localStorage.setItem failed, falling back to memory:",r),this.getFallback().set(e,t);}}remove(e){if(!this.isSupported()){this.getFallback().remove(e);return}try{localStorage.removeItem(e);}catch(t){console.warn("localStorage.removeItem failed:",t),this.getFallback().remove(e);}}clear(){if(!this.isSupported()){this.getFallback().clear();return}try{localStorage.clear();}catch(e){console.warn("localStorage.clear failed:",e),this.getFallback().clear();}}isSupported(){try{let e="__storage_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}getFallback(){return this.fallback||(this.fallback=new V),this.fallback}},Ae=class{fallback=null;get(e){if(!this.isSupported())return this.getFallback().get(e);try{return sessionStorage.getItem(e)}catch(t){return console.warn("sessionStorage.getItem failed:",t),this.getFallback().get(e)}}set(e,t,n){if(!this.isSupported()){this.getFallback().set(e,t);return}try{sessionStorage.setItem(e,t);}catch(r){console.warn("sessionStorage.setItem failed, falling back to memory:",r),this.getFallback().set(e,t);}}remove(e){if(!this.isSupported()){this.getFallback().remove(e);return}try{sessionStorage.removeItem(e);}catch(t){console.warn("sessionStorage.removeItem failed:",t),this.getFallback().remove(e);}}clear(){if(!this.isSupported()){this.getFallback().clear();return}try{sessionStorage.clear();}catch(e){console.warn("sessionStorage.clear failed:",e),this.getFallback().clear();}}isSupported(){try{let e="__storage_test__";return sessionStorage.setItem(e,"test"),sessionStorage.removeItem(e),!0}catch{return false}}getFallback(){return this.fallback||(this.fallback=new V),this.fallback}},M=(e,t,n)=>{e.ns("storage"),e.defaults({storage:{backend:"localStorage",namespace:"",path:"/",sameSite:"lax"}});let r=()=>n.get("storage.backend")??"localStorage",o=()=>n.get("storage.namespace")??"",c=()=>n.get("storage.ttl"),a=()=>({domain:n.get("storage.domain"),path:n.get("storage.path")??"/",secure:n.get("storage.secure"),sameSite:n.get("storage.sameSite")??"lax"}),d={};function l(s){if(!d[s])switch(s){case "localStorage":d[s]=new Oe;break;case "sessionStorage":d[s]=new Ae;break;case "cookie":d[s]=new Ne(a());break;case "memory":d[s]=new V;break}return d[s]}function h(s,i){let u=i??o();return u?`${u}:${s}`:s}function x(s){return s.expires?Date.now()>s.expires:false}function f(s,i,u){let m=u?.backend??r(),b=l(m),k=h(s,u?.namespace),T={value:i},w=u?.ttl??c();w&&(T.expires=Date.now()+w*1e3);let D=JSON.stringify(T);b.set(k,D,u),e.emit("storage:set",{key:s,value:i,backend:m});}function p(s,i){let u=i?.backend??r(),m=l(u),b=h(s,i?.namespace),k=m.get(b);if(!k)return null;try{let T=JSON.parse(k);return x(T)?(m.remove(b),e.emit("storage:expired",{key:s,backend:u}),null):(e.emit("storage:get",{key:s,backend:u}),T.value)}catch(T){return console.warn("Failed to parse stored value:",T),m.remove(b),null}}function y(s,i){let u=i?.backend??r(),m=l(u),b=h(s,i?.namespace);m.remove(b),e.emit("storage:remove",{key:s,backend:u});}function g(s){let i=s?.backend??r(),u=l(i),m=s?.namespace;if(!m){u.clear(),e.emit("storage:clear",{backend:i});return}if(i==="localStorage"||i==="sessionStorage"){let b=i==="localStorage"?localStorage:sessionStorage,k=`${m}:`,T=[];for(let w=0;w<b.length;w++){let D=b.key(w);D?.startsWith(k)&&T.push(D);}for(let w of T)u.remove(w);}else if(i==="cookie"){let b=`${m}:`,k=document.cookie.split(";");for(let T of k){let w=T.trim(),D=w.indexOf("=");if(D===-1)continue;let C=w.substring(0,D),E=decodeURIComponent(C);E.startsWith(b)&&u.remove(E);}}else u.clear();e.emit("storage:clear",{backend:i,namespace:m});}function v(s){let i=s??r();return l(i).isSupported()}e.expose({storage:{set:f,get:p,remove:y,clear:g,isSupported:v}}),t.on("sdk:ready",()=>{let s=r();l(s).isSupported()||console.warn(`Storage backend '${s}' is not supported, falling back to memory storage`);});};var Me=["strong","em","a","br","span","b","i","p","div","ul","li"],Le={a:["href","class","style","title"],span:["class","style"],p:["class","style"],div:["class","style"],ul:["class","style"],li:["class","style"]};function U(e){if(!e||typeof e!="string")return "";let t=document.createElement("div");t.innerHTML=e;function n(o){if(o.nodeType===Node.TEXT_NODE)return Re(o.textContent||"");if(o.nodeType===Node.ELEMENT_NODE){let c=o,a=c.tagName.toLowerCase();if(!a||a.includes(" ")||!Me.includes(a))return "";let d=Le[a]||[],l=[];for(let f of d){let p=c.getAttribute(f);if(p!==null)if(f==="href"){let y=Fe(p);y&&l.push(`href="${le(y)}"`);}else l.push(`${f}="${le(p)}"`);}let h=l.length>0?` ${l.join(" ")}`:"",x="";for(let f of Array.from(c.childNodes))x+=n(f);return a==="br"?`<br${h} />`:`<${a}${h}>${x}</${a}>`}return ""}let r="";for(let o of Array.from(t.childNodes))r+=n(o);return r}function Re(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function le(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Fe(e){if(!e||typeof e!="string")return "";let t;try{t=decodeURIComponent(e);}catch{t=e;}let n=t.trim().toLowerCase();return n.startsWith("javascript:")||n.startsWith("data:")||e.toLowerCase().trim().startsWith("javascript:")||e.toLowerCase().trim().startsWith("data:")?"":n.startsWith("http://")||n.startsWith("https://")||n.startsWith("mailto:")||n.startsWith("tel:")||n.startsWith("/")||n.startsWith("#")||n.startsWith("?")||!n.includes(":")?e:""}var W=(e,t,n)=>{e.ns("banner"),e.defaults({banner:{position:"top",dismissable:true,zIndex:1e4}});let r=new Map;function o(){let f="xp-banner-styles";if(document.getElementById(f))return;let p=document.createElement("style");p.id=f,p.textContent=`
|
|
2
2
|
.xp-banner {
|
|
3
3
|
position: fixed;
|
|
4
4
|
left: 0;
|
|
5
5
|
right: 0;
|
|
6
6
|
width: 100%;
|
|
7
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
8
|
-
font-size: 14px;
|
|
9
|
-
line-height: 1.5;
|
|
7
|
+
font-family: var(--xp-banner-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);
|
|
8
|
+
font-size: var(--xp-banner-font-size, 14px);
|
|
9
|
+
line-height: var(--xp-banner-line-height, 1.5);
|
|
10
10
|
box-sizing: border-box;
|
|
11
|
-
z-index: 10000;
|
|
12
|
-
background: #ffffff;
|
|
13
|
-
color: #111827;
|
|
14
|
-
border-bottom: 1px solid #e5e7eb;
|
|
15
|
-
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05);
|
|
11
|
+
z-index: var(--xp-banner-z-index, 10000);
|
|
12
|
+
background: var(--xp-banner-bg, #ffffff);
|
|
13
|
+
color: var(--xp-banner-color, #111827);
|
|
14
|
+
border-bottom: var(--xp-banner-border-width, 1px) solid var(--xp-banner-border-color, #e5e7eb);
|
|
15
|
+
box-shadow: var(--xp-banner-shadow, 0 1px 3px 0 rgba(0, 0, 0, 0.05));
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
.xp-banner--top {
|
|
@@ -22,17 +22,17 @@ var O=class{storage=new Map;get(e){return this.storage.get(e)??null}set(e,t,n){t
|
|
|
22
22
|
.xp-banner--bottom {
|
|
23
23
|
bottom: 0;
|
|
24
24
|
border-bottom: none;
|
|
25
|
-
border-top: 1px solid #e5e7eb;
|
|
26
|
-
box-shadow: 0 -1px 3px 0 rgba(0, 0, 0, 0.05);
|
|
25
|
+
border-top: var(--xp-banner-border-width, 1px) solid var(--xp-banner-border-color, #e5e7eb);
|
|
26
|
+
box-shadow: var(--xp-banner-shadow-bottom, 0 -1px 3px 0 rgba(0, 0, 0, 0.05));
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
.xp-banner__container {
|
|
30
30
|
display: flex;
|
|
31
31
|
align-items: center;
|
|
32
|
-
gap: 16px;
|
|
33
|
-
max-width: 1280px;
|
|
32
|
+
gap: var(--xp-banner-gap, 16px);
|
|
33
|
+
max-width: var(--xp-banner-max-width, 1280px);
|
|
34
34
|
margin: 0 auto;
|
|
35
|
-
padding: 14px 24px;
|
|
35
|
+
padding: var(--xp-banner-padding, 14px 24px);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
.xp-banner__content {
|
|
@@ -40,36 +40,37 @@ var O=class{storage=new Map;get(e){return this.storage.get(e)??null}set(e,t,n){t
|
|
|
40
40
|
min-width: 0;
|
|
41
41
|
display: flex;
|
|
42
42
|
flex-direction: column;
|
|
43
|
-
gap: 4px;
|
|
43
|
+
gap: var(--xp-banner-content-gap, 4px);
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
.xp-banner__title {
|
|
47
|
-
font-weight: 600;
|
|
47
|
+
font-weight: var(--xp-banner-title-weight, 600);
|
|
48
48
|
margin: 0;
|
|
49
|
-
font-size: 15px;
|
|
50
|
-
line-height: 1.4;
|
|
49
|
+
font-size: var(--xp-banner-title-size, 15px);
|
|
50
|
+
line-height: var(--xp-banner-title-line-height, 1.4);
|
|
51
|
+
color: var(--xp-banner-title-color, inherit);
|
|
51
52
|
}
|
|
52
53
|
|
|
53
54
|
.xp-banner__message {
|
|
54
55
|
margin: 0;
|
|
55
|
-
font-size: 14px;
|
|
56
|
-
line-height: 1.5;
|
|
57
|
-
color: #6b7280;
|
|
56
|
+
font-size: var(--xp-banner-message-size, 14px);
|
|
57
|
+
line-height: var(--xp-banner-message-line-height, 1.5);
|
|
58
|
+
color: var(--xp-banner-message-color, #6b7280);
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
.xp-banner__buttons {
|
|
61
62
|
display: flex;
|
|
62
63
|
align-items: center;
|
|
63
|
-
gap: 8px;
|
|
64
|
+
gap: var(--xp-banner-buttons-gap, 8px);
|
|
64
65
|
flex-shrink: 0;
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
.xp-banner__button {
|
|
68
|
-
padding: 8px 16px;
|
|
69
|
+
padding: var(--xp-banner-button-padding, 8px 16px);
|
|
69
70
|
border: none;
|
|
70
|
-
border-radius: 6px;
|
|
71
|
-
font-size: 14px;
|
|
72
|
-
font-weight: 500;
|
|
71
|
+
border-radius: var(--xp-banner-button-radius, 6px);
|
|
72
|
+
font-size: var(--xp-banner-button-font-size, 14px);
|
|
73
|
+
font-weight: var(--xp-banner-button-font-weight, 500);
|
|
73
74
|
cursor: pointer;
|
|
74
75
|
transition: all 0.2s;
|
|
75
76
|
text-decoration: none;
|
|
@@ -80,64 +81,64 @@ var O=class{storage=new Map;get(e){return this.storage.get(e)??null}set(e,t,n){t
|
|
|
80
81
|
}
|
|
81
82
|
|
|
82
83
|
.xp-banner__button--primary {
|
|
83
|
-
background: #2563eb;
|
|
84
|
-
color: #ffffff;
|
|
84
|
+
background: var(--xp-banner-button-primary-bg, #2563eb);
|
|
85
|
+
color: var(--xp-banner-button-primary-color, #ffffff);
|
|
85
86
|
}
|
|
86
87
|
|
|
87
88
|
.xp-banner__button--primary:hover {
|
|
88
|
-
background: #1d4ed8;
|
|
89
|
+
background: var(--xp-banner-button-primary-bg-hover, #1d4ed8);
|
|
89
90
|
}
|
|
90
91
|
|
|
91
92
|
.xp-banner__button--secondary {
|
|
92
|
-
background: #f3f4f6;
|
|
93
|
-
color: #374151;
|
|
94
|
-
border: 1px solid #e5e7eb;
|
|
93
|
+
background: var(--xp-banner-button-secondary-bg, #f3f4f6);
|
|
94
|
+
color: var(--xp-banner-button-secondary-color, #374151);
|
|
95
|
+
border: var(--xp-banner-border-width, 1px) solid var(--xp-banner-button-secondary-border, #e5e7eb);
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
.xp-banner__button--secondary:hover {
|
|
98
|
-
background: #e5e7eb;
|
|
99
|
+
background: var(--xp-banner-button-secondary-bg-hover, #e5e7eb);
|
|
99
100
|
}
|
|
100
101
|
|
|
101
102
|
.xp-banner__button--link {
|
|
102
103
|
background: transparent;
|
|
103
|
-
color: #2563eb;
|
|
104
|
-
padding: 6px 12px;
|
|
105
|
-
font-weight: 400;
|
|
104
|
+
color: var(--xp-banner-button-link-color, #2563eb);
|
|
105
|
+
padding: var(--xp-banner-button-link-padding, 6px 12px);
|
|
106
|
+
font-weight: var(--xp-banner-button-link-font-weight, 400);
|
|
106
107
|
}
|
|
107
108
|
|
|
108
109
|
.xp-banner__button--link:hover {
|
|
109
|
-
background: #f3f4f6;
|
|
110
|
+
background: var(--xp-banner-button-link-bg-hover, #f3f4f6);
|
|
110
111
|
text-decoration: underline;
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
.xp-banner__close {
|
|
114
115
|
background: transparent;
|
|
115
116
|
border: none;
|
|
116
|
-
color: #9ca3af;
|
|
117
|
-
font-size: 20px;
|
|
117
|
+
color: var(--xp-banner-close-color, #9ca3af);
|
|
118
|
+
font-size: var(--xp-banner-close-size, 20px);
|
|
118
119
|
line-height: 1;
|
|
119
120
|
cursor: pointer;
|
|
120
|
-
padding: 4px;
|
|
121
|
+
padding: var(--xp-banner-close-padding, 4px);
|
|
121
122
|
margin: 0;
|
|
122
123
|
transition: color 0.2s;
|
|
123
124
|
flex-shrink: 0;
|
|
124
|
-
width: 28px;
|
|
125
|
-
height: 28px;
|
|
125
|
+
width: var(--xp-banner-close-width, 28px);
|
|
126
|
+
height: var(--xp-banner-close-height, 28px);
|
|
126
127
|
display: flex;
|
|
127
128
|
align-items: center;
|
|
128
129
|
justify-content: center;
|
|
129
|
-
border-radius: 4px;
|
|
130
|
+
border-radius: var(--xp-banner-close-radius, 4px);
|
|
130
131
|
}
|
|
131
132
|
|
|
132
133
|
.xp-banner__close:hover {
|
|
133
|
-
color: #111827;
|
|
134
|
-
background: #f3f4f6;
|
|
134
|
+
color: var(--xp-banner-close-color-hover, #111827);
|
|
135
|
+
background: var(--xp-banner-close-bg-hover, #f3f4f6);
|
|
135
136
|
}
|
|
136
137
|
|
|
137
138
|
@media (max-width: 640px) {
|
|
138
139
|
.xp-banner__container {
|
|
139
140
|
flex-wrap: wrap;
|
|
140
|
-
padding: 14px 16px;
|
|
141
|
+
padding: var(--xp-banner-padding-mobile, 14px 16px);
|
|
141
142
|
position: relative;
|
|
142
143
|
}
|
|
143
144
|
|
|
@@ -162,56 +163,274 @@ var O=class{storage=new Map;get(e){return this.storage.get(e)??null}set(e,t,n){t
|
|
|
162
163
|
}
|
|
163
164
|
}
|
|
164
165
|
|
|
165
|
-
/* Dark mode support */
|
|
166
|
+
/* Dark mode support - override CSS variables */
|
|
166
167
|
@media (prefers-color-scheme: dark) {
|
|
167
168
|
.xp-banner {
|
|
168
|
-
background: #111827;
|
|
169
|
-
color: #f9fafb;
|
|
170
|
-
border-bottom-color: #1f2937;
|
|
169
|
+
background: var(--xp-banner-bg-dark, #111827);
|
|
170
|
+
color: var(--xp-banner-color-dark, #f9fafb);
|
|
171
|
+
border-bottom-color: var(--xp-banner-border-color-dark, #1f2937);
|
|
171
172
|
}
|
|
172
173
|
|
|
173
174
|
.xp-banner--bottom {
|
|
174
|
-
border-top-color: #1f2937;
|
|
175
|
+
border-top-color: var(--xp-banner-border-color-dark, #1f2937);
|
|
175
176
|
}
|
|
176
177
|
|
|
177
178
|
.xp-banner__message {
|
|
178
|
-
color: #9ca3af;
|
|
179
|
+
color: var(--xp-banner-message-color-dark, #9ca3af);
|
|
179
180
|
}
|
|
180
181
|
|
|
181
182
|
.xp-banner__button--primary {
|
|
182
|
-
background: #3b82f6;
|
|
183
|
+
background: var(--xp-banner-button-primary-bg-dark, #3b82f6);
|
|
183
184
|
}
|
|
184
185
|
|
|
185
186
|
.xp-banner__button--primary:hover {
|
|
186
|
-
background: #2563eb;
|
|
187
|
+
background: var(--xp-banner-button-primary-bg-hover-dark, #2563eb);
|
|
187
188
|
}
|
|
188
189
|
|
|
189
190
|
.xp-banner__button--secondary {
|
|
190
|
-
background: #1f2937;
|
|
191
|
-
color: #f9fafb;
|
|
192
|
-
border-color: #374151;
|
|
191
|
+
background: var(--xp-banner-button-secondary-bg-dark, #1f2937);
|
|
192
|
+
color: var(--xp-banner-button-secondary-color-dark, #f9fafb);
|
|
193
|
+
border-color: var(--xp-banner-button-secondary-border-dark, #374151);
|
|
193
194
|
}
|
|
194
195
|
|
|
195
196
|
.xp-banner__button--secondary:hover {
|
|
196
|
-
background: #374151;
|
|
197
|
+
background: var(--xp-banner-button-secondary-bg-hover-dark, #374151);
|
|
197
198
|
}
|
|
198
199
|
|
|
199
200
|
.xp-banner__button--link {
|
|
200
|
-
color: #60a5fa;
|
|
201
|
+
color: var(--xp-banner-button-link-color-dark, #60a5fa);
|
|
201
202
|
}
|
|
202
203
|
|
|
203
204
|
.xp-banner__button--link:hover {
|
|
204
|
-
background: #1f2937;
|
|
205
|
+
background: var(--xp-banner-button-link-bg-hover-dark, #1f2937);
|
|
205
206
|
}
|
|
206
207
|
|
|
207
208
|
.xp-banner__close {
|
|
208
|
-
color: #6b7280;
|
|
209
|
+
color: var(--xp-banner-close-color-dark, #6b7280);
|
|
209
210
|
}
|
|
210
211
|
|
|
211
212
|
.xp-banner__close:hover {
|
|
212
|
-
color: #f9fafb;
|
|
213
|
-
background: #1f2937;
|
|
213
|
+
color: var(--xp-banner-close-color-hover-dark, #f9fafb);
|
|
214
|
+
background: var(--xp-banner-close-bg-hover-dark, #1f2937);
|
|
214
215
|
}
|
|
215
216
|
}
|
|
216
|
-
`,document.head.appendChild(c);}function l(d){let c=d.content,y=c.position??n.get("banner.position")??"top",m=c.dismissable??n.get("banner.dismissable")??true,g=n.get("banner.zIndex")??1e4;s();let o=document.createElement("div");o.setAttribute("data-experience-id",d.id);let u=["xp-banner",`xp-banner--${y}`];c.className&&u.push(c.className),o.className=u.join(" "),c.style&&Object.assign(o.style,c.style),g!==1e4&&(o.style.zIndex=String(g));let p=document.createElement("div");p.className="xp-banner__container",o.appendChild(p);let h=document.createElement("div");if(h.className="xp-banner__content",c.title){let x=document.createElement("h3");x.className="xp-banner__title",x.innerHTML=W(c.title),h.appendChild(x);}let w=document.createElement("p");w.className="xp-banner__message",w.innerHTML=W(c.message),h.appendChild(w),p.appendChild(h);let k=document.createElement("div");k.className="xp-banner__buttons";function S(x){let T=document.createElement("button");T.textContent=x.text;let E=x.variant||"primary",C=["xp-banner__button",`xp-banner__button--${E}`];return x.className&&C.push(x.className),T.className=C.join(" "),x.style&&Object.assign(T.style,x.style),T.addEventListener("click",()=>{t.emit("experiences:action",{experienceId:d.id,type:"banner",action:x.action,url:x.url,metadata:x.metadata,variant:E,timestamp:Date.now()}),x.url&&(window.location.href=x.url);}),T}if(c.buttons&&c.buttons.length>0&&c.buttons.forEach(x=>{let T=S(x);k.appendChild(T);}),m){let x=document.createElement("button");x.className="xp-banner__close",x.innerHTML="×",x.setAttribute("aria-label","Close banner"),x.addEventListener("click",()=>{b(d.id),t.emit("experiences:dismissed",{experienceId:d.id,type:"banner"});}),k.appendChild(x);}return p.appendChild(k),o}function f(d,c){let y=n.get("banner.pushDown");if(!y||c!=="top")return;let m=document.querySelector(y);if(!m||!(m instanceof HTMLElement))return;let g=d.offsetHeight;m.style.transition="margin-top 0.3s ease",m.style.marginTop=`${g}px`;}function i(){let d=n.get("banner.pushDown");if(!d)return;let c=document.querySelector(d);!c||!(c instanceof HTMLElement)||(c.style.transition="margin-top 0.3s ease",c.style.marginTop="0");}function a(d){if(r.has(d.id)||typeof document>"u")return;let c=l(d);document.body.appendChild(c),r.set(d.id,c);let m=d.content.position??n.get("banner.position")??"top";f(c,m),t.emit("experiences:shown",{experienceId:d.id,type:"banner",timestamp:Date.now()});}function b(d){if(d){let c=r.get(d);c?.parentNode&&c.parentNode.removeChild(c),r.delete(d),r.size===0&&i();}else {for(let[c,y]of r.entries())y?.parentNode&&y.parentNode.removeChild(y),r.delete(c);i();}}function v(){return r.size>0}e.expose({banner:{show:a,remove:b,isShowing:v}}),t.on("experiences:evaluated",d=>{let c=Array.isArray(d)?d:[d];for(let y of c){let m=y,g=m.decision,o=m.experience;o?.type==="banner"&&(g?.show?a(o):o.id&&r.has(o.id)&&b(o.id));}}),t.on("sdk:destroy",()=>{b();});},R=(e,t,n)=>{e.ns("debug"),e.defaults({debug:{enabled:false,console:false,window:true}});let r=()=>n.get("debug.enabled")??false,s=()=>n.get("debug.console")??false,l=()=>n.get("debug.window")??true,f=(i,a)=>{if(!r())return;let v={timestamp:new Date().toISOString(),message:i,data:a};if(s()&&console.log(`[experiences] ${i}`,a||""),l()&&typeof window<"u"){let d=new CustomEvent("experience-sdk:debug",{detail:v});window.dispatchEvent(d);}};e.expose({debug:{log:f,isEnabled:r}}),r()&&(t.on("experiences:ready",()=>{r()&&f("SDK initialized and ready");}),t.on("experiences:registered",i=>{r()&&f("Experience registered",i);}),t.on("experiences:evaluated",i=>{r()&&f("Experience evaluated",i);}));};function ye(e){return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(e)}function be(e,t,n){return n-e>=t}function xe(e,t,n){let r=[...e,t];return r.length>n?r.slice(1):r}function we(e,t){return Math.abs(e-t)}function ve(e,t,n){if(e.length<2)return {shouldTrigger:false,lastY:0,previousY:0,velocity:0};if(n&&n.nodeName!=="HTML")return {shouldTrigger:false,lastY:0,previousY:0,velocity:0};let r=e[e.length-1].y,s=e[e.length-2].y,l=we(r,s),f=r<s,i=r-l<=t;return {shouldTrigger:f&&i,lastY:r,previousY:s,velocity:l}}function ke(e,t,n,r,s){return {timestamp:s,lastY:e,previousY:t,velocity:n,timeOnPage:s-r}}var V=(e,t,n)=>{e.ns("experiences.exitIntent"),e.defaults({exitIntent:{sensitivity:50,minTimeOnPage:2e3,delay:0,positionHistorySize:30,disableOnMobile:true}});let r=n.get("exitIntent");if(!r)return;let s=[],l=false,f=Date.now(),i=null,a=null;function b(){return r?.disableOnMobile?ye(navigator.userAgent):false}function v(g){let o={x:g.clientX,y:g.clientY},u=r?.positionHistorySize??30;s=xe(s,o,u);}function d(g){if(l)return;let o=r?.minTimeOnPage??2e3;if(!be(f,o,Date.now()))return;let u=r?.sensitivity??50,p=g.relatedTarget||g.toElement,h=ve(s,u,p);if(h.shouldTrigger){l=true;let w=ke(h.lastY,h.previousY,h.velocity,f,Date.now()),k=r?.delay??0;k>0?setTimeout(()=>{t.emit("trigger:exitIntent",w);},k):t.emit("trigger:exitIntent",w);try{sessionStorage.setItem("xp:exitIntent:triggered",Date.now().toString());}catch{}c();}}function c(){i&&(document.removeEventListener("mousemove",i),i=null),a&&(document.removeEventListener("mouseout",a),a=null);}function y(){if(!b()){try{if(sessionStorage.getItem("xp:exitIntent:triggered")){l=!0;return}}catch{}i=v,a=d,document.addEventListener("mousemove",i),document.addEventListener("mouseout",a);}}e.expose({exitIntent:{isTriggered:()=>l,reset:()=>{l=false,s=[];try{sessionStorage.removeItem("xp:exitIntent:triggered");}catch{}c(),y();},getPositions:()=>[...s]}}),y();let m=()=>{c();};t.on("destroy",m);},L=(e,t,n)=>{e.ns("frequency"),e.defaults({frequency:{enabled:true,namespace:"experiences:frequency"}});let r=new Map;t.storage||t.use(P);let s=()=>n.get("frequency.enabled")??true,l=()=>n.get("frequency.namespace")??"experiences:frequency",f=m=>m==="session"?sessionStorage:localStorage,i=m=>`${l()}:${m}`,a=(m,g)=>{let o=f(g),u=i(m),p=o.getItem(u);if(!p)return {count:0,lastImpression:0,impressions:[],per:g};try{return JSON.parse(p)}catch{return {count:0,lastImpression:0,impressions:[],per:g}}},b=(m,g)=>{let o=g.per||"session",u=f(o),p=i(m);u.setItem(p,JSON.stringify(g));},v=m=>{switch(m){case "session":return Number.POSITIVE_INFINITY;case "day":return 1440*60*1e3;case "week":return 10080*60*1e3}},d=(m,g="session")=>s()?a(m,g).count:0,c=(m,g,o)=>{if(!s())return false;let u=a(m,o),p=v(o),h=Date.now();return o==="session"?u.count>=g:u.impressions.filter(k=>h-k<p).length>=g},y=(m,g="session")=>{if(!s())return;let o=a(m,g),u=Date.now();o.count+=1,o.lastImpression=u,o.impressions.push(u),o.per=g;let p=u-10080*60*1e3;o.impressions=o.impressions.filter(h=>h>p),b(m,o),t.emit("experiences:impression-recorded",{experienceId:m,count:o.count,timestamp:u});};e.expose({frequency:{getImpressionCount:d,hasReachedCap:c,recordImpression:y,_registerExperience:(m,g)=>{r.set(m,g);}}}),s()&&t.on("experiences:evaluated",m=>{let g=Array.isArray(m)?m:[m];for(let o of g){let u=o.decision;if(u?.show&&u.experienceId){let p=r.get(u.experienceId)||"session";if(!r.has(u.experienceId)){let h=u.trace.find(w=>w.step==="check-frequency-cap");h?.input&&typeof h.input=="object"&&"per"in h.input&&(p=h.input.per,r.set(u.experienceId,p));}y(u.experienceId,p);}}});};function Se(){return typeof navigator>"u"?false:navigator.doNotTrack==="1"||navigator.msDoNotTrack==="1"||window.doNotTrack==="1"}function Q(e,t,n,r,s,l){return {isFirstVisit:e,totalVisits:t,sessionVisits:n,firstVisitTime:r,lastVisitTime:s,timestamp:l}}var $=(e,t,n)=>{e.ns("pageVisits"),e.defaults({pageVisits:{enabled:true,respectDNT:true,sessionKey:"pageVisits:session",totalKey:"pageVisits:total",ttl:void 0,autoIncrement:true}}),t.storage||(console.warn("[PageVisits] Storage plugin not found, auto-loading..."),t.use(P));let r=t,s=0,l=0,f,i,a=false,b=false;function v(){let o=n.get("pageVisits.sessionKey")??"pageVisits:session",u=n.get("pageVisits.totalKey")??"pageVisits:total";s=r.storage.get(o,{backend:"sessionStorage"})??0;let h=r.storage.get(u,{backend:"localStorage"});h?(l=h.count??0,f=h.first,i=h.last,a=false):(l=0,f=void 0,i=void 0,a=true);}function d(){let o=n.get("pageVisits.sessionKey")??"pageVisits:session",u=n.get("pageVisits.totalKey")??"pageVisits:total",p=n.get("pageVisits.ttl");r.storage.set(o,s,{backend:"sessionStorage"});let h={count:l,first:f??Date.now(),last:i??Date.now()};r.storage.set(u,h,{backend:"localStorage",...p&&{ttl:p}});}function c(){b||(v(),b=true),s+=1,l+=1;let o=Date.now();a&&(f=o),i=o,d();let u=Q(a,l,s,f,i,o);e.emit("pageVisits:incremented",u),a&&(a=false);}function y(){let o=n.get("pageVisits.sessionKey")??"pageVisits:session",u=n.get("pageVisits.totalKey")??"pageVisits:total";r.storage.remove(o,{backend:"sessionStorage"}),r.storage.remove(u,{backend:"localStorage"}),s=0,l=0,f=void 0,i=void 0,a=false,b=false,e.emit("pageVisits:reset");}function m(){return Q(a,l,s,f,i,Date.now())}function g(){let o=n.get("pageVisits.enabled")??true,u=n.get("pageVisits.respectDNT")??true,p=n.get("pageVisits.autoIncrement")??true;if(u&&Se()){e.emit("pageVisits:disabled",{reason:"dnt"});return}if(!o){e.emit("pageVisits:disabled",{reason:"config"});return}p&&c();}t.on("sdk:ready",g),e.expose({pageVisits:{getTotalCount:()=>l,getSessionCount:()=>s,isFirstVisit:()=>a,getFirstVisitTime:()=>f,getLastVisitTime:()=>i,increment:c,reset:y,getState:m}});};function Te(){if(typeof window>"u")return "desktop";let e=navigator.userAgent,t=/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(e),n=/iPad|Android(?!.*Mobile)/i.test(e),r=window.innerWidth;return r<768?"mobile":r<1024?"tablet":t?"mobile":n?"tablet":"desktop"}function Y(e,t){let n=null,r=0;return function(...l){let f=Date.now(),i=t-(f-r);i<=0||i>t?(n&&(clearTimeout(n),n=null),r=f,e(...l)):n||(n=setTimeout(()=>{r=Date.now(),n=null,e(...l);},i));}}function G(e){if(typeof document>"u")return 0;let t=document.scrollingElement||document.documentElement,n=t.scrollTop,r=t.scrollHeight,s=t.clientHeight;return r<=s?100:Math.min(e?(n+s)/r*100:n/(r-s)*100,100)}function Ce(e,t,n,r,s){let l=Math.min(e/t*50,50),f=Math.min(n/5*30,30),i=Math.min(r/s*20,20);return Math.max(0,100-(l+f+i))}var j=(e,t,n)=>{e.ns("experiences.scrollDepth"),e.defaults({scrollDepth:{thresholds:[25,50,75,100],throttle:100,includeViewportHeight:true,recalculateOnResize:true,trackAdvancedMetrics:false,fastScrollVelocityThreshold:3,disableOnMobile:false}});let r=n.get("scrollDepth");if(!r)return;let s=r,l=Te();if(s.disableOnMobile&&l==="mobile")return;let f=0,i=new Set,a=Date.now(),b=0,v=Date.now(),d=null,c=0,y=0,m=new Map;function g(){let k=G(s.includeViewportHeight??true),S=Date.now(),T=(document.scrollingElement||document.documentElement).scrollTop,E=0;if(s.trackAdvancedMetrics){let C=S-v,_=T-b;E=C>0?Math.abs(_)/C:0;let D=_>0?"down":_<0?"up":d;D&&d&&D!==d&&c++,D==="up"&&C>0&&(y+=C),d=D,b=T,v=S;}f=Math.max(f,k);for(let C of s.thresholds||[])if(k>=C&&!i.has(C)){i.add(C),s.trackAdvancedMetrics&&m.set(C,S-a);let _={triggered:true,timestamp:S,percent:Math.round(k*100)/100,maxPercent:Math.round(f*100)/100,threshold:C,thresholdsCrossed:Array.from(i).sort((D,N)=>D-N),device:l};if(s.trackAdvancedMetrics){let D=s.fastScrollVelocityThreshold||3,N=E>D,le=Ce(E,D,c,y,S-a);_.advanced={timeToThreshold:S-a,velocity:Math.round(E*1e3)/1e3,isFastScrolling:N,directionChanges:c,timeScrollingUp:y,engagementScore:Math.round(le)},c=0;}t.emit("trigger:scrollDepth",_);}}let o=Y(g,s.throttle||100),u=Y(g,s.throttle||100);function p(){typeof window>"u"||typeof document>"u"||(window.addEventListener("scroll",o,{passive:true}),s.recalculateOnResize&&window.addEventListener("resize",u,{passive:true}));}function h(){window.removeEventListener("scroll",o),window.removeEventListener("resize",u);}let w=()=>{h();};return t.on("destroy",w),e.expose({scrollDepth:{getMaxPercent:()=>f,getCurrentPercent:()=>G(s.includeViewportHeight??true),getThresholdsCrossed:()=>Array.from(i).sort((k,S)=>k-S),getDevice:()=>l,getAdvancedMetrics:()=>s.trackAdvancedMetrics?{timeOnPage:Date.now()-a,directionChanges:c,timeScrollingUp:y,thresholdTimes:Object.fromEntries(m)}:null,reset:()=>{f=0,i.clear(),c=0,y=0,m.clear(),d=null;}}}),typeof window<"u"&&setTimeout(p,0),()=>{h(),t.off("destroy",w);}};function F(e,t){return Date.now()-e-t}function X(){return typeof document>"u"?false:document.hidden||false}function Ee(e,t,n,r){let s=Date.now(),l=s-e,f=l-t;return {timestamp:s,elapsed:l,activeElapsed:f,wasPaused:n,visibilityChanges:r}}var U=(e,t,n)=>{e.ns("experiences.timeDelay"),e.defaults({timeDelay:{delay:0,pauseWhenHidden:true}});let r=n.get("timeDelay");if(!r)return;let s=r.delay??0,l=r.pauseWhenHidden??true;if(s<=0)return;let f=Date.now(),i=false,a=false,b=0,v=0,d=0,c=null,y=null;function m(){if(i)return;i=true;let w=Ee(f,b,d>0,d);t.emit("trigger:timeDelay",w),u();}function g(w){c&&clearTimeout(c),c=setTimeout(()=>{m();},w);}function o(){let w=X();if(w&&!a)a=true,v=Date.now(),d++,c&&(clearTimeout(c),c=null);else if(!w&&a){a=false;let k=Date.now()-v;b+=k,d++;let S=F(f,b),x=s-S;x>0?g(x):m();}}function u(){c&&(clearTimeout(c),c=null),y&&typeof document<"u"&&(document.removeEventListener("visibilitychange",y),y=null);}function p(){l&&X()?(a=true,v=Date.now(),d++):g(s),l&&typeof document<"u"&&(y=o,document.addEventListener("visibilitychange",y));}e.expose({timeDelay:{getElapsed:()=>Date.now()-f,getActiveElapsed:()=>{let w=b;return a&&(w+=Date.now()-v),F(f,w)},getRemaining:()=>{if(i)return 0;let w=F(f,b),k=s-w;return Math.max(0,k)},isPaused:()=>a,isTriggered:()=>i,reset:()=>{i=false,a=false,b=0,v=0,d=0,u(),p();}}}),p();let h=()=>{u();};t.on("destroy",h);};function H(e,t){let n={...e};for(let r in t){if(!Object.hasOwn(t,r))continue;let s=t[r],l=n[r];if(l===void 0){n[r]=s;continue}Z(l)&&Z(s)&&(n[r]=H(l,s));}return n}function Z(e){return e===null||typeof e!="object"?false:Object.prototype.toString.call(e)==="[object Object]"}var De=class{data={};required=new Set;constructor(e={}){this.data=JSON.parse(JSON.stringify(e));}defaults(e){this.data=H(this.data,e);}merge(e){this.data=H(e,this.data);}get(e){let t=e.split("."),n=this.data;for(let r of t){if(n==null)return;n=n[r];}return n}set(e,t){let n=e.split("."),r=n.pop();if(!r)return;let s=this.data;for(let l of n)(s[l]==null||typeof s[l]!="object")&&(s[l]={}),s=s[l];s[r]=t;}markRequired(e){e!=null&&this.required.add(e);}isRequired(e){return this.required.has(e)}getAll(){return JSON.parse(JSON.stringify(this.data))}},Ie=class{subscriptions=[];on(e,t){if(typeof t!="function")throw new TypeError("handler must be a function");let n={pattern:e,compiledPattern:this.compilePattern(e),handler:t};return this.subscriptions.push(n),()=>this.off(e,t)}off(e,t){this.subscriptions=this.subscriptions.filter(n=>!(n.pattern===e&&n.handler===t));}emit(e,...t){for(let n of this.subscriptions)if(n.compiledPattern.test(e))try{n.handler(...t);}catch(r){console.error(`Error in event handler for "${e}":`,r);}}removeAllListeners(){this.subscriptions=[];}compilePattern(e){let n=this.escapeRegExp(e).replace(/\\\*/g,"(.*?)");return new RegExp(`^${n}$`)}escapeRegExp(e){return e.replace(/[\\^$*+?.()|[\]{}]/g,"\\$&")}},_e=class{sdk;constructor(e){this.sdk=e;}expose(e){Object.assign(this.sdk,e);}},Pe=class{name="";ns(e){if(this.name)throw new Error(`Namespace already set to "${this.name}". Cannot reassign to "${e}".`);this.name=e;}},K=class{configInstance;emitter;plugins=new Map;isInitialized=false;constructor(e={}){this.emitter=new Ie,this.configInstance=new De(e);}use(e){let t=new Pe,n=new _e(this),r={ns:t.ns.bind(t),defaults:this.configInstance.defaults.bind(this.configInstance),on:this.emitter.on.bind(this.emitter),off:this.emitter.off.bind(this.emitter),emit:this.emitter.emit.bind(this.emitter),expose:n.expose.bind(n),mustEnable:()=>{t.name&&this.configInstance.markRequired(t.name);}};return e(r,this,this.configInstance),t.name&&this.plugins.set(t.name,{namespace:t,plugin:r}),this}async init(e){if(this.isInitialized){console.warn("SDK already initialized");return}e&&this.configInstance.merge(e),this.emitter.emit("sdk:init");let t=Array.from(this.plugins.keys()).filter(n=>this.configInstance.isRequired(n));for(let n of t)if(!this.plugins.has(n))throw new Error(`Required plugin "${n}" is not registered`);this.isInitialized=true,this.emitter.emit("sdk:ready");}async destroy(){this.emitter.emit("sdk:destroy"),this.plugins.clear(),this.emitter.removeAllListeners(),this.isInitialized=false;}get(e){return this.configInstance.get(e)}set(e,t){this.configInstance.set(e,t);}on(e,t){return this.emitter.on(e,t)}off(e,t){this.emitter.off(e,t);}emit(e,...t){this.emitter.emit(e,...t);}getAll(){return this.configInstance.getAll()}isReady(){return this.isInitialized}};var q=class{sdk;experiences=new Map;decisions=[];initialized=false;destroyed=false;triggerContext={triggers:{}};constructor(t={}){this.sdk=new K({name:"experience-sdk",...t}),this.sdk.use(P),this.sdk.use(R),this.sdk.use(L),this.sdk.use(V),this.sdk.use(j),this.sdk.use($),this.sdk.use(U),this.sdk.use(A),this.setupTriggerListeners();}setupTriggerListeners(){this.sdk.on("trigger:*",(t,n)=>{let r=t.replace("trigger:","");this.triggerContext.triggers=this.triggerContext.triggers||{},this.triggerContext.triggers[r]={triggered:true,timestamp:Date.now(),...n},this.evaluate(this.triggerContext);});}async init(t){if(this.initialized){console.warn("[experiences] Already initialized");return}this.destroyed&&(this.sdk=new K({name:"experience-sdk",...t}),this.sdk.use(P),this.sdk.use(R),this.sdk.use(L),this.sdk.use(V),this.sdk.use(j),this.sdk.use($),this.sdk.use(U),this.sdk.use(A),this.destroyed=false),t&&Object.entries(t).forEach(([n,r])=>{this.sdk.set(n,r);}),await this.sdk.init(),this.initialized=true,this.sdk.emit("experiences:ready");}register(t,n){let r={id:t,...n};this.experiences.set(t,r),r.frequency&&this.sdk.frequency?._registerExperience&&this.sdk.frequency._registerExperience(t,r.frequency.per),this.sdk.emit("experiences:registered",{id:t,experience:r});}evaluate(t){let n=Date.now(),r=M(t),s,l=[],f=[];for(let[,a]of this.experiences){let b=z(a,r);if(l.push(...b.reasons),f.push(...b.trace),b.matched){if(a.frequency&&this.sdk.frequency){let v=Date.now(),d=this.sdk.frequency.hasReachedCap(a.id,a.frequency.max,a.frequency.per);if(f.push({step:"check-frequency-cap",timestamp:v,duration:Date.now()-v,input:a.frequency,output:d,passed:!d}),d){let y=this.sdk.frequency.getImpressionCount(a.id,a.frequency.per);l.push(`Frequency cap reached (${y}/${a.frequency.max} this ${a.frequency.per})`);continue}let c=this.sdk.frequency.getImpressionCount(a.id,a.frequency.per);l.push(`Frequency cap not reached (${c}/${a.frequency.max} this ${a.frequency.per})`);}s=a;break}}let i={show:!!s,experienceId:s?.id,reasons:l,trace:f,context:r,metadata:{evaluatedAt:Date.now(),totalDuration:Date.now()-n,experiencesEvaluated:this.experiences.size}};return this.decisions.push(i),this.sdk.emit("experiences:evaluated",{decision:i,experience:s}),i}evaluateAll(t){let n=M(t),r=Array.from(this.experiences.values()).sort((i,a)=>{let b=i.priority??0;return (a.priority??0)-b}),s=[];for(let i of r){let a=Date.now(),b=z(i,n),v=b.matched,d=[...b.reasons],c=[...b.trace];if(v&&i.frequency&&this.sdk.frequency){let m=Date.now(),g=this.sdk.frequency.hasReachedCap(i.id,i.frequency.max,i.frequency.per);if(c.push({step:"check-frequency-cap",timestamp:m,duration:Date.now()-m,input:i.frequency,output:g,passed:!g}),g){let o=this.sdk.frequency.getImpressionCount(i.id,i.frequency.per);d.push(`Frequency cap reached (${o}/${i.frequency.max} this ${i.frequency.per})`),v=false;}else {let o=this.sdk.frequency.getImpressionCount(i.id,i.frequency.per);d.push(`Frequency cap not reached (${o}/${i.frequency.max} this ${i.frequency.per})`);}}let y={show:v,experienceId:i.id,reasons:d,trace:c,context:n,metadata:{evaluatedAt:Date.now(),totalDuration:Date.now()-a,experiencesEvaluated:1}};s.push(y),this.decisions.push(y);}let l=s.filter(i=>i.show),f=l.map(i=>i.experienceId&&this.experiences.get(i.experienceId)).filter(i=>i!==void 0);return this.sdk.emit("experiences:evaluated",l.map((i,a)=>({decision:i,experience:f[a]}))),s}explain(t){let n=this.experiences.get(t);if(!n)return null;let r=M(),s=z(n,r);return {show:s.matched,experienceId:t,reasons:s.reasons,trace:s.trace,context:r,metadata:{evaluatedAt:Date.now(),totalDuration:0,experiencesEvaluated:1}}}getState(){return {initialized:this.initialized,experiences:new Map(this.experiences),decisions:[...this.decisions],config:this.sdk?this.sdk.getAll():{}}}on(t,n){return this.sdk.on(t,n)}async destroy(){this.sdk&&await this.sdk.destroy(),this.destroyed=true,this.experiences.clear(),this.decisions=[],this.initialized=false;}};function M(e){return {url:e?.url??(typeof window<"u"?window.location.href:""),timestamp:Date.now(),user:e?.user,custom:e?.custom,triggers:e?.triggers??{}}}function z(e,t){let n=[],r=[],s=true;if(e.targeting.url){let l=Date.now(),f=ee(e.targeting.url,t.url);r.push({step:"evaluate-url-rule",timestamp:l,duration:Date.now()-l,input:{rule:e.targeting.url,url:t.url},output:f,passed:f}),f?n.push("URL matches targeting rule"):(n.push("URL does not match targeting rule"),s=false);}return {matched:s,reasons:n,trace:r}}function ee(e,t=""){return e.equals!==void 0?t===e.equals:e.contains!==void 0?t.includes(e.contains):e.matches!==void 0?e.matches.test(t):true}function B(e){return new q(e)}var I=B();async function te(e){return I.init(e)}function ne(e,t){I.register(e,t);}function re(e){return I.evaluate(e)}function se(e){return I.evaluateAll(e)}function oe(e){return I.explain(e)}function ie(){return I.getState()}function ae(e,t){return I.on(e,t)}async function ce(){return I.destroy()}var qe={createInstance:B,init:te,register:ne,evaluate:re,evaluateAll:se,explain:oe,getState:ie,on:ae,destroy:ce};typeof window<"u"&&(window.experiences=qe);export{q as ExperienceRuntime,A as bannerPlugin,M as buildContext,B as createInstance,R as debugPlugin,ce as destroy,re as evaluate,se as evaluateAll,z as evaluateExperience,ee as evaluateUrlRule,oe as explain,L as frequencyPlugin,ie as getState,te as init,ae as on,ne as register};//# sourceMappingURL=experience-sdk.js.map
|
|
217
|
+
`,document.head.appendChild(p);}function c(f){let p=f.content,y=p.position??n.get("banner.position")??"top",g=p.dismissable??n.get("banner.dismissable")??true,v=n.get("banner.zIndex")??1e4;o();let s=document.createElement("div");s.setAttribute("data-experience-id",f.id);let i=["xp-banner",`xp-banner--${y}`];p.className&&i.push(p.className),s.className=i.join(" "),p.style&&Object.assign(s.style,p.style),v!==1e4&&(s.style.zIndex=String(v));let u=document.createElement("div");u.className="xp-banner__container",s.appendChild(u);let m=document.createElement("div");if(m.className="xp-banner__content",p.title){let w=document.createElement("h3");w.className="xp-banner__title",w.innerHTML=U(p.title),m.appendChild(w);}let b=document.createElement("p");b.className="xp-banner__message",b.innerHTML=U(p.message),m.appendChild(b),u.appendChild(m);let k=document.createElement("div");k.className="xp-banner__buttons";function T(w){let D=document.createElement("button");D.textContent=w.text;let C=w.variant||"primary",E=["xp-banner__button",`xp-banner__button--${C}`];return w.className&&E.push(w.className),D.className=E.join(" "),w.style&&Object.assign(D.style,w.style),D.addEventListener("click",()=>{t.emit("experiences:action",{experienceId:f.id,type:"banner",action:w.action,url:w.url,metadata:w.metadata,variant:C,timestamp:Date.now()}),w.url&&(window.location.href=w.url);}),D}if(p.buttons&&p.buttons.length>0&&p.buttons.forEach(w=>{let D=T(w);k.appendChild(D);}),g){let w=document.createElement("button");w.className="xp-banner__close",w.innerHTML="×",w.setAttribute("aria-label","Close banner"),w.addEventListener("click",()=>{h(f.id),t.emit("experiences:dismissed",{experienceId:f.id,type:"banner"});}),k.appendChild(w);}return u.appendChild(k),s}function a(f,p){let y=n.get("banner.pushDown");if(!y||p!=="top")return;let g=document.querySelector(y);if(!g||!(g instanceof HTMLElement))return;let v=f.offsetHeight;g.style.transition="margin-top 0.3s ease",g.style.marginTop=`${v}px`;}function d(){let f=n.get("banner.pushDown");if(!f)return;let p=document.querySelector(f);!p||!(p instanceof HTMLElement)||(p.style.transition="margin-top 0.3s ease",p.style.marginTop="0");}function l(f){if(r.has(f.id)||typeof document>"u")return;let p=c(f);document.body.appendChild(p),r.set(f.id,p);let g=f.content.position??n.get("banner.position")??"top";a(p,g),t.emit("experiences:shown",{experienceId:f.id,type:"banner",timestamp:Date.now()});}function h(f){if(f){let p=r.get(f);p?.parentNode&&p.parentNode.removeChild(p),r.delete(f),r.size===0&&d();}else {for(let[p,y]of r.entries())y?.parentNode&&y.parentNode.removeChild(y),r.delete(p);d();}}function x(){return r.size>0}e.expose({banner:{show:l,remove:h,isShowing:x}}),t.on("experiences:evaluated",f=>{let p=Array.isArray(f)?f:[f];for(let y of p){let g=y,v=g.decision,s=g.experience;s?.type==="banner"&&(v?.show?l(s):s.id&&r.has(s.id)&&h(s.id));}}),t.on("sdk:destroy",()=>{h();});},K=(e,t,n)=>{e.ns("debug"),e.defaults({debug:{enabled:false,console:false,window:true}});let r=()=>n.get("debug.enabled")??false,o=()=>n.get("debug.console")??false,c=()=>n.get("debug.window")??true,a=(d,l)=>{if(!r())return;let x={timestamp:new Date().toISOString(),message:d,data:l};if(o()&&console.log(`[experiences] ${d}`,l||""),c()&&typeof window<"u"){let f=new CustomEvent("experience-sdk:debug",{detail:x});window.dispatchEvent(f);}};e.expose({debug:{log:a,isEnabled:r}}),r()&&(t.on("experiences:ready",()=>{r()&&a("SDK initialized and ready");}),t.on("experiences:registered",d=>{r()&&a("Experience registered",d);}),t.on("experiences:evaluated",d=>{r()&&a("Experience evaluated",d);}));};function je(e){return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(e)}function Be(e,t,n){return n-e>=t}function Ve(e,t,n){let r=[...e,t];return r.length>n?r.slice(1):r}function He(e,t){return Math.abs(e-t)}function Ue(e,t,n){if(e.length<2)return {shouldTrigger:false,lastY:0,previousY:0,velocity:0};if(n&&n.nodeName!=="HTML")return {shouldTrigger:false,lastY:0,previousY:0,velocity:0};let r=e[e.length-1].y,o=e[e.length-2].y,c=He(r,o),a=r<o,d=r-c<=t;return {shouldTrigger:a&&d,lastY:r,previousY:o,velocity:c}}function We(e,t,n,r,o){return {timestamp:o,lastY:e,previousY:t,velocity:n,timeOnPage:o-r}}var ee=(e,t,n)=>{e.ns("experiences.exitIntent"),e.defaults({exitIntent:{sensitivity:50,minTimeOnPage:2e3,delay:0,positionHistorySize:30,disableOnMobile:true}});let r=n.get("exitIntent");if(!r)return;let o=[],c=false,a=Date.now(),d=null,l=null;function h(){return r?.disableOnMobile?je(navigator.userAgent):false}function x(g){let v={x:g.clientX,y:g.clientY},s=r?.positionHistorySize??30;o=Ve(o,v,s);}function f(g){if(c)return;let v=r?.minTimeOnPage??2e3;if(!Be(a,v,Date.now()))return;let s=r?.sensitivity??50,i=g.relatedTarget||g.toElement,u=Ue(o,s,i);if(u.shouldTrigger){c=true;let m=We(u.lastY,u.previousY,u.velocity,a,Date.now()),b=r?.delay??0;b>0?setTimeout(()=>{t.emit("trigger:exitIntent",m);},b):t.emit("trigger:exitIntent",m);try{sessionStorage.setItem("xp:exitIntent:triggered",Date.now().toString());}catch{}p();}}function p(){d&&(document.removeEventListener("mousemove",d),d=null),l&&(document.removeEventListener("mouseout",l),l=null);}function y(){if(!h()){try{if(sessionStorage.getItem("xp:exitIntent:triggered")){c=!0;return}}catch{}d=x,l=f,document.addEventListener("mousemove",d),document.addEventListener("mouseout",l);}}e.expose({exitIntent:{isTriggered:()=>c,reset:()=>{c=false,o=[];try{sessionStorage.removeItem("xp:exitIntent:triggered");}catch{}p(),y();},getPositions:()=>[...o]}}),y(),t.on("sdk:destroy",()=>{p();});},J=(e,t,n)=>{e.ns("frequency"),e.defaults({frequency:{enabled:true,namespace:"experiences:frequency"}});let r=new Map;t.storage||t.use(M);let o=()=>n.get("frequency.enabled")??true,c=()=>n.get("frequency.namespace")??"experiences:frequency",a=g=>g==="session"?sessionStorage:localStorage,d=g=>`${c()}:${g}`,l=(g,v)=>{let s=a(v),i=d(g),u=s.getItem(i);if(!u)return {count:0,lastImpression:0,impressions:[],per:v};try{return JSON.parse(u)}catch{return {count:0,lastImpression:0,impressions:[],per:v}}},h=(g,v)=>{let s=v.per||"session",i=a(s),u=d(g);i.setItem(u,JSON.stringify(v));},x=g=>{switch(g){case "session":return Number.POSITIVE_INFINITY;case "day":return 1440*60*1e3;case "week":return 10080*60*1e3}},f=(g,v="session")=>o()?l(g,v).count:0,p=(g,v,s)=>{if(!o())return false;let i=l(g,s),u=x(s),m=Date.now();return s==="session"?i.count>=v:i.impressions.filter(k=>m-k<u).length>=v},y=(g,v="session")=>{if(!o())return;let s=l(g,v),i=Date.now();s.count+=1,s.lastImpression=i,s.impressions.push(i),s.per=v;let u=i-10080*60*1e3;s.impressions=s.impressions.filter(m=>m>u),h(g,s),t.emit("experiences:impression-recorded",{experienceId:g,count:s.count,timestamp:i});};e.expose({frequency:{getImpressionCount:f,hasReachedCap:p,recordImpression:y,_registerExperience:(g,v)=>{r.set(g,v);}}}),o()&&t.on("experiences:evaluated",g=>{let v=Array.isArray(g)?g:[g];for(let s of v){let i=s.decision;if(i?.show&&i.experienceId){let u=r.get(i.experienceId)||"session";if(!r.has(i.experienceId)){let m=i.trace.find(b=>b.step==="check-frequency-cap");m?.input&&typeof m.input=="object"&&"per"in m.input&&(u=m.input.per,r.set(i.experienceId,u));}y(i.experienceId,u);}}});};function Ke(e,t,n,r){let o=document.querySelector(e);if(!o)return null;let c=document.createElement("div");switch(c.className="xp-inline",c.setAttribute("data-xp-id",r),c.innerHTML=t,n){case "replace":o.innerHTML="",o.appendChild(c);break;case "append":o.appendChild(c);break;case "prepend":o.insertBefore(c,o.firstChild);break;case "before":o.parentElement?.insertBefore(c,o);break;case "after":o.parentElement?.insertBefore(c,o.nextSibling);break}return c}function Je(e){let t=document.querySelector(`[data-xp-id="${e}"]`);return t?(t.remove(),true):false}var me=(e,t,n)=>{e.ns("experiences.inline"),e.defaults({inline:{retry:false,retryTimeout:5e3}}),t.storage||t.use(M);let r=t;if(typeof document<"u"){let l="xp-inline-styles";if(!document.getElementById(l)){let h=document.createElement("style");h.id=l,h.textContent=Qe(),document.head.appendChild(h);}}let o=new Map,c=l=>{let{id:h,content:x}=l;if(o.has(h))return;if(x.persist&&x.dismissable&&r.storage&&r.storage.get(`xp-inline-dismissed-${h}`)){t.emit("experiences:inline:dismissed",{experienceId:h,reason:"previously-dismissed",timestamp:Date.now()});return}let f=Ke(x.selector,U(x.message),x.position||"replace",h);if(!f){t.emit("experiences:inline:error",{experienceId:h,error:"selector-not-found",selector:x.selector,timestamp:Date.now()});let p=n.get("inline.retry")??false,y=n.get("inline.retryTimeout")??5e3;p&&setTimeout(()=>{c(l);},y);return}if(o.set(h,f),x.className&&f.classList.add(x.className),x.style&&Object.assign(f.style,x.style),x.dismissable){let p=document.createElement("button");p.className="xp-inline__close",p.setAttribute("aria-label","Close"),p.textContent="\xD7",p.onclick=()=>{a(h),x.persist&&r.storage&&r.storage.set(`xp-inline-dismissed-${h}`,true),t.emit("experiences:dismissed",{experienceId:h,timestamp:Date.now()});},f.prepend(p);}t.emit("experiences:shown",{experienceId:h,type:"inline",selector:x.selector,position:x.position||"replace",timestamp:Date.now()});},a=l=>{o.get(l)&&(Je(l),o.delete(l));},d=l=>l?o.has(l):o.size>0;e.expose({inline:{show:c,remove:a,isShowing:d}}),t.on("experiences:evaluated",l=>{l.decision?.show&&l.experience?.type==="inline"&&c(l.experience);}),t.on("sdk:destroy",()=>{for(let l of Array.from(o.keys()))a(l);});};function Qe(){return `
|
|
218
|
+
:root {
|
|
219
|
+
--xp-inline-close-size: 24px;
|
|
220
|
+
--xp-inline-close-color: #666;
|
|
221
|
+
--xp-inline-close-hover-color: #111;
|
|
222
|
+
--xp-inline-close-bg: transparent;
|
|
223
|
+
--xp-inline-close-hover-bg: rgba(0, 0, 0, 0.05);
|
|
224
|
+
--xp-inline-close-border-radius: 4px;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
@media (prefers-color-scheme: dark) {
|
|
228
|
+
:root {
|
|
229
|
+
--xp-inline-close-color: #9ca3af;
|
|
230
|
+
--xp-inline-close-hover-color: #f9fafb;
|
|
231
|
+
--xp-inline-close-hover-bg: rgba(255, 255, 255, 0.1);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.xp-inline {
|
|
236
|
+
position: relative;
|
|
237
|
+
animation: xp-inline-enter 0.4s ease-out forwards;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
@keyframes xp-inline-enter {
|
|
241
|
+
from {
|
|
242
|
+
opacity: 0;
|
|
243
|
+
transform: translateY(-8px);
|
|
244
|
+
}
|
|
245
|
+
to {
|
|
246
|
+
opacity: 1;
|
|
247
|
+
transform: translateY(0);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/* Respect user's motion preferences */
|
|
252
|
+
@media (prefers-reduced-motion: reduce) {
|
|
253
|
+
.xp-inline {
|
|
254
|
+
animation: xp-inline-enter-reduced 0.2s ease-out forwards;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
@keyframes xp-inline-enter-reduced {
|
|
258
|
+
from {
|
|
259
|
+
opacity: 0;
|
|
260
|
+
}
|
|
261
|
+
to {
|
|
262
|
+
opacity: 1;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.xp-inline__close {
|
|
268
|
+
position: absolute;
|
|
269
|
+
top: 8px;
|
|
270
|
+
right: 8px;
|
|
271
|
+
width: var(--xp-inline-close-size);
|
|
272
|
+
height: var(--xp-inline-close-size);
|
|
273
|
+
padding: 0;
|
|
274
|
+
border: none;
|
|
275
|
+
background: var(--xp-inline-close-bg);
|
|
276
|
+
color: var(--xp-inline-close-color);
|
|
277
|
+
font-size: 20px;
|
|
278
|
+
line-height: 1;
|
|
279
|
+
cursor: pointer;
|
|
280
|
+
border-radius: var(--xp-inline-close-border-radius);
|
|
281
|
+
transition: all 0.2s ease;
|
|
282
|
+
display: flex;
|
|
283
|
+
align-items: center;
|
|
284
|
+
justify-content: center;
|
|
285
|
+
z-index: 1;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.xp-inline__close:hover {
|
|
289
|
+
background: var(--xp-inline-close-hover-bg);
|
|
290
|
+
color: var(--xp-inline-close-hover-color);
|
|
291
|
+
}
|
|
292
|
+
`}function Ye(){return `
|
|
293
|
+
margin-top: var(--xp-form-spacing, 16px);
|
|
294
|
+
display: flex;
|
|
295
|
+
flex-direction: column;
|
|
296
|
+
gap: var(--xp-form-gap, 16px);
|
|
297
|
+
`.trim()}function Ge(){return `
|
|
298
|
+
display: flex;
|
|
299
|
+
flex-direction: column;
|
|
300
|
+
gap: var(--xp-field-gap, 6px);
|
|
301
|
+
`.trim()}function Xe(){return `
|
|
302
|
+
font-size: var(--xp-label-font-size, 14px);
|
|
303
|
+
font-weight: var(--xp-label-font-weight, 500);
|
|
304
|
+
color: var(--xp-label-color, #374151);
|
|
305
|
+
line-height: 1.5;
|
|
306
|
+
`.trim()}function Ze(){return `
|
|
307
|
+
color: var(--xp-required-color, #ef4444);
|
|
308
|
+
`.trim()}function et(){return `
|
|
309
|
+
padding: var(--xp-input-padding, 8px 12px);
|
|
310
|
+
font-size: var(--xp-input-font-size, 14px);
|
|
311
|
+
line-height: 1.5;
|
|
312
|
+
color: var(--xp-input-color, #111827);
|
|
313
|
+
background-color: var(--xp-input-bg, white);
|
|
314
|
+
border: var(--xp-input-border-width, 1px) solid var(--xp-input-border-color, #d1d5db);
|
|
315
|
+
border-radius: var(--xp-input-radius, 6px);
|
|
316
|
+
transition: all 0.15s ease-in-out;
|
|
317
|
+
outline: none;
|
|
318
|
+
width: 100%;
|
|
319
|
+
box-sizing: border-box;
|
|
320
|
+
`.trim()}function H(){return `
|
|
321
|
+
border-color: var(--xp-input-error-border, #ef4444);
|
|
322
|
+
`.trim()}function tt(){return `
|
|
323
|
+
font-size: var(--xp-error-font-size, 13px);
|
|
324
|
+
color: var(--xp-error-color, #ef4444);
|
|
325
|
+
line-height: 1.4;
|
|
326
|
+
min-height: 18px;
|
|
327
|
+
`.trim()}function nt(){return `
|
|
328
|
+
margin-top: var(--xp-submit-margin-top, 8px);
|
|
329
|
+
padding: var(--xp-submit-padding, 10px 20px);
|
|
330
|
+
font-size: var(--xp-submit-font-size, 14px);
|
|
331
|
+
font-weight: var(--xp-submit-font-weight, 500);
|
|
332
|
+
color: var(--xp-submit-color, white);
|
|
333
|
+
background-color: var(--xp-submit-bg, #2563eb);
|
|
334
|
+
border: none;
|
|
335
|
+
border-radius: var(--xp-submit-radius, 6px);
|
|
336
|
+
cursor: pointer;
|
|
337
|
+
transition: all 0.2s;
|
|
338
|
+
width: 100%;
|
|
339
|
+
`.trim()}function rt(){return "var(--xp-submit-bg-hover, #1d4ed8)"}function ot(){return `
|
|
340
|
+
padding: var(--xp-state-padding, 16px);
|
|
341
|
+
border-radius: var(--xp-state-radius, 8px);
|
|
342
|
+
text-align: center;
|
|
343
|
+
`.trim()}function st(){return `
|
|
344
|
+
background-color: var(--xp-success-bg, #f0fdf4);
|
|
345
|
+
border: var(--xp-state-border-width, 1px) solid var(--xp-success-border, #86efac);
|
|
346
|
+
`.trim()}function it(){return `
|
|
347
|
+
background-color: var(--xp-error-bg, #fef2f2);
|
|
348
|
+
border: var(--xp-state-border-width, 1px) solid var(--xp-error-border, #fca5a5);
|
|
349
|
+
`.trim()}function at(){return `
|
|
350
|
+
font-size: var(--xp-state-title-font-size, 16px);
|
|
351
|
+
font-weight: var(--xp-state-title-font-weight, 600);
|
|
352
|
+
margin: 0 0 var(--xp-state-title-margin-bottom, 8px) 0;
|
|
353
|
+
color: var(--xp-state-title-color, #111827);
|
|
354
|
+
`.trim()}function ct(){return `
|
|
355
|
+
font-size: var(--xp-state-message-font-size, 14px);
|
|
356
|
+
line-height: 1.5;
|
|
357
|
+
color: var(--xp-state-message-color, #374151);
|
|
358
|
+
margin: 0;
|
|
359
|
+
`.trim()}function lt(){return `
|
|
360
|
+
margin-top: var(--xp-state-buttons-margin-top, 16px);
|
|
361
|
+
display: flex;
|
|
362
|
+
gap: var(--xp-state-buttons-gap, 8px);
|
|
363
|
+
justify-content: center;
|
|
364
|
+
flex-wrap: wrap;
|
|
365
|
+
`.trim()}function ut(e,t){let n=document.createElement("form");n.className="xp-modal__form",n.style.cssText=Ye(),n.dataset.xpExperienceId=e,n.setAttribute("novalidate",""),t.fields.forEach(o=>{let c=dt(e,o);n.appendChild(c);});let r=pt(t.submitButton);return n.appendChild(r),n}function dt(e,t){let n=document.createElement("div");if(n.className="xp-form__field",n.style.cssText=Ge(),t.label){let c=document.createElement("label");if(c.className="xp-form__label",c.style.cssText=Xe(),c.htmlFor=`${e}-${t.name}`,c.textContent=t.label,t.required){let a=document.createElement("span");a.className="xp-form__required",a.style.cssText=Ze(),a.textContent=" *",a.setAttribute("aria-label","required"),c.appendChild(a);}n.appendChild(c);}let r=t.type==="textarea"?document.createElement("textarea"):document.createElement("input");r.className="xp-form__input",r.style.cssText=et(),r.id=`${e}-${t.name}`,r.name=t.name,r instanceof HTMLInputElement&&(r.type=t.type),t.placeholder&&(r.placeholder=t.placeholder),t.required&&(r.required=true),t.pattern&&r instanceof HTMLInputElement&&r.setAttribute("pattern",t.pattern),r.setAttribute("aria-invalid","false"),r.setAttribute("aria-describedby",`${e}-${t.name}-error`),t.className&&(r.className+=` ${t.className}`),t.style&&Object.assign(r.style,t.style),n.appendChild(r);let o=document.createElement("div");return o.className="xp-form__error",o.style.cssText=tt(),o.id=`${e}-${t.name}-error`,o.setAttribute("role","alert"),o.setAttribute("aria-live","polite"),n.appendChild(o),n}function pt(e){let t=document.createElement("button");t.type="submit",t.className="xp-form__submit xp-modal__button",t.style.cssText=nt(),e.variant&&(t.className+=` xp-modal__button--${e.variant}`),e.className&&(t.className+=` ${e.className}`),t.textContent=e.text;let n=rt();return t.onmouseover=()=>{t.style.backgroundColor=n;},t.onmouseout=()=>{t.style.backgroundColor="";},e.style&&Object.assign(t.style,e.style),t}function ft(e,t){let n=document.createElement("div");n.className=`xp-form__state xp-form__state--${e}`;let r=ot(),o=e==="success"?st():it();if(n.style.cssText=`${r}; ${o}`,t.title){let a=document.createElement("h3");a.className="xp-form__state-title",a.style.cssText=at(),a.textContent=t.title,n.appendChild(a);}let c=document.createElement("div");if(c.className="xp-form__state-message",c.style.cssText=ct(),c.textContent=t.message,n.appendChild(c),t.buttons&&t.buttons.length>0){let a=document.createElement("div");a.className="xp-form__state-buttons",a.style.cssText=lt(),t.buttons.forEach(d=>{let l=document.createElement("button");l.type="button",l.className="xp-modal__button",d.variant&&(l.className+=` xp-modal__button--${d.variant}`),d.className&&(l.className+=` ${d.className}`),l.textContent=d.text,d.style&&Object.assign(l.style,d.style),d.action&&(l.dataset.action=d.action),d.dismiss&&(l.dataset.dismiss="true"),a.appendChild(l);}),n.appendChild(a);}return n}function ge(e,t){let n={};if(e.required&&(!t||t.trim()===""))return n[e.name]=e.errorMessage||`${e.label||e.name} is required`,{valid:false,errors:n};if(!t||t.trim()==="")return {valid:true};switch(e.type){case "email":{/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)||(n[e.name]=e.errorMessage||"Please enter a valid email address");break}case "url":{try{new URL(t);}catch{n[e.name]=e.errorMessage||"Please enter a valid URL";}break}case "tel":{/^[\d\s\-()+]+$/.test(t)||(n[e.name]=e.errorMessage||"Please enter a valid phone number");break}case "number":{Number.isNaN(Number(t))&&(n[e.name]=e.errorMessage||"Please enter a valid number");break}}if(e.pattern&&t)try{new RegExp(e.pattern).test(t)||(n[e.name]=e.errorMessage||`Invalid format for ${e.label||e.name}`);}catch{console.warn(`Invalid regex pattern for field ${e.name}:`,e.pattern);}return {valid:Object.keys(n).length===0,errors:Object.keys(n).length>0?n:void 0}}function mt(e,t){let n={};if(e.fields.forEach(r=>{let o=t[r.name]||"",c=ge(r,o);!c.valid&&c.errors&&Object.assign(n,c.errors);}),e.validate)try{let r=e.validate(t);!r.valid&&r.errors&&Object.assign(n,r.errors);}catch(r){console.error("Custom validation function threw an error:",r);}return {valid:Object.keys(n).length===0,errors:Object.keys(n).length>0?n:void 0}}function gt(){return `
|
|
366
|
+
position: absolute;
|
|
367
|
+
inset: 0;
|
|
368
|
+
background-color: var(--xp-modal-backdrop-bg, rgba(0, 0, 0, 0.5));
|
|
369
|
+
`.trim()}function ht(e){return `
|
|
370
|
+
position: relative;
|
|
371
|
+
background: var(--xp-modal-dialog-bg, white);
|
|
372
|
+
border-radius: var(--xp-modal-dialog-radius, ${e.borderRadius});
|
|
373
|
+
box-shadow: var(--xp-modal-dialog-shadow, 0 4px 6px rgba(0, 0, 0, 0.1));
|
|
374
|
+
max-width: ${e.width};
|
|
375
|
+
width: ${e.maxWidth};
|
|
376
|
+
height: ${e.height};
|
|
377
|
+
max-height: ${e.maxHeight};
|
|
378
|
+
overflow-y: auto;
|
|
379
|
+
padding: ${e.padding};
|
|
380
|
+
`.trim()}function bt(e){return `
|
|
381
|
+
width: 100%;
|
|
382
|
+
height: auto;
|
|
383
|
+
max-height: ${e.maxHeight}px;
|
|
384
|
+
object-fit: cover;
|
|
385
|
+
border-radius: ${e.borderRadius};
|
|
386
|
+
display: block;
|
|
387
|
+
margin: 0;
|
|
388
|
+
`.trim()}function xt(){return `
|
|
389
|
+
position: absolute;
|
|
390
|
+
top: var(--xp-modal-close-top, 16px);
|
|
391
|
+
right: var(--xp-modal-close-right, 16px);
|
|
392
|
+
background: none;
|
|
393
|
+
border: none;
|
|
394
|
+
font-size: var(--xp-modal-close-size, 24px);
|
|
395
|
+
line-height: 1;
|
|
396
|
+
cursor: pointer;
|
|
397
|
+
padding: var(--xp-modal-close-padding, 4px 8px);
|
|
398
|
+
color: var(--xp-modal-close-color, #666);
|
|
399
|
+
opacity: var(--xp-modal-close-opacity, 0.7);
|
|
400
|
+
transition: opacity 0.2s;
|
|
401
|
+
`.trim()}function yt(){return "var(--xp-modal-close-hover-opacity, 1)"}function vt(){return "var(--xp-modal-close-opacity, 0.7)"}function wt(e){return `padding: ${e};`}function kt(){return `
|
|
402
|
+
margin: 0 0 var(--xp-modal-title-margin-bottom, 16px) 0;
|
|
403
|
+
font-size: var(--xp-modal-title-size, 20px);
|
|
404
|
+
font-weight: var(--xp-modal-title-weight, 600);
|
|
405
|
+
color: var(--xp-modal-title-color, #111);
|
|
406
|
+
`.trim()}function St(){return `
|
|
407
|
+
margin: 0 0 var(--xp-modal-message-margin-bottom, 20px) 0;
|
|
408
|
+
font-size: var(--xp-modal-message-size, 14px);
|
|
409
|
+
line-height: var(--xp-modal-message-line-height, 1.5);
|
|
410
|
+
color: var(--xp-modal-message-color, #444);
|
|
411
|
+
`.trim()}function Tt(){return `
|
|
412
|
+
display: flex;
|
|
413
|
+
gap: var(--xp-modal-buttons-gap, 8px);
|
|
414
|
+
flex-wrap: wrap;
|
|
415
|
+
`.trim()}function Et(){return `
|
|
416
|
+
padding: var(--xp-button-padding, 10px 20px);
|
|
417
|
+
font-size: var(--xp-button-font-size, 14px);
|
|
418
|
+
font-weight: var(--xp-button-font-weight, 500);
|
|
419
|
+
border-radius: var(--xp-button-radius, 6px);
|
|
420
|
+
cursor: pointer;
|
|
421
|
+
transition: all 0.2s;
|
|
422
|
+
border: none;
|
|
423
|
+
background: var(--xp-button-primary-bg, #2563eb);
|
|
424
|
+
color: var(--xp-button-primary-color, white);
|
|
425
|
+
`.trim()}function _t(){return "var(--xp-button-primary-bg-hover, #1d4ed8)"}function Ct(){return "var(--xp-button-primary-bg, #2563eb)"}function Dt(){return `
|
|
426
|
+
padding: var(--xp-button-padding, 10px 20px);
|
|
427
|
+
font-size: var(--xp-button-font-size, 14px);
|
|
428
|
+
font-weight: var(--xp-button-font-weight, 500);
|
|
429
|
+
border-radius: var(--xp-button-radius, 6px);
|
|
430
|
+
cursor: pointer;
|
|
431
|
+
transition: all 0.2s;
|
|
432
|
+
border: none;
|
|
433
|
+
background: var(--xp-button-secondary-bg, #f3f4f6);
|
|
434
|
+
color: var(--xp-button-secondary-color, #374151);
|
|
435
|
+
`.trim()}function It(){return "var(--xp-button-secondary-bg-hover, #e5e7eb)"}function Pt(){return "var(--xp-button-secondary-bg, #f3f4f6)"}var he=(e,t)=>{e.ns("experiences.modal"),e.defaults({modal:{dismissable:true,backdropDismiss:true,zIndex:10001,size:"md",mobileFullscreen:false,position:"center",animation:"fade",animationDuration:200}});let n=new Map,r=new Map,o=new Map,c=s=>Array.from(s.querySelectorAll('a[href], button, textarea, input, select, details, [tabindex]:not([tabindex="-1"])')).filter(u=>!u.hasAttribute("disabled")),a=s=>{let i=c(s);if(i.length===0)return ()=>{};let u=i[0],m=i[i.length-1],b=k=>{k.key==="Tab"&&(k.shiftKey?document.activeElement===u&&(k.preventDefault(),m.focus()):document.activeElement===m&&(k.preventDefault(),u.focus()));};return s.addEventListener("keydown",b),u.focus(),()=>{s.removeEventListener("keydown",b);}},d=s=>{switch(s){case "sm":return "400px";case "md":return "600px";case "lg":return "800px";case "fullscreen":return "100vw";case "auto":return "auto";default:return "600px"}},l=()=>typeof window<"u"&&window.innerWidth<640,h=(s,i)=>{let u=t.get("modal")||{},m=u.zIndex||10001,b=u.size||"md",k=u.position||"center",T=u.animation||"fade",w=u.animationDuration||200,D=u.mobileFullscreen!==void 0?u.mobileFullscreen:b==="lg",C=b==="fullscreen"||D&&l(),E=document.createElement("div"),$=C?"fullscreen":b,R=k==="bottom"?"xp-modal--bottom":"xp-modal--center",G=T!=="none"?`xp-modal--${T}`:"";E.className=`xp-modal xp-modal--${$} ${R} ${G} ${i.className||""}`.trim(),E.setAttribute("data-xp-id",s),E.setAttribute("role","dialog"),E.setAttribute("aria-modal","true"),i.title&&E.setAttribute("aria-labelledby",`xp-modal-title-${s}`);let Ce=k==="bottom"?"flex-end":"center";E.style.cssText=`position: fixed; inset: 0; z-index: ${m}; display: flex; align-items: ${Ce}; justify-content: center;`,T!=="none"&&(E.style.opacity="0",E.style.transition=`opacity ${w}ms ease-in-out`,T==="slide-up"&&(E.style.transform="translateY(100%)",E.style.transition+=`, transform ${w}ms ease-out`)),i.style&&Object.entries(i.style).forEach(([S,I])=>{E.style.setProperty(S,String(I));});let j=document.createElement("div");j.className="xp-modal__backdrop",j.style.cssText=gt(),E.appendChild(j);let L=document.createElement("div"),De=C?"100%":b==="auto"?"none":d(b),Ie=C?"100%":"auto",Pe=C?"100%":b==="auto"?"none":"90%",$e=C?"0":"8px",qe=i.image?"0":"24px";if(L.className=`xp-modal__dialog${i.image?" xp-modal__dialog--has-image":""}`,L.style.cssText=ht({width:De,maxWidth:Pe,height:Ie,maxHeight:C?"100%":"90vh",borderRadius:$e,padding:qe}),E.appendChild(L),i.image){let S=document.createElement("img");S.className="xp-modal__hero-image",S.src=i.image.src,S.alt=i.image.alt,S.loading="lazy";let I=i.image.maxHeight||(l()?200:300);S.style.cssText=bt({maxHeight:I,borderRadius:C?"0":"8px 8px 0 0"}),L.appendChild(S);}if(u.dismissable!==false){let S=document.createElement("button");S.className="xp-modal__close",S.setAttribute("aria-label","Close dialog"),S.innerHTML="×",S.style.cssText=xt(),S.onmouseover=()=>{S.style.opacity=yt();},S.onmouseout=()=>{S.style.opacity=vt();},S.onclick=()=>f(s),L.appendChild(S);}let A=document.createElement("div");A.className="xp-modal__content";let ze=i.image?"24px":"24px 24px 0 24px";if(A.style.cssText=wt(ze),i.title){let S=document.createElement("h2");S.id=`xp-modal-title-${s}`,S.className="xp-modal__title",S.textContent=i.title,S.style.cssText=kt(),A.appendChild(S);}let B=document.createElement("div");if(B.className="xp-modal__message",B.innerHTML=U(i.message),B.style.cssText=St(),A.appendChild(B),i.form){let S=ut(s,i.form);A.appendChild(S),E.__formConfig=i.form;let I={};i.form.fields.forEach(_=>{I[_.name]="";}),o.set(s,I),i.form.fields.forEach(_=>{let P=S.querySelector(`#${s}-${_.name}`),O=S.querySelector(`#${s}-${_.name}-error`);P&&(P.addEventListener("input",()=>{let q=o.get(s)||{};q[_.name]=P.value,o.set(s,q),t.emit("experiences:modal:form:change",{experienceId:s,field:_.name,value:P.value,formData:{...q},timestamp:Date.now()});}),P.addEventListener("blur",()=>{let q=o.get(s)||{},z=ge(_,q[_.name]||"");!z.valid&&z.errors?(P.style.cssText+=`; ${H()}`,P.setAttribute("aria-invalid","true"),O.textContent=z.errors[_.name]||"",t.emit("experiences:modal:form:validation",{experienceId:s,field:_.name,valid:false,errors:z.errors,timestamp:Date.now()})):(P.style.cssText=P.style.cssText.replace(H(),""),P.setAttribute("aria-invalid","false"),O.textContent="",t.emit("experiences:modal:form:validation",{experienceId:s,field:_.name,valid:true,timestamp:Date.now()}));}));}),S.addEventListener("submit",async _=>{if(_.preventDefault(),!i.form)return;let P=o.get(s)||{},O=mt(i.form,P);if(!O.valid&&O.errors){i.form.fields.forEach(z=>{if(O.errors?.[z.name]){let X=S.querySelector(`#${s}-${z.name}`),ce=S.querySelector(`#${s}-${z.name}-error`);X&&(X.style.cssText+=`; ${H()}`,X.setAttribute("aria-invalid","true")),ce&&(ce.textContent=O.errors[z.name]||"");}}),t.emit("experiences:modal:form:validation",{experienceId:s,valid:false,errors:O.errors,timestamp:Date.now()});return}let q=S.querySelector('button[type="submit"]');q&&(q.disabled=true,q.textContent="Submitting..."),t.emit("experiences:modal:form:submit",{experienceId:s,formData:{...P},timestamp:Date.now()});});}else if(i.buttons&&i.buttons.length>0){let S=document.createElement("div");S.className="xp-modal__buttons",S.style.cssText=Tt(),i.buttons.forEach(I=>{let _=document.createElement("button");_.className=`xp-modal__button xp-modal__button--${I.variant||"secondary"}`,_.textContent=I.text,I.variant==="primary"?(_.style.cssText=Et(),_.onmouseover=()=>{_.style.background=_t();},_.onmouseout=()=>{_.style.background=Ct();}):(_.style.cssText=Dt(),_.onmouseover=()=>{_.style.background=It();},_.onmouseout=()=>{_.style.background=Pt();}),_.onclick=()=>{t.emit("experiences:action",{experienceId:s,action:I.action,button:I,timestamp:Date.now()}),I.dismiss&&f(s),I.url&&(window.location.href=I.url);},S.appendChild(_);}),A.appendChild(S);}L.appendChild(A),u.backdropDismiss!==false&&(j.onclick=()=>f(s));let ae=S=>{S.key==="Escape"&&u.dismissable!==false&&f(s);};return document.addEventListener("keydown",ae),E.__cleanupEscape=()=>{document.removeEventListener("keydown",ae);},E},x=s=>{let i=s.id;if(n.has(i))return;if(n.size>0){let T=Array.from(n.keys());for(let w of T)f(w);}r.set(i,document.activeElement);let u=h(i,s.content);document.body.appendChild(u),n.set(i,u);let b=(t.get("modal")||{}).animation||"fade";b!=="none"&&requestAnimationFrame(()=>{u.style.opacity="1",b==="slide-up"&&(u.style.transform="translateY(0)");});let k=a(u);u.__cleanupFocusTrap=k,t.emit("experiences:shown",{experienceId:i,timestamp:Date.now()}),t.emit("trigger:modal",{experienceId:i,timestamp:Date.now(),shown:true});},f=s=>{let i=n.get(s);if(!i)return;i.__cleanupFocusTrap&&i.__cleanupFocusTrap(),i.__cleanupEscape&&i.__cleanupEscape();let u=r.get(s);u&&document.body.contains(u)&&u.focus(),r.delete(s),i.remove(),n.delete(s),t.emit("experiences:dismissed",{experienceId:s,timestamp:Date.now()});},p=s=>s?n.has(s):n.size>0,y=(s,i)=>{let u=n.get(s);if(!u)return;let m=u.querySelector(".xp-modal__form");if(!m)return;let b=u.__formConfig;if(!b)return;let k=i==="success"?b.successState:b.errorState;if(!k)return;let T=ft(i,k);m.replaceWith(T),t.emit("experiences:modal:form:state",{experienceId:s,state:i,timestamp:Date.now()});},g=s=>{let i=n.get(s);if(!i)return;let u=i.querySelector(".xp-modal__form");if(!u)return;u.reset();let m=o.get(s);m&&Object.keys(m).forEach(T=>{m[T]="";}),u.querySelectorAll(".xp-form__error").forEach(T=>{T.textContent="";}),u.querySelectorAll(".xp-form__input").forEach(T=>{T.setAttribute("aria-invalid","false"),T.style.cssText=T.style.cssText.replace(H(),"");});},v=s=>o.get(s)||null;e.expose({modal:{show:x,remove:f,isShowing:p,showFormState:y,resetForm:g,getFormData:v}}),t.on("experiences:evaluated",s=>{let{decision:i,experience:u}=s;i.show&&i.experienceId&&u&&u.type==="modal"&&x(u);}),t.on("sdk:destroy",()=>{n.forEach((s,i)=>{f(i);});});};function $t(){return typeof navigator>"u"?false:navigator.doNotTrack==="1"||navigator.msDoNotTrack==="1"||window.doNotTrack==="1"}function ue(e,t,n,r,o,c){return {isFirstVisit:e,totalVisits:t,sessionVisits:n,firstVisitTime:r,lastVisitTime:o,timestamp:c}}var te=(e,t,n)=>{e.ns("pageVisits"),e.defaults({pageVisits:{enabled:true,respectDNT:true,sessionKey:"pageVisits:session",totalKey:"pageVisits:total",ttl:void 0,autoIncrement:true}}),t.storage||(console.warn("[PageVisits] Storage plugin not found, auto-loading..."),t.use(M));let r=t,o=0,c=0,a,d,l=false,h=false;function x(){let s=n.get("pageVisits.sessionKey")??"pageVisits:session",i=n.get("pageVisits.totalKey")??"pageVisits:total";o=r.storage.get(s,{backend:"sessionStorage"})??0;let m=r.storage.get(i,{backend:"localStorage"});m?(c=m.count??0,a=m.first,d=m.last,l=false):(c=0,a=void 0,d=void 0,l=true);}function f(){let s=n.get("pageVisits.sessionKey")??"pageVisits:session",i=n.get("pageVisits.totalKey")??"pageVisits:total",u=n.get("pageVisits.ttl");r.storage.set(s,o,{backend:"sessionStorage"});let m={count:c,first:a??Date.now(),last:d??Date.now()};r.storage.set(i,m,{backend:"localStorage",...u&&{ttl:u}});}function p(){h||(x(),h=true),o+=1,c+=1;let s=Date.now();l&&(a=s),d=s,f();let i=ue(l,c,o,a,d,s);e.emit("pageVisits:incremented",i),l&&(l=false);}function y(){let s=n.get("pageVisits.sessionKey")??"pageVisits:session",i=n.get("pageVisits.totalKey")??"pageVisits:total";r.storage.remove(s,{backend:"sessionStorage"}),r.storage.remove(i,{backend:"localStorage"}),o=0,c=0,a=void 0,d=void 0,l=false,h=false,e.emit("pageVisits:reset");}function g(){return ue(l,c,o,a,d,Date.now())}function v(){let s=n.get("pageVisits.enabled")??true,i=n.get("pageVisits.respectDNT")??true,u=n.get("pageVisits.autoIncrement")??true;if(i&&$t()){e.emit("pageVisits:disabled",{reason:"dnt"});return}if(!s){e.emit("pageVisits:disabled",{reason:"config"});return}u&&p();}t.on("sdk:ready",v),e.expose({pageVisits:{getTotalCount:()=>c,getSessionCount:()=>o,isFirstVisit:()=>l,getFirstVisitTime:()=>a,getLastVisitTime:()=>d,increment:p,reset:y,getState:g}});};function qt(){if(typeof window>"u")return "desktop";let e=navigator.userAgent,t=/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(e),n=/iPad|Android(?!.*Mobile)/i.test(e),r=window.innerWidth;return r<768?"mobile":r<1024?"tablet":t?"mobile":n?"tablet":"desktop"}function de(e,t){let n=null,r=0;return function(...c){let a=Date.now(),d=t-(a-r);d<=0||d>t?(n&&(clearTimeout(n),n=null),r=a,e(...c)):n||(n=setTimeout(()=>{r=Date.now(),n=null,e(...c);},d));}}function pe(e){if(typeof document>"u")return 0;let t=document.scrollingElement||document.documentElement,n=t.scrollTop,r=t.scrollHeight,o=t.clientHeight;return r<=o?100:Math.min(e?(n+o)/r*100:n/(r-o)*100,100)}function zt(e,t,n,r,o){let c=Math.min(e/t*50,50),a=Math.min(n/5*30,30),d=Math.min(r/o*20,20);return Math.max(0,100-(c+a+d))}var ne=(e,t,n)=>{e.ns("experiences.scrollDepth"),e.defaults({scrollDepth:{thresholds:[25,50,75,100],throttle:100,includeViewportHeight:true,recalculateOnResize:true,trackAdvancedMetrics:false,fastScrollVelocityThreshold:3,disableOnMobile:false}});let r=n.get("scrollDepth");if(!r)return;let o=r,c=qt();if(o.disableOnMobile&&c==="mobile")return;let a=0,d=new Set,l=Date.now(),h=0,x=Date.now(),f=null,p=0,y=0,g=new Map;function v(){let b=pe(o.includeViewportHeight??true),k=Date.now(),w=(document.scrollingElement||document.documentElement).scrollTop,D=0;if(o.trackAdvancedMetrics){let C=k-x,E=w-h;D=C>0?Math.abs(E)/C:0;let $=E>0?"down":E<0?"up":f;$&&f&&$!==f&&p++,$==="up"&&C>0&&(y+=C),f=$,h=w,x=k;}a=Math.max(a,b);for(let C of o.thresholds||[])if(b>=C&&!d.has(C)){d.add(C),o.trackAdvancedMetrics&&g.set(C,k-l);let E={triggered:true,timestamp:k,percent:Math.round(b*100)/100,maxPercent:Math.round(a*100)/100,threshold:C,thresholdsCrossed:Array.from(d).sort(($,R)=>$-R),device:c};if(o.trackAdvancedMetrics){let $=o.fastScrollVelocityThreshold||3,R=D>$,G=zt(D,$,p,y,k-l);E.advanced={timeToThreshold:k-l,velocity:Math.round(D*1e3)/1e3,isFastScrolling:R,directionChanges:p,timeScrollingUp:y,engagementScore:Math.round(G)},p=0;}t.emit("trigger:scrollDepth",E);}}let s=de(v,o.throttle||100),i=de(v,o.throttle||100);function u(){typeof window>"u"||typeof document>"u"||(window.addEventListener("scroll",s,{passive:true}),o.recalculateOnResize&&window.addEventListener("resize",i,{passive:true}));}function m(){window.removeEventListener("scroll",s),window.removeEventListener("resize",i);}return t.on("sdk:destroy",()=>{m();}),e.expose({scrollDepth:{getMaxPercent:()=>a,getCurrentPercent:()=>pe(o.includeViewportHeight??true),getThresholdsCrossed:()=>Array.from(d).sort((b,k)=>b-k),getDevice:()=>c,getAdvancedMetrics:()=>o.trackAdvancedMetrics?{timeOnPage:Date.now()-l,directionChanges:p,timeScrollingUp:y,thresholdTimes:Object.fromEntries(g)}:null,reset:()=>{a=0,d.clear(),p=0,y=0,g.clear(),f=null;}}}),typeof window<"u"&&setTimeout(u,0),()=>{m();}};function Z(e,t){return Date.now()-e-t}function fe(){return typeof document>"u"?false:document.hidden||false}function Nt(e,t,n,r){let o=Date.now(),c=o-e,a=c-t;return {timestamp:o,elapsed:c,activeElapsed:a,wasPaused:n,visibilityChanges:r}}var re=(e,t,n)=>{e.ns("experiences.timeDelay"),e.defaults({timeDelay:{delay:0,pauseWhenHidden:true}});let r=n.get("timeDelay");if(!r)return;let o=r.delay??0,c=r.pauseWhenHidden??true;if(o<=0)return;let a=Date.now(),d=false,l=false,h=0,x=0,f=0,p=null,y=null;function g(){if(d)return;d=true;let m=Nt(a,h,f>0,f);t.emit("trigger:timeDelay",m),i();}function v(m){p&&clearTimeout(p),p=setTimeout(()=>{g();},m);}function s(){let m=fe();if(m&&!l)l=true,x=Date.now(),f++,p&&(clearTimeout(p),p=null);else if(!m&&l){l=false;let b=Date.now()-x;h+=b,f++;let k=Z(a,h),T=o-k;T>0?v(T):g();}}function i(){p&&(clearTimeout(p),p=null),y&&typeof document<"u"&&(document.removeEventListener("visibilitychange",y),y=null);}function u(){c&&fe()?(l=true,x=Date.now(),f++):v(o),c&&typeof document<"u"&&(y=s,document.addEventListener("visibilitychange",y));}e.expose({timeDelay:{getElapsed:()=>Date.now()-a,getActiveElapsed:()=>{let m=h;return l&&(m+=Date.now()-x),Z(a,m)},getRemaining:()=>{if(d)return 0;let m=Z(a,h),b=o-m;return Math.max(0,b)},isPaused:()=>l,isTriggered:()=>d,reset:()=>{d=false,l=false,h=0,x=0,f=0,i(),u();}}}),u(),t.on("sdk:destroy",()=>{i();});};function oe(e,t){let n={...e};for(let r in t){if(!Object.hasOwn(t,r))continue;let o=t[r],c=n[r];if(c===void 0){n[r]=o;continue}be(c)&&be(o)&&(n[r]=oe(c,o));}return n}function be(e){return e===null||typeof e!="object"?false:Object.prototype.toString.call(e)==="[object Object]"}var Ot=class{data={};required=new Set;constructor(e={}){this.data=JSON.parse(JSON.stringify(e));}defaults(e){this.data=oe(this.data,e);}merge(e){this.data=oe(e,this.data);}get(e){let t=e.split("."),n=this.data;for(let r of t){if(n==null)return;n=n[r];}return n}set(e,t){let n=e.split("."),r=n.pop();if(!r)return;let o=this.data;for(let c of n)(o[c]==null||typeof o[c]!="object")&&(o[c]={}),o=o[c];o[r]=t;}markRequired(e){e!=null&&this.required.add(e);}isRequired(e){return this.required.has(e)}getAll(){return JSON.parse(JSON.stringify(this.data))}},At=class{subscriptions=[];on(e,t){if(typeof t!="function")throw new TypeError("handler must be a function");let n={pattern:e,compiledPattern:this.compilePattern(e),handler:t};return this.subscriptions.push(n),()=>this.off(e,t)}off(e,t){this.subscriptions=this.subscriptions.filter(n=>!(n.pattern===e&&n.handler===t));}emit(e,...t){for(let n of this.subscriptions)if(n.compiledPattern.test(e))try{n.handler(...t);}catch(r){console.error(`Error in event handler for "${e}":`,r);}}removeAllListeners(){this.subscriptions=[];}compilePattern(e){let n=this.escapeRegExp(e).replace(/\\\*/g,"(.*?)");return new RegExp(`^${n}$`)}escapeRegExp(e){return e.replace(/[\\^$*+?.()|[\]{}]/g,"\\$&")}},Mt=class{sdk;constructor(e){this.sdk=e;}expose(e){Object.assign(this.sdk,e);}},Lt=class{name="";ns(e){if(this.name)throw new Error(`Namespace already set to "${this.name}". Cannot reassign to "${e}".`);this.name=e;}},se=class{configInstance;emitter;plugins=new Map;isInitialized=false;constructor(e={}){this.emitter=new At,this.configInstance=new Ot(e);}use(e){let t=new Lt,n=new Mt(this),r={ns:t.ns.bind(t),defaults:this.configInstance.defaults.bind(this.configInstance),on:this.emitter.on.bind(this.emitter),off:this.emitter.off.bind(this.emitter),emit:this.emitter.emit.bind(this.emitter),expose:n.expose.bind(n),mustEnable:()=>{t.name&&this.configInstance.markRequired(t.name);}};return e(r,this,this.configInstance),t.name&&this.plugins.set(t.name,{namespace:t,plugin:r}),this}async init(e){if(this.isInitialized){console.warn("SDK already initialized");return}e&&this.configInstance.merge(e),this.emitter.emit("sdk:init");let t=Array.from(this.plugins.keys()).filter(n=>this.configInstance.isRequired(n));for(let n of t)if(!this.plugins.has(n))throw new Error(`Required plugin "${n}" is not registered`);this.isInitialized=true,this.emitter.emit("sdk:ready");}async destroy(){this.emitter.emit("sdk:destroy"),this.plugins.clear(),this.emitter.removeAllListeners(),this.isInitialized=false;}get(e){return this.configInstance.get(e)}set(e,t){this.configInstance.set(e,t);}on(e,t){return this.emitter.on(e,t)}off(e,t){this.emitter.off(e,t);}emit(e,...t){this.emitter.emit(e,...t);}getAll(){return this.configInstance.getAll()}isReady(){return this.isInitialized}};var F=class{sdk;experiences=new Map;decisions=[];initialized=false;destroyed=false;triggerContext={triggers:{}};constructor(t={}){this.sdk=new se({name:"experience-sdk",...t}),this.sdk.use(M),this.sdk.use(K),this.sdk.use(J),this.sdk.use(ee),this.sdk.use(ne),this.sdk.use(te),this.sdk.use(re),this.sdk.use(he),this.sdk.use(me),this.sdk.use(W),this.setupTriggerListeners();}setupTriggerListeners(){let t=["exitIntent","scrollDepth","timeDelay","pageVisits","modal","inline"];for(let n of t)this.sdk.on(`trigger:${n}`,r=>{this.triggerContext.triggers=this.triggerContext.triggers||{},this.triggerContext.triggers[n]={triggered:true,timestamp:Date.now(),...r},this.evaluateAll(this.triggerContext);});}async init(t){if(this.initialized){console.warn("[experiences] Already initialized");return}this.destroyed&&(this.sdk=new se({name:"experience-sdk",...t}),this.sdk.use(M),this.sdk.use(K),this.sdk.use(J),this.sdk.use(ee),this.sdk.use(ne),this.sdk.use(te),this.sdk.use(re),this.sdk.use(W),this.destroyed=false),t&&Object.entries(t).forEach(([n,r])=>{this.sdk.set(n,r);}),await this.sdk.init(),this.initialized=true,this.sdk.emit("experiences:ready");}register(t,n){let r={id:t,...n};this.experiences.set(t,r),r.frequency&&this.sdk.frequency?._registerExperience&&this.sdk.frequency._registerExperience(t,r.frequency.per),this.sdk.emit("experiences:registered",{id:t,experience:r});}evaluate(t){let n=Date.now(),r=Q(t),o,c=[],a=[];for(let[,l]of this.experiences){let h=Y(l,r);if(c.push(...h.reasons),a.push(...h.trace),h.matched){if(l.frequency&&this.sdk.frequency){let x=Date.now(),f=this.sdk.frequency.hasReachedCap(l.id,l.frequency.max,l.frequency.per);if(a.push({step:"check-frequency-cap",timestamp:x,duration:Date.now()-x,input:l.frequency,output:f,passed:!f}),f){let y=this.sdk.frequency.getImpressionCount(l.id,l.frequency.per);c.push(`Frequency cap reached (${y}/${l.frequency.max} this ${l.frequency.per})`);continue}let p=this.sdk.frequency.getImpressionCount(l.id,l.frequency.per);c.push(`Frequency cap not reached (${p}/${l.frequency.max} this ${l.frequency.per})`);}o=l;break}}let d={show:!!o,experienceId:o?.id,reasons:c,trace:a,context:r,metadata:{evaluatedAt:Date.now(),totalDuration:Date.now()-n,experiencesEvaluated:this.experiences.size}};return this.decisions.push(d),this.sdk.emit("experiences:evaluated",{decision:d,experience:o}),d}evaluateAll(t){let n=Q(t),r=Array.from(this.experiences.values()).sort((a,d)=>{let l=a.priority??0;return (d.priority??0)-l}),o=[];for(let a of r){let d=Date.now(),l=Y(a,n),h=l.matched,x=[...l.reasons],f=[...l.trace];if(h&&a.frequency&&this.sdk.frequency){let y=Date.now(),g=this.sdk.frequency.hasReachedCap(a.id,a.frequency.max,a.frequency.per);if(f.push({step:"check-frequency-cap",timestamp:y,duration:Date.now()-y,input:a.frequency,output:g,passed:!g}),g){let v=this.sdk.frequency.getImpressionCount(a.id,a.frequency.per);x.push(`Frequency cap reached (${v}/${a.frequency.max} this ${a.frequency.per})`),h=false;}else {let v=this.sdk.frequency.getImpressionCount(a.id,a.frequency.per);x.push(`Frequency cap not reached (${v}/${a.frequency.max} this ${a.frequency.per})`);}}let p={show:h,experienceId:a.id,reasons:x,trace:f,context:n,metadata:{evaluatedAt:Date.now(),totalDuration:Date.now()-d,experiencesEvaluated:1}};o.push(p),this.decisions.push(p);}let c=o.filter(a=>a.show);for(let a of c){let d=a.experienceId?this.experiences.get(a.experienceId):void 0;d&&this.sdk.emit("experiences:evaluated",{decision:a,experience:d});}return o}explain(t){let n=this.experiences.get(t);if(!n)return null;let r=Q(),o=Y(n,r);return {show:o.matched,experienceId:t,reasons:o.reasons,trace:o.trace,context:r,metadata:{evaluatedAt:Date.now(),totalDuration:0,experiencesEvaluated:1}}}getState(){return {initialized:this.initialized,experiences:new Map(this.experiences),decisions:[...this.decisions],config:this.sdk?this.sdk.getAll():{}}}on(t,n){return this.sdk.on(t,n)}async destroy(){this.sdk&&await this.sdk.destroy(),this.destroyed=true,this.experiences.clear(),this.decisions=[],this.initialized=false;}};function Q(e){return {url:e?.url??(typeof window<"u"?window.location.href:""),timestamp:Date.now(),user:e?.user,custom:e?.custom,triggers:e?.triggers??{}}}function Y(e,t){let n=[],r=[],o=true;if(e.targeting?.url){let c=Date.now(),a=xe(e.targeting.url,t.url);r.push({step:"evaluate-url-rule",timestamp:c,duration:Date.now()-c,input:{rule:e.targeting.url,url:t.url},output:a,passed:a}),a?n.push("URL matches targeting rule"):(n.push("URL does not match targeting rule"),o=false);}if(e.display?.trigger&&t.triggers){let c=e.display.trigger,a=t.triggers[c];if(!a?.triggered)n.push(`Waiting for ${c} trigger`),o=false;else if(c==="scrollDepth"&&e.display.triggerData?.threshold){let d=e.display.triggerData.threshold,l=a.threshold;l===d?n.push(`Scroll depth threshold (${d}%) reached`):(n.push(`Scroll depth threshold mismatch (expected ${d}%, got ${l}%)`),o=false);}else n.push(`${c} trigger fired`);}return {matched:o,reasons:n,trace:r}}function xe(e,t=""){return e.equals!==void 0?t===e.equals:e.contains!==void 0?t.includes(e.contains):e.matches!==void 0?e.matches.test(t):true}function ie(e){return new F(e)}var N=ie();async function ye(e){return N.init(e)}function ve(e,t){N.register(e,t);}function we(e){return N.evaluate(e)}function ke(e){return N.evaluateAll(e)}function Se(e){return N.explain(e)}function Te(){return N.getState()}function Ee(e,t){return N.on(e,t)}async function _e(){return N.destroy()}var Rt={createInstance:ie,init:ye,register:ve,evaluate:we,evaluateAll:ke,explain:Se,getState:Te,on:Ee,destroy:_e},Ft=new Proxy(Rt,{get(e,t){return t in e&&e[t]?e[t]:N.sdk[t]}});export{F as ExperienceRuntime,W as bannerPlugin,Q as buildContext,ie as createInstance,K as debugPlugin,_e as destroy,we as evaluate,ke as evaluateAll,Y as evaluateExperience,xe as evaluateUrlRule,Ft as experiences,Se as explain,J as frequencyPlugin,Te as getState,ye as init,Ee as on,ve as register};//# sourceMappingURL=experience-sdk.js.map
|
|
217
436
|
//# sourceMappingURL=experience-sdk.js.map
|