@thg-agentic/hyper-personalisation-web 3.23.0 → 3.24.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 +31 -9
- package/dist/hp.min.js +3 -3
- package/dist/onsite-answers.min.js +1 -1
- package/dist/onsite-render.min.js +12 -8
- package/dist/onsite-wheel.min.js +1 -1
- package/dist/onsite.min.js +1 -1
- package/package.json +1 -1
- package/src/ga4.js +3 -4
- package/src/index.js +4 -4
- package/src/onsite/index.js +115 -36
- package/src/onsite/render.js +356 -83
- package/src/onsite/rules.js +16 -3
- package/src/onsite/styles.js +7 -3
- package/src/onsite/wheel.js +53 -5
- package/src/onsite-facade.js +27 -3
- package/src/version.js +1 -1
- package/types/onsite.d.ts +8 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(()=>{async function
|
|
1
|
+
(()=>{async function Re(n,o,a){let l=m=>Array.from(new Uint8Array(m),v=>v.toString(16).padStart(2,"0")).join(""),u=new TextEncoder,x=n.maxnumber??1e6;for(let m=0;m<=x;m+=256){let v=[];for(let T=m;T<m+256&&T<=x;T++)v.push(crypto.subtle.digest("SHA-256",u.encode(n.salt+T)));let h=(await Promise.all(v)).findIndex(T=>l(T)===n.challenge);if(h>=0)return m+h;if(o&&await o(),a?.aborted)return null}return null}var kt=()=>globalThis.scheduler?.postTask?.(()=>{},{priority:"user-visible"})??new Promise(n=>setTimeout(n,0)),De=(n,o)=>Re(n,kt,o);function At(n,o){let a=`onmessage=async(e)=>postMessage(await(${Re})(e.data))`,l=URL.createObjectURL(new Blob([a],{type:"text/javascript"}));return new Promise((u,x)=>{let m;try{m=new Worker(l)}catch(h){URL.revokeObjectURL(l),x(h);return}let v=(h,T)=>{m.terminate(),URL.revokeObjectURL(l),h(T)};o.addEventListener("abort",()=>v(u,null),{once:!0}),m.onmessage=h=>v(u,h.data),m.onerror=h=>{h.preventDefault?.(),v(x,h)},m.postMessage({challenge:n.challenge,salt:n.salt,maxnumber:n.maxnumber})})}var St=n=>n&&n.algorithm==="SHA-256"&&typeof n.challenge=="string"&&typeof n.salt=="string"&&typeof n.signature=="string";async function Ue(n){if(!St(n)||typeof crypto?.subtle?.digest!="function")return null;let o=Date.now(),a=new AbortController,l,u=new Promise(v=>{l=setTimeout(()=>v(null),2e4)}),x=typeof Worker=="function"&&typeof Blob=="function"?At(n,a.signal).catch(()=>De(n,a.signal)):De(n,a.signal),m=await Promise.race([x,u]);return clearTimeout(l),a.abort(),typeof m!="number"?null:btoa(JSON.stringify({algorithm:n.algorithm,challenge:n.challenge,number:m,salt:n.salt,signature:n.signature,took:Date.now()-o}))}function B(n){if(typeof n!="string")return null;try{let o=new URL(n);return o.protocol==="https:"?o.href:null}catch{return null}}function G(n){if(typeof n!="string")return null;try{let o=new URL(n);return o.protocol==="https:"||o.protocol==="http:"&&o.hostname==="localhost"?o.href:null}catch{return null}}function pe(n,o,a,l){if(typeof o=="string"){n.append(a.createTextNode(o));return}if(l>6||o===null)return;if(Array.isArray(o)){for(let v of o)pe(n,v,a,l+1);return}if(typeof o!="object")return;let u="b"in o?"b":"i"in o?"i":"a"in o?"a":null;if(!u)return;let x=u==="a"?B(o.href):null,m=u==="a"&&!x?n:a.createElement(u);x&&(m.setAttribute("href",x),m.setAttribute("rel","noopener")),pe(m,o[u],a,l+1),m!==n&&n.append(m)}function We(n,o=document){let a=o.createDocumentFragment();return pe(a,n,o,0),a}var Et=n=>n!==null&&typeof n=="object"&&!Array.isArray(n);function V(n,o,a){if(typeof a=="string"&&a)return a;let l=Et(n?.next?.answers)?n.next.answers:{};for(let[u,x]of Object.entries(l)){let m=u.indexOf("="),v=o[u.slice(0,m)];if(m>0&&v?.includes(u.slice(m+1)))return x}return typeof n?.next?.default=="string"?n.next.default:null}var ue={AT:"43",AU:"61",BE:"32",CA:"1",CH:"41",DE:"49",DK:"45",ES:"34",FI:"358",FR:"33",GB:"44",IE:"353",IT:"39",NL:"31",NO:"47",NZ:"64",PL:"48",PT:"351",SE:"46",US:"1"};function Fe(n,o){let a=String(n??"").replace(/[\s.()-]/g,"");a.startsWith("00")&&(a=`+${a.slice(2)}`);let l=ue[String(o??"").toUpperCase()];return!a.startsWith("+")&&l&&(a=`+${l}${a.replace(/^0/,"")}`),/^\+[1-9]\d{7,14}$/.test(a)?a:null}var Ye=n=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(n);function fe(n,o,a,l,u){let x=n("select","i");x.setAttribute("aria-label",o);for(let[m,v]of[["",a],...l]){let h=n("option","",v);h.value=m,h.selected=m===u,x.append(h)}return x}var he={system:"system-ui,sans-serif","neo-grotesque":'Inter,Roboto,"Helvetica Neue",Arial,sans-serif',humanist:'Seravek,"Gill Sans Nova",Ubuntu,Calibri,sans-serif',"geometric-humanist":"Avenir,Montserrat,Corbel,sans-serif","rounded-sans":'ui-rounded,Quicksand,Comfortaa,"Arial Rounded MT Bold",sans-serif',industrial:'Bahnschrift,"DIN Alternate","Franklin Gothic Medium",sans-serif',transitional:'Charter,"Sitka Text",Cambria,serif',"old-style":'"Iowan Old Style","Palatino Linotype",P052,serif',didone:'Didot,"Bodoni MT","Noto Serif Display",serif',"slab-serif":'Rockwell,"Roboto Slab","DejaVu Serif",serif'},me="cubic-bezier(.16,1,.3,1)",be=`
|
|
2
2
|
:host{all:initial}
|
|
3
3
|
:host([preview]){display:block;position:relative;width:100%;height:100%;overflow:hidden;contain:layout paint}
|
|
4
4
|
.s{--a:var(--hp-accent,#111);--b:var(--hp-bg,#fff);--t:var(--hp-text,#111);--r:var(--hp-radius,16px);--oa:var(--hp-on-accent,#fff);--ot:var(--hp-on-accent-text,var(--oa));--fl:var(--hp-field,color-mix(in srgb,var(--t) 5%,var(--b)));--ft:var(--hp-field-text,var(--t));--mu:color-mix(in srgb,var(--t) 74%,var(--b));--ln:color-mix(in srgb,var(--t) 18%,var(--b));--br:min(12px,var(--r));--ir:min(var(--r),8px);font:16px/1.5 var(--hp-font,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif);color:var(--t);-webkit-font-smoothing:antialiased;box-sizing:border-box;margin:0;padding:0;border:0;background:none;max-width:none;max-height:none;overflow:visible}
|
|
@@ -13,7 +13,7 @@ dialog::backdrop{background:none}
|
|
|
13
13
|
.mob.popup{padding:12px}
|
|
14
14
|
.ov{display:none;position:absolute;inset:0;background:var(--hp-ov,rgb(10 10 14/.6));animation:hp-fade .3s ease both}
|
|
15
15
|
.popup>.ov,.fullscreen>.ov{display:block}
|
|
16
|
-
.w{position:relative;display:flex;flex-direction:column;width:min(100%,480px);max-height:100%;min-height:0;overflow:auto;overscroll-behavior:contain;background:var(--b);color:var(--t);border-radius:var(--r);box-shadow:0 24px 48px -24px rgb(0 0 0/.35),0 0 0 1px rgb(0 0 0/.05);animation:hp-pop .44s ${
|
|
16
|
+
.w{position:relative;display:flex;flex-direction:column;width:min(100%,480px);max-height:100%;min-height:0;overflow:auto;overscroll-behavior:contain;background:var(--b);color:var(--t);border-radius:var(--r);box-shadow:0 24px 48px -24px rgb(0 0 0/.35),0 0 0 1px rgb(0 0 0/.05);animation:hp-pop .44s ${me} both}
|
|
17
17
|
.z-sm{width:min(100%,380px)}
|
|
18
18
|
.z-lg{width:min(100%,880px)}
|
|
19
19
|
.z-full,.fullscreen .w{width:100%;height:100%;max-height:none;border-radius:0;box-shadow:none}
|
|
@@ -36,7 +36,9 @@ dialog::backdrop{background:none}
|
|
|
36
36
|
.io{display:block;width:100%;padding:0;border:0;background:none;cursor:pointer;color:inherit}
|
|
37
37
|
.f{display:flex;flex-direction:column;gap:14px;padding:44px 40px 36px;flex:1 0 auto;min-width:0}
|
|
38
38
|
.t-split .f{flex:1 1 0;justify-content:center}
|
|
39
|
+
.lk{min-width:var(--lw);min-height:var(--lh)}
|
|
39
40
|
.lk>.f{justify-content:center}
|
|
41
|
+
.an{align-self:start;margin-top:var(--tp,0px);max-height:calc(100% - var(--tp,0px))}
|
|
40
42
|
.z-full .f,.fullscreen .f{justify-content:center;width:min(100%,560px);margin:auto}
|
|
41
43
|
.pd-none{padding:0}
|
|
42
44
|
.pd-sm{padding:24px}
|
|
@@ -103,12 +105,12 @@ legend{padding:0;margin-bottom:8px;font-size:13px;font-weight:600}
|
|
|
103
105
|
.pg{display:flex;flex-direction:column;gap:8px}
|
|
104
106
|
.pg p{font-weight:600}
|
|
105
107
|
.tr{height:6px;border-radius:99px;background:color-mix(in srgb,var(--t) 18%,var(--b));overflow:hidden}
|
|
106
|
-
.tr i{display:block;height:100%;border-radius:inherit;background:var(--a);transform:scaleX(0);transform-origin:left;transition:transform .6s ${
|
|
108
|
+
.tr i{display:block;height:100%;border-radius:inherit;background:var(--a);transform:scaleX(0);transform-origin:left;transition:transform .6s ${me}}
|
|
107
109
|
.tm{font-size:40px;line-height:1;font-weight:800;letter-spacing:.02em;font-variant-numeric:tabular-nums;text-align:center}
|
|
108
110
|
.bi{display:block;width:100%;height:auto}
|
|
109
111
|
.bl{display:block;border-radius:var(--br)}
|
|
110
112
|
hr{width:100%;margin:4px 0;border:0;border-top:1px solid var(--ln)}
|
|
111
|
-
.wh{width:min(100%,320px);align-self:center}
|
|
113
|
+
.wh{width:min(100%,320px);aspect-ratio:1;align-self:center}
|
|
112
114
|
.wh svg{display:block;width:100%;height:auto;filter:drop-shadow(0 16px 24px rgb(0 0 0/.2))}
|
|
113
115
|
.hd{display:none}
|
|
114
116
|
.uc h2{text-transform:uppercase;font-weight:800;letter-spacing:-.01em;line-height:1.02}
|
|
@@ -159,14 +161,16 @@ hr{width:100%;margin:4px 0;border:0;border-top:1px solid var(--ln)}
|
|
|
159
161
|
.p-left .tb,.p-right .tb{writing-mode:vertical-rl;padding:22px 13px;border-radius:var(--br) 0 0 var(--br)}
|
|
160
162
|
.p-left .tb{transform:rotate(180deg)}
|
|
161
163
|
.b-pill.teaser .tb{border-radius:999px}
|
|
162
|
-
.teaser .x{top
|
|
163
|
-
.teaser.
|
|
164
|
+
.teaser .x{top:auto;right:0;bottom:100%;border:10px solid transparent;background:var(--t) padding-box;box-shadow:none;color:var(--b)}
|
|
165
|
+
.teaser .x::before,.teaser .x::after{width:10px}
|
|
166
|
+
.teaser.p-left .x,.teaser.p-right .x{bottom:auto;top:100%}
|
|
167
|
+
.teaser.p-left .x{right:auto;left:0}
|
|
164
168
|
.inline{position:static;display:block;height:100%}
|
|
165
169
|
.inline .w{width:100%;height:100%;box-shadow:none;border:1px solid var(--ln);animation:none}
|
|
166
170
|
.inline .t-stack .m{max-height:none}
|
|
167
171
|
.out .w{animation:hp-out .2s ease-in both}
|
|
168
172
|
.out .ov{animation:hp-fade .2s ease-in reverse both}
|
|
169
|
-
.f>*{animation:hp-rise .5s ${
|
|
173
|
+
.f>*{animation:hp-rise .5s ${me}}
|
|
170
174
|
.pv .w,.pv .ov,.pv .f>*,.inline .f>*{animation:none}
|
|
171
175
|
@keyframes hp-pop{from{opacity:0;transform:translateY(24px) scale(.96)}}
|
|
172
176
|
@keyframes hp-fade{from{opacity:0}}
|
|
@@ -175,4 +179,4 @@ hr{width:100%;margin:4px 0;border:0;border-top:1px solid var(--ln)}
|
|
|
175
179
|
@keyframes hp-down{from{transform:translateY(-100%)}}
|
|
176
180
|
@keyframes hp-out{to{opacity:0;transform:translateY(12px) scale(.98)}}
|
|
177
181
|
@media (prefers-reduced-motion:reduce){.s .w,.s .ov,.f>*{animation:hp-fade .15s ease both!important}.btn{transition:none}}
|
|
178
|
-
`;var dt=/^#(?:[0-9a-f]{3}){1,2}$/i,Pe=["popup","fullscreen"],pt=["ok","verify","already"],ut=["stack","split","overlay","image-only"],qe={bar:["bottom","top"],sheet:["bottom-right","bottom-left","bottom"],teaser:["bottom-left","bottom-right","left","right"]},ft=["xs","sm","md","lg","xl","display"],Re={xs:4,sm:8,md:16,lg:28,xl:44},De={sm:380,md:480,lg:880},mt=["left","center","right"],Ue={secondary:" b2",link:" no"},ht=220,bt=[500,1500],xt=1800,$={email:"Enter a valid email address.",phone:"Enter a valid mobile number.",intl:"Enter a valid mobile number, starting with + and its country code.",consent:"Tick the box to sign up.",failed:"Something went wrong. Please try again.",busy:"Too many tries. Please wait a moment and try again.",spin:"Sign up first to spin.",held:"Your code",code:"We\u2019ll email your code to you.",claimed:"This email address has already claimed its code.",copied:"Copied",thanks:"Thanks, you\u2019re signed up",unavailable:"Not available right now.",won:"You won"},O=o=>o!==null&&typeof o=="object"&&!Array.isArray(o),P=(o,r,s)=>o.includes(r)?r:s,L=(o,r,s)=>Number.isFinite(o)?Math.min(Math.max(o,r),s):null,pe=o=>o.type==="date"||o.type==="number",ue=()=>globalThis.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches===!0;function gt(o){let r=O(o.layout)?o.layout:{},s=O(r.media)?r.media:null,c=P(ut,r.template,"stack"),f=s?.side==="right"?"right":"left";return!s&&O(r.image)&&r.image.side!=="none"&&(s=r.image,r.image.side!=="top"&&(c="split",f=r.image.side==="right"?"right":"left")),(!s||!Z(s.asset))&&(s=null,c="stack"),{template:c,media:s,side:f,scrim:L(r.scrim,0,.9)??.45,padding:P(["none","sm","md","lg"],r.padding,"md")}}var yt=0,fe=o=>`hp-${o}-${++yt}`;function p(o,r,s){let c=document.createElement(o);return r&&(c.className=r),s!==void 0&&c.append(Oe(s)),c}var We=o=>{let r=o.length===4?[...o.slice(1)].map(s=>s+s).join(""):o.slice(1);return[0,2,4].map(s=>Number.parseInt(r.slice(s,s+2),16))},Y=o=>{let[r,s,c]=We(o).map(f=>{let x=f/255;return x<=.04045?x/12.92:((x+.055)/1.055)**2.4});return .2126*r+.7152*s+.0722*c},Fe=(o,r=4.5)=>{let s=Y(o)+.05,c=1.05/s;return c>=r?"#fff":s/(Y("#111")+.05)>c?"#111":"#fff"};function vt(o,r){let s=(S,C)=>C&&o.style.setProperty(S,C),c=S=>dt.test(S??"")?S:null;s("--hp-accent",c(r.accent)),s("--hp-bg",c(r.background)),s("--hp-text",c(r.text));let f=L(r.radius,0,48);f!==null&&s("--hp-radius",`${f}px`),s("--hp-font",r.font==="site"?o.ownerDocument.defaultView.getComputedStyle(o.parentElement??o.ownerDocument.body).fontFamily:Object.hasOwn(ce,r.font)?ce[r.font]:null),c(r.accent)&&(s("--hp-on-accent",Fe(r.accent,3)),s("--hp-on-accent-text",Fe(r.accent))),c(r.background)&&Y(r.background)<.18&&(s("--hp-field","#fff"),s("--hp-field-text","#111"));let x=O(r.overlay)?r.overlay:{},h=[c(r.text),c(r.background)].filter(Boolean).sort((S,C)=>Y(S)-Y(C))[0],[v,u,z]=We(c(x.colour)??h??"#0b0b0f");s("--hp-ov",`rgb(${v} ${u} ${z} / ${L(x.opacity,0,1)??.6})`)}function wt(o){try{let r=new CSSStyleSheet;r.replaceSync(de),o.adoptedStyleSheets=[r]}catch{let r=document.createElement("style");r.textContent=de,o.append(r)}}function He(o){let{form:r,creative:s,decision:c,access:f,client:x,api:h,counters:v}=o,u=o.preview??null,z=e=>{let t=e.blocks.find(n=>n?.t==="email"||n?.t==="phone");return t?.t==="phone"||!t&&!r.consent_text?r.sms_consent_text:r.consent_text},S=r.format==="inline"?"inline":s.format&&s.format!=="inline"?s.format:r.format,C=s.theme,me=P(qe[S]??[],C.position,qe[S]?.[0]),N=document.createElement("hp-onsite");u&&N.setAttribute("preview",""),vt(N,C);let B=N.attachShadow({mode:"open"});wt(B);let J=S!=="inline"&&!u,y=p(J?"dialog":S==="inline"?"section":"div"),he=p("div","ov"),A=p("div","w"),j=p("div","m");u&&(j.dataset.hpMedia="");let be=()=>{let e=p("form","f");return e.noValidate=!0,e.addEventListener("submit",ot),e.addEventListener("input",()=>{_.textContent&&w.getAttribute("aria-busy")!=="true"&&T(null)}),e},w=be(),_=p("p","e");_.id=fe("err"),_.setAttribute("aria-live","assertive");let Q=p("div","hd");if(Q.setAttribute("aria-hidden","true"),A.append(Q,j,w),y.append(he,A),S!=="inline"){let e=p("button","x");e.type="button",e.setAttribute("aria-label","Close"),e.addEventListener("click",()=>M("close")),A.append(e),he.addEventListener("click",()=>M("close"))}B.append(y);let i={step:null,mode:S,size:"md",modal:!1,mobile:u?.device==="mobile",answers:{},sent:new Set,receipt:null,claim:o.coupon?{code:o.coupon}:u?{code:"WELCOME15"}:null,claiming:null,owed:!1,submitted:!1,pow:null,wheel:null,timers:[],codes:[],videos:[],closed:!1},G=r.locale||document.documentElement.lang,Ye=r.questions.some(pe)&&o.loadAnswers().catch(()=>null),xe=new WeakMap,ge=()=>{let e=O(C.button)?C.button:{};y.className=`s ${i.mode}${me?` p-${me}`:""} b-${P(["pill","rounded","square"],e.shape,"rounded")}${i.mobile?" mob":""}${u?" pv":""}${e.style==="outline"?" bo":""}${C.caps===!0?" uc":""}`},F=u?null:globalThis.matchMedia?.("(max-width: 639px)"),ye=()=>{i.mobile=F?.matches===!0,A.classList.remove("lk"),A.style.removeProperty("min-width"),A.style.removeProperty("min-height"),ge()};F&&(i.mobile=F.matches===!0,F.addEventListener?.("change",ye));let X=(e,t)=>{u||!c.decision_id||!f.analytics()||x.slotEngaged({decision_id:c.decision_id,slot:c.slot,arm:c.arm??null,engagement:e,step:t??i.step?.id??null})},T=(e,t)=>{_.className="e",_.textContent=e??"";for(let a of w.querySelectorAll("[aria-invalid]"))a.removeAttribute("aria-invalid");let n=t?.closest("label,fieldset");n&&w.contains(n)?n.after(_):w.append(_),t&&(t.setAttribute("aria-invalid","true"),t.setAttribute("aria-describedby",_.id),t.focus(),t.scrollIntoView?.({block:"nearest"}))},W=e=>{w.setAttribute("aria-busy",String(e));for(let t of w.querySelectorAll("button"))t.disabled=e},ve=()=>u?Promise.resolve(null):(i.pow??(i.pow=h.challenge().then(e=>e.status===200?Ie(e.body):null).catch(()=>null)),i.pow),ee=()=>{for(let e of i.videos)try{document.hidden||ue()?e.pause():e.play()?.catch?.(()=>{})}catch{}};document.addEventListener("visibilitychange",ee);let Be=(e=1)=>{if(i.mode==="fullscreen"||i.size==="full")return"100vw";let t=i.mode==="teaser"?220:i.mode==="sheet"?400:De[i.size]??De.md;return`(max-width: 639px) 100vw, ${Math.round(t*e)}px`},Ge=(e,t,n)=>{if(!n||!Array.isArray(e.widths)||!t.endsWith(".webp"))return null;let a=e.widths.filter(l=>Number.isInteger(l)&&l>0&&l<n);return a.length===0?null:[...a.map(l=>`${t.slice(0,-5)}-${l}w.webp ${l}w`),`${t} ${n}w`].join(",")};function we(e,t,n,a){let l=Z(e.asset);if(!l)return null;let m=typeof e.alt=="string"?e.alt:"",d;if(e.kind==="video"||e.t==="video"){d=p("video",t),d.muted=d.defaultMuted=d.loop=d.playsInline=!0;let k=Z(e.poster);k&&(d.poster=k),m?d.setAttribute("aria-label",m):d.setAttribute("aria-hidden","true"),d.autoplay=!ue()&&!u,d.src=l,i.videos.push(d)}else{d=p("img",t),d.alt=m,d.decoding="async",d.loading=n?"eager":"lazy";let k=Ge(e,l,L(e.width,1,8192));k&&(d.sizes=Be(a),d.srcset=k),d.src=l}let b=L(e.width,1,8192),g=L(e.height,1,8192);return b&&g&&(d.width=b,d.height=g),O(e.focal)&&(d.style.objectPosition=`${L(e.focal.x,0,100)??50}% ${L(e.focal.y,0,100)??50}%`),d}function ke(e,t){let n=p("label","l");n.append(p("span","lt",e.label??(t==="email"?"Email":"Mobile number")));let a=p("input","i");if(a.type=t,a.name=t==="email"?"email":"phone",a.autocomplete=a.inputMode=t,a.required=!0,typeof e.placeholder=="string"&&(a.placeholder=e.placeholder),a.setAttribute("aria-describedby",_.id),a.addEventListener("focus",ve,{once:!0}),t!=="tel")return n.append(a),n;a.id=`${_.id}-p`,n.htmlFor=a.id;let l=ae(p,"Country code","+",Object.entries(se).map(([d,b])=>[d,`${d} +${b}`]),(e.country||/-(\w\w)$/.exec(G)?.[1]||"").toUpperCase());l.classList.add("cc"),l.name="hp_cc";let m=p("span","ph");return m.append(l,a),n.append(m),n}function Xe(e){let t=r.questions.find(b=>b.key===e.question);if(!t||!pe(t)&&!Array.isArray(t.options))return null;let n=p("fieldset");n.dataset.question=t.key,n.append(p("legend","",t.label??""));let a=i.answers[t.key]??[];if(pe(t))return Ye.then(b=>{if(!b)return n.append(p("p","sm",$.unavailable));b.answerFields(n,t,p,a[0],G),xe.set(n,()=>b.answerOf(n,t,void 0,G))}),n;let l=t.type==="many",m=P(["list","dropdown"],e.display,"buttons"),d=t.options.filter(b=>O(b)&&typeof b.value=="string");if(m==="dropdown"&&!l)return n.append(ae(p,t.label??t.key,"\u2014",d.map(b=>[b.value,b.label??b.value]),a[0])),n;m!=="buttons"&&(n.className="ls");for(let b of d){let g=p("input");g.value=b.value,g.checked=a.includes(b.value),g.type=l?"checkbox":"radio",g.name=`q_${t.key}`;let k=p("label",m==="buttons"?"ch":"c");k.append(g,p("span","",b.label??b.value)),n.append(k)}return n}function te(){for(let e of i.codes){if(e.replaceChildren(),!i.claim)continue;if(!i.claim.code){e.append(p("p","",i.claim.held?$.claimed:$.code));continue}let t=p("output");t.textContent=i.claim.code;let n=p("button","btn cp");n.type="button",n.textContent="Copy code",n.addEventListener("click",()=>{navigator.clipboard?.writeText(i.claim.code).then(()=>{n.textContent=$.copied}).catch(()=>{})}),e.append(t,n)}}function Ve(e){if(i.claim&&!i.claim.code)return null;let t=p("p","tm");t.setAttribute("role","timer");let n=Date.now()+Math.max(0,Number(e.minutes)||0)*6e4,a=()=>{let m=Math.max(0,Math.round((n-Date.now())/1e3));t.textContent=`${String(Math.floor(m/60)).padStart(2,"0")}:${String(m%60).padStart(2,"0")}`,m===0&&clearInterval(l)},l=setInterval(a,1e3);return i.timers.push(l),a(),t}function ne(e,t){return e.href=t,e.rel="noopener",e.addEventListener("click",n=>{u?n.preventDefault():X("click")}),e}function Ke(e){let t=e.label??"Continue";if(e.action==="link"){let a=D(e.href);return a?ne(p("a",`btn${Ue[e.variant]??""}`,t),a):null}let n=p("button",`btn${Ue[e.variant]??""}`,t);return n.type=e.action==="submit"?"submit":"button",n.type==="button"?n.addEventListener("click",()=>K(e)):n.dataset.submit="",n}let Ae=(e,t,n)=>(e.classList.add(`x-${P(ft,t.size,n)}`),mt.includes(t.align)&&e.classList.add(`a-${t.align}`),e);function Se(e){let t=we(e,"bi",!1);if(!t)return null;t.style.objectFit=e.fit==="contain"?"contain":"cover";let n=L(e.radius,0,48);n!==null&&(t.style.borderRadius=`${n}px`);let a=L(e.max_height,40,800);if(a!==null&&(t.style.maxHeight=`${a}px`),!t.width&&e.fit!=="contain"&&(t.style.aspectRatio="16 / 9"),e.t==="video"||!D(e.href))return t;let l=ne(p("a","bl"),D(e.href));return l.append(t),l}function Ze(e){let t=L(e.threshold,.01,1e7);if(!t)return null;let n=p("div","pg"),a=p("p"),l=p("div","tr"),m=p("i");l.append(m),l.setAttribute("role","progressbar"),l.setAttribute("aria-valuemin","0"),l.setAttribute("aria-valuemax",String(t)),n.append(a,l);let d=g=>g.toFixed(2);try{let g=new Intl.NumberFormat(G||void 0,{style:"currency",currency:e.currency});d=k=>g.format(k)}catch{}let b=()=>{let g=Math.max(0,Number(o.basket?.())||0),k=t-g;a.textContent=k>0?String(e.text??"").replace("{amount}",d(k)):e.done??"",m.style.transform=`scaleX(${Math.min(1,g/t)})`,l.setAttribute("aria-valuenow",String(Math.min(g,t))),a.id||(a.id=fe("pg")),l.setAttribute("aria-labelledby",a.id)};return b(),i.timers.push(setInterval(b,2e3)),n}let Ee={heading(e){let t=Ae(p("h2","",e.text),e,"xl");return t.id=fe("h"),t.tabIndex=-1,y.hasAttribute("aria-labelledby")||(y.setAttribute("aria-labelledby",t.id),i.step===s.steps[0]&&Pe.includes(i.mode)&&!u&&(t.autofocus=!0)),t},text:e=>Ae(p("p","",e.text),e,"md"),email:e=>ke(e,"email"),phone:e=>ke(e,"tel"),consent(e){let t=z(i.step)?.text;if(typeof t!="string")return null;if(e.required!==!0)return p("p","sm",t);let n=p("label","c"),a=p("input");return a.type="checkbox",a.name="hp_consent",a.required=!0,a.setAttribute("aria-describedby",_.id),n.append(a,p("span","",t)),n},question:Xe,wheel(){let e=p("div","wh");return o.loadWheel().then(t=>{i.closed||(i.wheel=t.mountWheel(e,r.prizes))}).catch(()=>{}),e},code(){let e=p("div","k");return e.setAttribute("aria-live","polite"),i.codes.push(e),e},button:Ke,decline(e){let t=p("button","btn no",e.label??"No thanks");return t.type="button",t.addEventListener("click",()=>M("decline")),t},countdown:Ve,progress:Ze,image:Se,video:Se,spacer(e){let t=p("div","sp");return t.style.height=`${Re[e.size]??Re.md}px`,t.setAttribute("aria-hidden","true"),t},divider:()=>p("hr")};function Je(e,t){j.replaceChildren();let n=e.media,a=P(["sm","md","lg","full"],C.size,null),l=e.template==="split"||e.template==="overlay"?"lg":"md",m=!n||t&&e.template!=="image-only";if(i.size=a??l,A.className=`w t-${e.template} z-${a??l}${e.side==="right"?" right":""}${C.text_align==="center"?" ta-center":""}${m?" nm":""}`,A.style.setProperty("--sc",String(e.scrim)),w.className=`f pd-${e.padding}`,j.hidden=m,j.hidden)return;let d=we(n,"",!0,e.template==="split"?.46:1);if(!d)return;if(d.width?A.style.setProperty("--ar",`${d.width} / ${d.height}`):A.style.removeProperty("--ar"),e.template!=="image-only"){d.tagName==="IMG"&&e.template==="overlay"&&(d.alt=""),j.append(d);return}let b=D(n.href),g=b?ne(p("a","io"),b):p("button","io");b||(g.type="button",g.addEventListener("click",()=>K({action:"next"}))),g.append(d),j.append(g)}function Qe(e){let t=e.blocks.find(l=>l?.t==="heading"),n=e.blocks.find(l=>l?.t==="button"&&l.action==="next"),a=p("button","tb");return a.textContent=t?p("b","",t.text).textContent:n?.label??"Open",a.type="button",a.addEventListener("click",()=>K(n??{action:"next"})),a}function q(e,t=new Set){let n=s.steps.find(E=>E.id===e);if(!n)return M("done");if(n.kind==="question"&&!u&&!f.analytics()&&!t.has(n.id))return q(U(n,i.answers),t.add(n.id));let a=i.step!==null,l=a&&(B.activeElement||document.activeElement===document.body),m=a&&!u?{mode:i.mode,w:A.offsetWidth,h:A.offsetHeight}:null;i.step=n;for(let E of i.timers.splice(0))clearInterval(E);i.codes=[],i.videos=[],i.wheel=null;let d=S==="teaser"&&n===s.steps[0];if(i.mode=S==="teaser"&&!d?"popup":S,S==="teaser"&&v.tab?.(r.slot,d),ge(),y.removeAttribute("aria-labelledby"),m){let E=be();w.replaceWith(E),w=E}let b=gt(n);if(Je(b,d),m?.mode===i.mode&&m.h>0?(A.classList.add("lk"),A.style.minWidth=`${m.w}px`,A.style.minHeight=`${m.h}px`):(A.style.removeProperty("min-width"),A.style.removeProperty("min-height")),w.replaceChildren(),d&&b.template!=="image-only")w.append(Qe(n));else for(let[E,I]of n.blocks.entries()){let R=O(I)&&Object.hasOwn(Ee,I.t)?Ee[I.t](I):null;R&&(u&&(R.dataset.hpBlock=String(E)),w.append(R))}let g=w.querySelector("[data-submit]"),k=w.querySelector("[name=hp_consent]")?.parentNode;g&&k&&g.before(k),w.hidden=w.childElementCount===0,T(null),te(),y.hasAttribute("aria-labelledby")?y.removeAttribute("aria-label"):y.setAttribute("aria-label",b.media?.alt?.trim?.()||"Sign up"),a&&$e(),ee(),l&&w.querySelector("h2")?.focus()}function $e(){if(!J)return;let e=Pe.includes(i.mode);if(!(y.open&&i.modal===e)){try{y.open&&y.close()}catch{}if(i.modal=e,y.setAttribute("aria-modal",String(e)),e&&typeof y.showModal=="function")y.showModal();else if(typeof y.show=="function"){let t=document.activeElement;y.show(),t&&t!==document.body?t.focus?.({preventScroll:!0}):N.blur()}else y.setAttribute("open","");!e||typeof y.showModal!="function"?y.setAttribute("role","dialog"):y.removeAttribute("role")}}function et(){for(let e of w.querySelectorAll("fieldset[data-question]")){let t=e.dataset.question,n=xe.get(e)?.()??{};if(n.error)return n;let a=[n.value,...[...e.querySelectorAll("input:checked,select:not([name])")].map(l=>l.value)].filter(Boolean);a.length?i.answers[t]=a:delete i.answers[t]}}function tt(){let e=[];for(let[n,a]of Object.entries(i.answers)){let l=`${n}=${a.join(",")}`;i.sent.has(l)||(i.sent.add(l),e.push({question:n,values:a}))}let t=i.step.id;if(i.signedUp&&e.length)return void h.answers({anonymousId:f.anonymousId(),sessionId:f.sessionId()??void 0,slot:c.slot,arm:c.arm??void 0,decision_id:c.decision_id??void 0,step:t,...i.signedUp,answers:e,context:_e()});if(f.analytics())for(let n of e)x.preferencesStated({...n,source:"onsite",slot:c.slot,arm:c.arm??null,decision_id:c.decision_id??null,step:t})}let _e=()=>({page:{url:f.pageUrl()},locale:f.locale()??void 0,consent:f.consent()}),V=e=>{i.receipt&&!u&&tt(),q(U(i.step,i.answers,e))};async function nt(e){let t=i.step,n=w.querySelector("input[name=email],input[name=phone]");if(!n)return V(e.next);let a=n.name==="email"?"email":"sms",l=w.querySelector("select[name=hp_cc]")?.value,m=a==="email"?je(n.value.trim())?n.value.trim():null:Ne(n.value,l);if(!m)return T(a==="email"?$.email:l?$.phone:$.intl,n);let d=w.querySelector("input[name=hp_consent]");if(d&&!d.checked)return T($.consent,d);T(null),W(!0);let b=await ve();i.pow=null;let g=Object.entries(i.answers).map(([H,oe])=>({question:H,values:oe})),k=a==="sms"?r.sms_consent_text:r.consent_text,E=await h.capture({anonymousId:f.anonymousId(),sessionId:f.sessionId()??void 0,slot:c.slot,arm:c.arm??void 0,decision_id:c.decision_id??void 0,step:t.id,channel:a,[a==="email"?"email":"phone"]:m,...a==="sms"&&i.signedUp,consent_text:k?{id:k.id,version:k.version}:void 0,...g.length?{answers:g}:{},...b?{altcha:b}:{},context:_e()}),I=E.body?.status,R=(E.status===202||E.status===200)&&pt.includes(I);if(i.closed&&!R)return;W(!1);let ie=E.status===400?E.body?.field:null;if(ie==="email"||ie==="phone")return T($[ie],n);if(!R)return T(E.status===429?$.busy:$.failed,n);n.value="";for(let[H,oe]of Object.entries(i.answers))i.sent.add(`${H}=${oe.join(",")}`);i.receipt=typeof E.body.receipt=="string"?E.body.receipt:null,a==="email"&&(i.signedUp={email:m,email_receipt:i.receipt}),i.submitted=!0,v.submitted(r.slot),X("submit",t.id),i.owed=a==="email"&&r.prizes.length>0,i.owed?Ce():o.emit?.("submitted",{coupon:null});let rt=I!=="ok"&&s.steps.some(H=>H.id===I);i.closed||q(rt?I:U(t,i.answers,e.next))}function ze(e){i.owed&&(i.owed=!1,o.emit?.("submitted",{coupon:e?{code:e.code??null,prize:e.prize?.key}:null}))}function Ce(){let e=i.receipt;return i.claiming??(i.claiming=(async()=>{let t;for(let l of[0,...bt])if(l&&await new Promise(m=>setTimeout(m,l)),t=await h.claim({slot:c.slot,decision_id:c.decision_id??void 0,receipt:e}),t.status!==503)break;let n=t.body,a=n?.fallback===!0&&!n.code;return t.status!==200||!(O(n?.prize)||a)?(i.claiming=null,ze(null),null):(i.claim=n,typeof n.code=="string"&&v.code?.(n.code),ze(n),i.closed||te(),n)})()),i.claiming}async function it(e){if(!i.receipt)return T($.spin);W(!0);let t=await Ce();if(i.closed)return;if(!t)return W(!1),T($.failed);let n=t.fallback===!0&&!t.code,a=t.held?-1:r.prizes.findIndex(d=>d.key===t.prize?.key&&d.label===t.prize?.label);if(i.wheel&&a>=0&&!n){if(await i.wheel.spinTo(a),i.closed)return;_.className="e won",_.textContent=`${$.won} ${t.prize.label}`,await new Promise(d=>setTimeout(d,xt))}if(i.closed)return;W(!1);let l=n?"fallback":a<0?"held":null;l&&!s.steps.some(d=>d.id===l)&&s.steps.push({id:l,blocks:[{t:"heading",text:n?$.thanks:$.held},{t:"code"}]});let m=l??U(i.step,i.answers,e.next);m?q(m):te()}function K(e){if(e.action==="close")return M("close");let t=et();return u?V(e.next):t?T(t.error,t.input):e.action==="apply"?(o.emit?.("apply",{coupon:i.claim?.code?{code:i.claim.code}:null}),X("click"),U(i.step,i.answers,e.next)?V(e.next):M("done")):e.action==="submit"?nt(e):e.action==="spin"?it(e):V(e.next)}function ot(e){if(e.preventDefault(),w.getAttribute("aria-busy")==="true")return;let t=i.step.blocks.find(n=>n?.t==="button"&&n.action==="submit");K(t??{action:"next"})}function Le(){i.closed=!0;for(let t of i.timers.splice(0))clearInterval(t);document.removeEventListener("visibilitychange",ee),F?.removeEventListener?.("change",ye);let e=()=>{try{y.open&&y.close()}catch{}N.remove()};if(!J||ue())return e();y.classList.add("out"),setTimeout(e,ht)}function M(e){i.closed||u||(!i.submitted&&e!=="done"&&X("dismiss"),v.closed(r.slot),v.tab?.(r.slot,!1),Le(),o.onClose?.(e))}return y.addEventListener("cancel",e=>{e.preventDefault(),M("esc")}),y.addEventListener("keydown",e=>{e.key==="Escape"&&!i.modal&&S!=="inline"&&M("esc")}),Q.addEventListener("pointerdown",e=>{if(!i.mobile||i.mode!=="sheet")return;let t=e.clientY,n=0,a=m=>{n=Math.max(0,m.clientY-t),A.style.transform=`translateY(${n}px)`},l=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",l),A.style.transform="",n>80&&M("close")};document.addEventListener("pointermove",a),document.addEventListener("pointerup",l)}),q(u?.step&&s.steps.some(e=>e.id===u.step)?u.step:s.steps[0].id),(o.container??document.body).append(N),$e(),{close:M,root:B,host:N,show:q,step:()=>i.step?.id??null,destroy:()=>!i.closed&&Le()}}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render")]={mountForm:He};})();
|
|
182
|
+
`;var $t=/^#(?:[0-9a-f]{3}){1,2}$/i,He=["popup","fullscreen"],_t=["ok","verify","already"],zt=["stack","split","overlay","image-only"],Be={bar:["bottom","top"],sheet:["bottom-right","bottom-left","bottom"],teaser:["bottom-left","bottom-right","left","right"]},Tt=["xs","sm","md","lg","xl","display"],Ge={xs:4,sm:8,md:16,lg:28,xl:44},Ve={sm:380,md:480,lg:880},Ct=["left","center","right"],Xe={secondary:" b2",link:" no"},Lt=220,Mt=["verify","already","held","fallback","success"],Ot=[500,1500],It=600,Pt=1800,$={email:"Enter a valid email address.",phone:"Enter a valid mobile number.",intl:"Enter a valid mobile number, starting with + and its country code.",consent:"Tick the box to sign up.",failed:"Something went wrong. Please try again.",busy:"Too many tries. Please wait a moment and try again.",spin:"Sign up first to spin.",yours:"Your code",held:"You\u2019re already on the list",resent:"We\u2019ve sent your code to your inbox again.",inbox:"Your code is in the email we sent when you first signed up.",shop:"Continue shopping",closeOffer:"Close offer",code:"We\u2019ll email your code to you.",claimed:"This email address has already claimed its code.",copied:"Copied",thanks:"Thanks, you\u2019re signed up",unavailable:"Not available right now.",won:"You won"},P=n=>n!==null&&typeof n=="object"&&!Array.isArray(n),F=(n,o,a)=>n.includes(o)?o:a,I=(n,o,a)=>Number.isFinite(n)?Math.min(Math.max(n,o),a):null,ge=n=>n.type==="date"||n.type==="number",xe=()=>globalThis.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches===!0;function Ze(n){let o=P(n.layout)?n.layout:{},a=P(o.media)?o.media:null,l=F(zt,o.template,"stack"),u=a?.side==="right"?"right":"left";return!a&&P(o.image)&&o.image.side!=="none"&&(a=o.image,o.image.side!=="top"&&(l="split",u=o.image.side==="right"?"right":"left")),(!a||!G(a.asset))&&(a=null,l="stack"),{template:l,media:a,side:u,scrim:I(o.scrim,0,.9)??.45,padding:F(["none","sm","md","lg"],o.padding,"md")}}var Je=(n,o)=>F(["sm","md","lg","full"],n.size,null)??(o.template==="split"||o.template==="overlay"?"lg":"md"),Qe=(n,o,a=1)=>{if(n==="fullscreen"||o==="full")return"100vw";let l=n==="teaser"?220:n==="sheet"?400:Ve[o]??Ve.md;return`(max-width: 639px) 100vw, ${Math.round(l*a)}px`},et=(n,o,a)=>{if(!a||!Array.isArray(n.widths)||!o.endsWith(".webp"))return null;let l=n.widths.filter(u=>Number.isInteger(u)&&u>0&&u<a).sort((u,x)=>u-x);return l.length===0?null:[...l.map(u=>`${o.slice(0,-5)}-${u}w.webp ${u}w`),`${o} ${a}w`].join(",")},tt=(n,o)=>n.format==="inline"?"inline":o.format&&o.format!=="inline"?o.format:n.format,ve=n=>n.kind==="video"||n.t==="video",we={webm:"video/webm",mp4:"video/mp4",m4v:"video/mp4",mov:"video/quicktime",ogv:"video/ogg"},ke=n=>we[n.split(/[?#]/)[0].split(".").pop().toLowerCase()],Nt=(n,o)=>[...new Set([o,...Array.isArray(n.sources)?n.sources.map(G):[]])].filter(Boolean).sort((a,l)=>(ke(l)===we.webm)-(ke(a)===we.webm));function Ae(n,o,a,l=new Set){let u=o.steps.find(k=>k.id===a);if(!u)return Promise.resolve();let x=tt(n,o),m=Ze(u),v=x==="teaser"&&u===o.steps[0],h=x==="teaser"&&!v?"popup":x,T=Je(o.theme,m),S=v?[]:u.blocks.filter(k=>P(k)&&(k.t==="image"||k.t==="video")).map(k=>[k,1]);return m.media&&!(v&&m.template!=="image-only")&&S.push([m.media,m.template==="split"?.46:1]),Promise.all(S.map(([k,Z])=>{let C=G(ve(k)?k.poster:k.asset);if(!C)return null;let L=document.createElement("img"),U=!ve(k)&&et(k,C,I(k.width,1,8192));U&&(L.sizes=Qe(h,T,Z),L.srcset=U);let y=`${L.sizes} ${U||C}`;return l.has(y)?null:(l.add(y),L.src=C,L.decode?.().catch(()=>{}))}))}var jt=0,ye=n=>`hp-${n}-${++jt}`;function f(n,o,a){let l=document.createElement(n);return o&&(l.className=o),a!==void 0&&l.append(We(a)),l}var nt=n=>{let o=n.length===4?[...n.slice(1)].map(a=>a+a).join(""):n.slice(1);return[0,2,4].map(a=>Number.parseInt(o.slice(a,a+2),16))},K=n=>{let[o,a,l]=nt(n).map(u=>{let x=u/255;return x<=.04045?x/12.92:((x+.055)/1.055)**2.4});return .2126*o+.7152*a+.0722*l},Ke=(n,o=4.5)=>{let a=K(n)+.05,l=1.05/a;return l>=o?"#fff":a/(K("#111")+.05)>l?"#111":"#fff"};function qt(n,o){let a=(S,k)=>k&&n.style.setProperty(S,k),l=S=>$t.test(S??"")?S:null;a("--hp-accent",l(o.accent)),a("--hp-bg",l(o.background)),a("--hp-text",l(o.text));let u=I(o.radius,0,48);u!==null&&a("--hp-radius",`${u}px`),a("--hp-font",o.font==="site"?n.ownerDocument.defaultView.getComputedStyle(n.parentElement??n.ownerDocument.body).fontFamily:Object.hasOwn(he,o.font)?he[o.font]:null),l(o.accent)&&(a("--hp-on-accent",Ke(o.accent,3)),a("--hp-on-accent-text",Ke(o.accent))),l(o.background)&&K(o.background)<.18&&(a("--hp-field","#fff"),a("--hp-field-text","#111"));let x=P(o.overlay)?o.overlay:{},m=[l(o.text),l(o.background)].filter(Boolean).sort((S,k)=>K(S)-K(k))[0],[v,h,T]=nt(l(x.colour)??m??"#0b0b0f");a("--hp-ov",`rgb(${v} ${h} ${T} / ${I(x.opacity,0,1)??.6})`)}function Dt(n){try{let o=new CSSStyleSheet;o.replaceSync(be),n.adoptedStyleSheets=[o]}catch{let o=document.createElement("style");o.textContent=be,n.append(o)}}function it(n){let{form:o,creative:a,decision:l,access:u,client:x,api:m,counters:v}=n,h=n.preview??null,T=e=>{let t=e.blocks.find(r=>r?.t==="email"||r?.t==="phone");return t?.t==="phone"||!t&&!o.consent_text?o.sms_consent_text:o.consent_text},S=tt(o,a),k=a.theme,Z=F(Be[S]??[],k.position,Be[S]?.[0]),C=document.createElement("hp-onsite");h&&C.setAttribute("preview",""),qt(C,k);let L=C.attachShadow({mode:"open"});Dt(L);let U=S!=="inline"&&!h,y=f(U?"dialog":S==="inline"?"section":"div"),Se=f("div","ov"),E=f("div","w"),W=f("div","m");h&&(W.dataset.hpMedia="");let Ee=()=>{let e=f("form","f");return e.noValidate=!0,e.addEventListener("submit",gt),e.addEventListener("input",()=>{M.textContent&&A.getAttribute("aria-busy")!=="true"&&N(null)}),e},A=Ee(),M=f("p","e");M.id=ye("err"),M.setAttribute("aria-live","assertive");let ie=f("div","hd");ie.setAttribute("aria-hidden","true"),E.append(ie,W,A),y.append(Se,E);let Y=S!=="inline"&&f("button","x");Y&&(Y.type="button",Y.addEventListener("click",()=>j("close")),E.append(Y),Se.addEventListener("click",()=>j("close"))),L.append(y);let i={step:null,mode:S,size:"md",modal:!1,mobile:h?.device==="mobile",answers:{},sent:new Set,receipt:null,claim:n.coupon?{code:n.coupon}:h?{code:"WELCOME15"}:null,claiming:null,touched:!1,toWarm:new Set,warmed:n.warmed??new Set,warming:!1,owed:!1,submitted:!1,pow:null,wheel:null,timers:[],codes:[],videos:[],closed:!1},J=o.locale||document.documentElement.lang,ot=o.questions.some(ge)&&n.loadAnswers().catch(()=>null),$e=new WeakMap,_e=()=>{let e=P(k.button)?k.button:{};y.className=`s ${i.mode}${Z?` p-${Z}`:""} b-${F(["pill","rounded","square"],e.shape,"rounded")}${i.mobile?" mob":""}${h?" pv":""}${e.style==="outline"?" bo":""}${k.caps===!0?" uc":""}`},X=h?null:globalThis.matchMedia?.("(max-width: 639px)"),ze=()=>{i.mobile=X?.matches===!0,ae(),_e()};X&&(i.mobile=X.matches===!0,X.addEventListener?.("change",ze));let Q=(e,t)=>{h||!l.decision_id||!u.analytics()||x.slotEngaged({decision_id:l.decision_id,slot:l.slot,arm:l.arm??null,engagement:e,step:t??i.step?.id??null})},N=(e,t)=>{M.className="e",M.textContent=e??"";for(let s of A.querySelectorAll("[aria-invalid]"))s.removeAttribute("aria-invalid");let r=t?.closest("label,fieldset");r&&A.contains(r)?r.after(M):A.append(M),t&&(t.setAttribute("aria-invalid","true"),t.setAttribute("aria-describedby",M.id),t.focus(),t.scrollIntoView?.({block:"nearest"}))},H=e=>{A.setAttribute("aria-busy",String(e));for(let t of A.querySelectorAll("button"))t.disabled=e},Te=()=>h?Promise.resolve(null):(i.pow??(i.pow=m.challenge().then(e=>e.status===200?Ue(e.body):null).catch(()=>null)),i.pow),oe=()=>{for(let e of i.videos)try{document.hidden||xe()?e.pause():e.play()?.catch?.(()=>{})}catch{}};document.addEventListener("visibilitychange",oe);function Ce(e,t,r,s){let c=G(e.asset);if(!c)return null;let p=typeof e.alt=="string"?e.alt:"",d;if(ve(e)){d=f("video",t),d.muted=d.defaultMuted=d.loop=d.playsInline=!0;let w=G(e.poster);w&&(d.poster=w),p?d.setAttribute("aria-label",p):d.setAttribute("aria-hidden","true"),d.autoplay=!xe()&&!h,d.preload=d.autoplay?"auto":w?"none":"metadata";let _=Nt(e,c);if(_.length>1)for(let z of _){let O=f("source");O.src=z;let q=ke(z);q&&(O.type=q),d.append(O)}else d.src=c;i.videos.push(d)}else{d=f("img",t),d.alt=p,d.decoding="async",d.loading=r?"eager":"lazy",r&&(d.fetchPriority="high");let w=et(e,c,I(e.width,1,8192));w&&(d.sizes=Qe(i.mode,i.size,s),d.srcset=w),d.src=c}let b=I(e.width,1,8192),g=I(e.height,1,8192);return b&&g&&(d.width=b,d.height=g),P(e.focal)&&(d.style.objectPosition=`${I(e.focal.x,0,100)??50}% ${I(e.focal.y,0,100)??50}%`),d}function Le(e,t){let r=f("label","l");r.append(f("span","lt",e.label??(t==="email"?"Email":"Mobile number")));let s=f("input","i");if(s.type=t,s.name=t==="email"?"email":"phone",s.autocomplete=s.inputMode=t,s.required=!0,typeof e.placeholder=="string"&&(s.placeholder=e.placeholder),s.setAttribute("aria-describedby",M.id),s.addEventListener("focus",Te,{once:!0}),t!=="tel")return r.append(s),r;s.id=`${M.id}-p`,r.htmlFor=s.id;let c=fe(f,"Country code","+",Object.entries(ue).map(([d,b])=>[d,`${d} +${b}`]),(e.country||/-(\w\w)$/.exec(J)?.[1]||"").toUpperCase());c.classList.add("cc"),c.name="hp_cc";let p=f("span","ph");return p.append(c,s),r.append(p),r}function rt(e){let t=o.questions.find(b=>b.key===e.question);if(!t||!ge(t)&&!Array.isArray(t.options))return null;let r=f("fieldset");r.dataset.question=t.key,r.append(f("legend","",t.label??""));let s=i.answers[t.key]??[];if(ge(t))return ot.then(b=>{if(!b)return r.append(f("p","sm",$.unavailable));b.answerFields(r,t,f,s[0],J),$e.set(r,()=>b.answerOf(r,t,void 0,J))}),r;let c=t.type==="many",p=F(["list","dropdown"],e.display,"buttons"),d=t.options.filter(b=>P(b)&&typeof b.value=="string");if(p==="dropdown"&&!c)return r.append(fe(f,t.label??t.key,"\u2014",d.map(b=>[b.value,b.label??b.value]),s[0])),r;p!=="buttons"&&(r.className="ls");for(let b of d){let g=f("input");g.value=b.value,g.checked=s.includes(b.value),g.type=c?"checkbox":"radio",g.name=`q_${t.key}`;let w=f("label",p==="buttons"?"ch":"c");w.append(g,f("span","",b.label??b.value)),r.append(w)}return r}function re(){for(let e of i.codes){if(e.replaceChildren(),!i.claim)continue;if(!i.claim.code){e.append(f("p","",i.claim.held?$.claimed:$.code));continue}i.claim.prize?.label&&e.append(f("p","",i.claim.prize.label));let t=f("output");t.textContent=i.claim.code;let r=f("button","btn cp");r.type="button",r.textContent="Copy code",r.addEventListener("click",()=>{navigator.clipboard?.writeText(i.claim.code).then(()=>{r.textContent=$.copied}).catch(()=>{})}),e.append(t,r)}}function st(e){if(i.claim&&!i.claim.code)return null;let t=f("p","tm");t.setAttribute("role","timer");let r=Date.now()+Math.max(0,Number(e.minutes)||0)*6e4,s=()=>{let p=Math.max(0,Math.round((r-Date.now())/1e3));t.textContent=`${String(Math.floor(p/60)).padStart(2,"0")}:${String(p%60).padStart(2,"0")}`,p===0&&clearInterval(c)},c=setInterval(s,1e3);return i.timers.push(c),s(),t}function se(e,t){return e.href=t,e.rel="noopener",e.addEventListener("click",r=>{h?r.preventDefault():Q("click")}),e}function at(e){let t=e.label??"Continue";if(e.action==="link"){let s=B(e.href);return s?se(f("a",`btn${Xe[e.variant]??""}`,t),s):null}let r=f("button",`btn${Xe[e.variant]??""}`,t);return r.type=e.action==="submit"?"submit":"button",r.type==="button"?r.addEventListener("click",()=>te(e)):r.dataset.submit="",r}let Me=(e,t,r)=>(e.classList.add(`x-${F(Tt,t.size,r)}`),Ct.includes(t.align)&&e.classList.add(`a-${t.align}`),e);function Oe(e){let t=Ce(e,"bi",i.step===a.steps[0]);if(!t)return null;t.style.objectFit=e.fit==="contain"?"contain":"cover";let r=I(e.radius,0,48);r!==null&&(t.style.borderRadius=`${r}px`);let s=I(e.max_height,40,800);if(s!==null&&(t.style.maxHeight=`${s}px`),!t.width&&e.fit!=="contain"&&(t.style.aspectRatio="16 / 9"),e.t==="video"||!B(e.href))return t;let c=se(f("a","bl"),B(e.href));return c.append(t),c}function lt(e){let t=I(e.threshold,.01,1e7);if(!t)return null;let r=f("div","pg"),s=f("p"),c=f("div","tr"),p=f("i");c.append(p),c.setAttribute("role","progressbar"),c.setAttribute("aria-valuemin","0"),c.setAttribute("aria-valuemax",String(t)),r.append(s,c);let d=g=>g.toFixed(2);try{let g=new Intl.NumberFormat(J||void 0,{style:"currency",currency:e.currency});d=w=>g.format(w)}catch{}let b=()=>{let g=Math.max(0,Number(n.basket?.())||0),w=t-g;s.textContent=w>0?String(e.text??"").replace("{amount}",d(w)):e.done??"",p.style.transform=`scaleX(${Math.min(1,g/t)})`,c.setAttribute("aria-valuenow",String(Math.min(g,t))),s.id||(s.id=ye("pg")),c.setAttribute("aria-labelledby",s.id)};return b(),i.timers.push(setInterval(b,2e3)),r}let Ie={heading(e){let t=Me(f("h2","",e.text),e,"xl");return t.id=ye("h"),t.tabIndex=-1,y.hasAttribute("aria-labelledby")||(y.setAttribute("aria-labelledby",t.id),i.step===a.steps[0]&&He.includes(i.mode)&&!h&&(t.autofocus=!0)),t},text:e=>Me(f("p","",e.text),e,"md"),email:e=>Le(e,"email"),phone:e=>Le(e,"tel"),consent(e){let t=T(i.step)?.text;if(typeof t!="string")return null;if(e.required!==!0)return f("p","sm",t);let r=f("label","c"),s=f("input");return s.type="checkbox",s.name="hp_consent",s.required=!0,s.setAttribute("aria-describedby",M.id),r.append(s,f("span","",t)),r},question:rt,wheel(){let e=f("div","wh");return n.loadWheel().then(t=>{i.closed||(i.wheel=t.mountWheel(e,o.prizes))}).catch(()=>{}),e},code(){let e=f("div","k");return e.setAttribute("aria-live","polite"),i.codes.push(e),e},button:at,decline(e){let t=f("button","btn no",e.label??"No thanks");return t.type="button",t.addEventListener("click",()=>j("decline")),t},countdown:st,progress:lt,image:Oe,video:Oe,spacer(e){let t=f("div","sp");return t.style.height=`${Ge[e.size]??Ge.md}px`,t.setAttribute("aria-hidden","true"),t},divider:()=>f("hr")};function ct(e,t){W.replaceChildren();let r=e.media,s=!r||t&&e.template!=="image-only";if(i.size=Je(k,e),E.className=`w t-${e.template} z-${i.size}${e.side==="right"?" right":""}${k.text_align==="center"?" ta-center":""}${s?" nm":""}`,E.style.setProperty("--sc",String(e.scrim)),A.className=`f pd-${e.padding}`,W.hidden=s,W.hidden)return;let c=Ce(r,"",i.step===a.steps[0],e.template==="split"?.46:1);if(!c)return;if(c.width?E.style.setProperty("--ar",`${c.width} / ${c.height}`):E.style.removeProperty("--ar"),e.template!=="image-only"){c.tagName==="IMG"&&e.template==="overlay"&&(c.alt=""),W.append(c);return}let p=B(r.href),d=p?se(f("a","io"),p):f("button","io");p||(d.type="button",d.addEventListener("click",()=>te({action:"next"}))),d.append(c),W.append(d)}function dt(e){let t=e.blocks.find(c=>c?.t==="heading"),r=e.blocks.find(c=>c?.t==="button"&&c.action==="next"),s=f("button","tb");return s.textContent=t?f("b","",t.text).textContent:r?.label??"Open",s.type="button",s.addEventListener("click",()=>te(r??{action:"next"})),s}function R(e,t=new Set){let r=a.steps.find(z=>z.id===e);if(!r)return j("done");if(r.kind==="question"&&!h&&!u.analytics()&&!t.has(r.id))return R(V(r,i.answers),t.add(r.id));let s=i.step!==null,c=s&&(L.activeElement||document.activeElement===document.body),p=s&&!h?{mode:i.mode,w:E.offsetWidth,h:E.offsetHeight,top:E.offsetTop}:null;i.step=r,i.touched=!1;for(let z of i.timers.splice(0))clearInterval(z);i.codes=[],i.videos=[],i.wheel=null;let d=S==="teaser"&&r===a.steps[0];if(i.mode=S==="teaser"&&!d?"popup":S,S==="teaser"&&v.tab?.(o.slot,d),Y&&Y.setAttribute("aria-label",d?$.closeOffer:"Close"),_e(),y.removeAttribute("aria-labelledby"),p){let z=Ee();A.replaceWith(z),A=z}let b=Ze(r);ct(b,d);let g=p?.mode==="popup"&&i.mode==="popup";if(ae(),p?.mode===i.mode&&p.h>0&&!g&&(E.style.setProperty("--lw",`${p.w}px`),E.style.setProperty("--lh",`${p.h}px`),E.classList.add("lk")),A.replaceChildren(),d&&b.template!=="image-only")A.append(dt(r));else for(let[z,O]of r.blocks.entries()){let q=P(O)&&Object.hasOwn(Ie,O.t)?Ie[O.t](O):null;q&&(h&&(q.dataset.hpBlock=String(z)),A.append(q))}let w=A.querySelector("[data-submit]"),_=A.querySelector("[name=hp_consent]")?.parentNode;w&&_&&w.before(_),A.hidden=A.childElementCount===0,N(null),re(),y.hasAttribute("aria-labelledby")?y.removeAttribute("aria-label"):y.setAttribute("aria-label",b.media?.alt?.trim?.()||"Sign up"),g&&p.h>0&&pt(p),s&&Pe(),oe(),h||ut(r),c&&A.querySelector("h2")?.focus()}function ae(){E.classList.remove("lk","an"),E.style.removeProperty("--tp")}function pt(e){let t=E.offsetHeight;E.classList.add("an");let r=E.offsetTop,s=Math.max(0,e.top-r);if(s+t>y.clientHeight-2*r)return ae();E.style.setProperty("--tp",`${s}px`)}function ut(e){let t=e.next??{};for(let c of[t.default,...Object.values(P(t.answers)?t.answers:{}),...e.blocks.map(p=>p?.next),...Mt])typeof c=="string"&&i.toWarm.add(c);if(i.warming)return;i.warming=!0;let r=()=>{if(i.warming=!1,!i.closed&&C.isConnected)for(let c of i.toWarm)Ae(o,a,c,i.warmed);i.toWarm.clear()},s=()=>globalThis.requestIdleCallback?requestIdleCallback(r,{timeout:2e3}):setTimeout(r,200);document.readyState==="complete"?s():window.addEventListener("load",s,{once:!0})}function Pe(){if(!U)return;let e=He.includes(i.mode);if(!(y.open&&i.modal===e)){try{y.open&&y.close()}catch{}if(i.modal=e,y.setAttribute("aria-modal",String(e)),e&&typeof y.showModal=="function")y.showModal();else if(typeof y.show=="function"){let t=document.activeElement;y.show(),t&&t!==document.body?t.focus?.({preventScroll:!0}):C.blur()}else y.setAttribute("open","");!e||typeof y.showModal!="function"?y.setAttribute("role","dialog"):y.removeAttribute("role")}}function ft(){for(let e of A.querySelectorAll("fieldset[data-question]")){let t=e.dataset.question,r=$e.get(e)?.()??{};if(r.error)return r;let s=[r.value,...[...e.querySelectorAll("input:checked,select:not([name])")].map(c=>c.value)].filter(Boolean);s.length?i.answers[t]=s:delete i.answers[t]}}function mt(){let e=[];for(let[r,s]of Object.entries(i.answers)){let c=`${r}=${s.join(",")}`;i.sent.has(c)||(i.sent.add(c),e.push({question:r,values:s}))}let t=i.step.id;if(i.signedUp&&e.length)return void m.answers({anonymousId:u.anonymousId(),sessionId:u.sessionId()??void 0,slot:l.slot,arm:l.arm??void 0,decision_id:l.decision_id??void 0,step:t,...i.signedUp,answers:e,context:Ne()});if(u.analytics())for(let r of e)x.preferencesStated({...r,source:"onsite",slot:l.slot,arm:l.arm??null,decision_id:l.decision_id??null,step:t})}let Ne=()=>({page:{url:u.pageUrl()},locale:u.locale()??void 0,consent:u.consent()}),ee=e=>{i.receipt&&!h&&mt(),R(V(i.step,i.answers,e))};async function ht(e){let t=i.step,r=A.querySelector("input[name=email],input[name=phone]");if(!r)return ee(e.next);let s=r.name==="email"?"email":"sms",c=A.querySelector("select[name=hp_cc]")?.value,p=s==="email"?Ye(r.value.trim())?r.value.trim():null:Fe(r.value,c);if(!p)return N(s==="email"?$.email:c?$.phone:$.intl,r);let d=A.querySelector("input[name=hp_consent]");if(d&&!d.checked)return N($.consent,d);N(null),H(!0);let b=await Te();i.pow=null;let g=Object.entries(i.answers).map(([D,de])=>({question:D,values:de})),w=s==="sms"?o.sms_consent_text:o.consent_text,_=await m.capture({anonymousId:u.anonymousId(),sessionId:u.sessionId()??void 0,slot:l.slot,arm:l.arm??void 0,decision_id:l.decision_id??void 0,step:t.id,channel:s,[s==="email"?"email":"phone"]:p,...s==="sms"&&i.signedUp,consent_text:w?{id:w.id,version:w.version}:void 0,...g.length?{answers:g}:{},...b?{altcha:b}:{},context:Ne()}),z=_.body?.status,O=(_.status===202||_.status===200)&&_t.includes(z);if(i.closed&&!O)return;O||H(!1);let q=_.status===400?_.body?.field:null;if(q==="email"||q==="phone")return N($[q],r);if(!O)return N(_.status===429?$.busy:$.failed,r);r.value="";for(let[D,de]of Object.entries(i.answers))i.sent.add(`${D}=${de.join(",")}`);i.receipt=typeof _.body.receipt=="string"?_.body.receipt:null,s==="email"&&(i.signedUp={email:p,email_receipt:i.receipt}),i.submitted=!0,v.submitted(o.slot),Q("submit",t.id),i.owed=s==="email"&&o.prizes.length>0;let ne=i.owed?ce([]):null;ne||n.emit?.("submitted",{coupon:null});let yt=ne&&await Promise.race([ne,new Promise(D=>setTimeout(D,It))]);if(i.closed)return;if(H(!1),yt?.held)return R(le("held"));let vt=z!=="ok"&&a.steps.some(D=>D.id===z);R(vt?z:V(t,i.answers,e.next));let wt=i.step;ne?.then(D=>{D?.held&&!i.closed&&i.step===wt&&!i.touched&&R(le("held"))})}function le(e){if(a.steps.some(r=>r.id===e))return e;let t=e==="fallback"||i.claim?.code?[{t:"heading",text:e==="fallback"?$.thanks:$.yours},{t:"code"}]:[{t:"heading",text:$.held},{t:"text",text:o.code_relayed===!0?$.resent:$.inbox},{t:"button",label:$.shop,action:"close"}];return a.steps.push({id:e,blocks:t}),e}function je(e){i.owed&&(i.owed=!1,n.emit?.("submitted",{coupon:e?{code:e.code??null,prize:e.prize?.key}:null}))}function ce(e=Ot){let t=i.receipt;return i.claiming??(i.claiming=(async()=>{let r;for(let d of[0,...e])if(d&&await new Promise(b=>setTimeout(b,d)),r=await m.claim({slot:l.slot,decision_id:l.decision_id??void 0,receipt:t}),r.status!==503)break;let s=r.body,c=s?.fallback===!0&&!s.code;if(r.status!==200||!(P(s?.prize)||c))return i.claiming=null,!e.length&&r.status===503?ce():(je(null),null);let p=s.held&&!s.code?v.code?.():null;return p&&(s={...s,code:p}),i.claim=s,typeof s.code=="string"&&v.code?.(s.code),je(s),i.closed||re(),s})()),i.claiming}async function bt(e){if(!i.receipt)return N($.spin);H(!0);let t=await ce();if(i.closed)return;if(!t)return H(!1),N($.failed);let r=t.fallback===!0&&!t.code,s=t.held?-1:o.prizes.findIndex(d=>d.key===t.prize?.key&&d.label===t.prize?.label);if(i.wheel&&s>=0&&!r){if(await i.wheel.spinTo(s),i.closed)return;M.className="e won",M.textContent=`${$.won} ${t.prize.label}`,await new Promise(d=>setTimeout(d,Pt))}if(i.closed)return;H(!1);let c=r?"fallback":s<0?"held":null,p=c?le(c):V(i.step,i.answers,e.next);p?R(p):re()}function te(e){if(e.action==="close")return j("close");let t=ft();return h?ee(e.next):t?N(t.error,t.input):e.action==="apply"?(n.emit?.("apply",{coupon:i.claim?.code?{code:i.claim.code}:null}),Q("click"),V(i.step,i.answers,e.next)?ee(e.next):j("done")):e.action==="submit"?ht(e):e.action==="spin"?bt(e):ee(e.next)}function gt(e){if(e.preventDefault(),A.getAttribute("aria-busy")==="true")return;let t=i.step.blocks.find(r=>r?.t==="button"&&r.action==="submit");te(t??{action:"next"})}function qe(){i.closed=!0;for(let t of i.timers.splice(0))clearInterval(t);document.removeEventListener("visibilitychange",oe),X?.removeEventListener?.("change",ze);let e=()=>{try{y.open&&y.close()}catch{}C.remove()};if(!U||xe())return e();y.classList.add("out"),setTimeout(e,Lt)}function j(e){i.closed||h||(!i.submitted&&e!=="done"&&Q("dismiss"),v.closed(o.slot),v.tab?.(o.slot,!1),qe(),n.onClose?.(e))}for(let e of["pointerdown","keydown","input"])y.addEventListener(e,()=>{i.touched=!0});y.addEventListener("cancel",e=>{e.preventDefault(),j("esc")}),y.addEventListener("keydown",e=>{e.key==="Escape"&&!i.modal&&S!=="inline"&&j("esc"),e.key==="Tab"&&i.modal&&xt(e)});function xt(e){let t=[...L.querySelectorAll("input[type=radio]:checked")],r=new Set,s=[...L.querySelectorAll("a[href],button,input,select,textarea")].filter(g=>{if(g.disabled||!g.getClientRects().length)return!1;if(g.type!=="radio")return!0;let w=t.find(_=>_.name===g.name);return(w?g!==w:r.has(g.name))?!1:(r.add(g.name),!0)});if(!s.length)return;let c=e.shiftKey,p=L.activeElement;p?.type==="radio"&&(p=s.find(g=>g.type==="radio"&&g.name===p.name)??p);let d=s.indexOf(p),b=null;if(d<0){let g=w=>p&&p.compareDocumentPosition(w)&4;b=c?s.findLast(w=>!g(w))??s.at(-1):s.find(g)??s[0]}else(c?d===0:d===s.length-1)&&(b=s.at(c?-1:0));b&&(e.preventDefault(),b.focus())}return ie.addEventListener("pointerdown",e=>{if(!i.mobile||i.mode!=="sheet")return;let t=e.clientY,r=0,s=p=>{r=Math.max(0,p.clientY-t),E.style.transform=`translateY(${r}px)`},c=()=>{document.removeEventListener("pointermove",s),document.removeEventListener("pointerup",c),E.style.transform="",r>80&&j("close")};document.addEventListener("pointermove",s),document.addEventListener("pointerup",c)}),R(h?.step&&a.steps.some(e=>e.id===h.step)?h.step:a.steps[0].id),(n.container??document.body).append(C),Pe(),{close:j,root:L,host:C,show:R,step:()=>i.step?.id??null,modal:()=>!i.closed&&i.modal,destroy:()=>!i.closed&&qe()}}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render")]={mountForm:it,warm:Ae};})();
|
package/dist/onsite-wheel.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{function
|
|
1
|
+
(()=>{function S(e,o,t=5){let n=360/o;return t*360+(360-(e+.5)*n)}var w="http://www.w3.org/2000/svg",T=4500,I=.22,L=.95,C=.105,m=.082,O=.62,F=1.15,E="var(--hp-accent,#111)",z="var(--hp-on-accent,#fff)",g="var(--hp-bg,#fff)",M="var(--hp-text,#111)";function l(e,o={}){let t=document.createElementNS(w,e);for(let[n,c]of Object.entries(o))t.setAttribute(n,String(c));return t}function a(e,o,t,n=1){return e.style.fill=o,n<1&&(e.style.fillOpacity=String(n)),t&&(e.style.stroke=t),e}var k=()=>globalThis.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches===!0,$=(e,o=1)=>{let t=(e-90)*Math.PI/180;return`${(o*Math.cos(t)).toFixed(4)} ${(o*Math.sin(t)).toFixed(4)}`};function R(e,o){let t=L-I,n=2*.35*Math.sin(Math.min(Math.PI/o,Math.PI/2)),c=s=>Math.max(m,Math.min(C,n/(s*F))),d=s=>t/(Math.max(1,s.length)*O),r=d(e);if(r>=m)return{lines:[e],size:Math.min(c(1),r)};let y=[...e.matchAll(/ /g)].map(s=>s.index);if(y.length){let s=e.length/2,i=y.reduce((h,p)=>Math.abs(p-s)<Math.abs(h-s)?p:h),u=[e.slice(0,i),e.slice(i+1)],f=Math.min(c(2),...u.map(d));if(f>=m)return{lines:u,size:f}}let x=Math.floor(t/(m*O));return{lines:[`${e.slice(0,x-1).trimEnd()}\u2026`],size:m}}function P(e,o){let t=(Array.isArray(o)?o:[]).map(s=>String(s?.label??s?.key??"")),n=t.length;if(n<2)return null;let c=360/n,d=l("svg",{viewBox:"-1.2 -1.2 2.4 2.4",role:"img","aria-label":`Prize wheel: ${t.join(", ")}`}),r=l("g");r.style.transformBox="fill-box",r.style.transformOrigin="50% 50%";let y=[[1,z],[.14,M],[.72,z]];r.append(a(l("circle",{r:1}),g));let x=[];return t.forEach((s,i)=>{let[u,f]=y[n%2===1&&i===n-1?2:i%2];r.append(a(l("path",{d:`M0 0L${$(i*c)}A1 1 0 ${c>180?1:0} 1 ${$((i+1)*c)}Z`,"stroke-width":.012}),E,g,u));let h=(i+.5)*c-90,p=R(s,n),N=a(l("text",{transform:`rotate(${h}) translate(${(I+L)/2} 0)${h>90&&h<270?" rotate(180)":""}`,"text-anchor":"middle","dominant-baseline":"central","font-size":p.size.toFixed(4),"font-weight":700,"aria-hidden":"true"}),f);p.lines.forEach((b,_)=>{let A=l("tspan",{x:0,y:((_-(p.lines.length-1)/2)*p.size*F).toFixed(4)});A.textContent=b,N.append(A)}),r.append(N);for(let b of[i*c,(i+.5)*c]){let[_,A]=$(b,1.075).split(" ");x.push(a(l("circle",{cx:_,cy:A,r:.024}),g))}}),d.append(a(l("circle",{r:1.13}),M),...x,r,a(l("circle",{r:.17,"stroke-width":.035}),g,M),a(l("circle",{r:.065}),E),a(l("path",{d:"M-0.12 -1.2L0.12 -1.2L0 -0.86Z","stroke-width":.03,"stroke-linejoin":"round"}),E,g)),e.append(d),{spinTo(s){let i=k();return r.style.transition=i?"none":`transform ${T}ms cubic-bezier(.15,.7,.1,1)`,r.style.transform=`rotate(${S(s,t.length,i?0:5)}deg)`,i?Promise.resolve():new Promise(u=>{let f=setTimeout(u,T+200);r.addEventListener("transitionend",()=>{clearTimeout(f),u()},{once:!0})})},remove:()=>d.remove()}}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.wheel")]={mountWheel:P};})();
|
package/dist/onsite.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{function I(e){let s=typeof document>"u"?null:document.currentScript?.src;return s?new URL(e,s).href:null}var D=new Map;function $(e,s){return window[s]?Promise.resolve(window[s]):e?(D.has(s)||D.set(s,new Promise((n,r)=>{let d=document.createElement("script");d.src=e,d.async=!0,d.onload=()=>window[s]?n(window[s]):r(new Error(`${e} did not register`)),d.onerror=()=>r(new Error(`${e} did not load`)),document.head.append(d)}).finally(()=>D.delete(s))),D.get(s)):Promise.reject(new Error("the CDN script\u2019s own URL is unknown"))}var Te=I("onsite-answers.min.js"),J=()=>$(Te,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.answers"));var Ie="/v1/capture/challenge",$e=e=>typeof e=="string"&&/^\/v1\/[\w/-]+$/.test(e)?e:Ie;function Z(e,s={}){let n=s.fetch??globalThis.fetch?.bind(globalThis),r=s.servingHost??e.servingHost,d=s.gatewayHost??e.gatewayHost;async function o(c,{method:p="GET",body:i,consent:l=!1,timeoutMs:a}={}){if(!n)return{status:0,body:null};try{let h=await n(c,{method:p,credentials:"omit",signal:a&&AbortSignal.timeout?.(a),headers:{accept:"application/json",authorization:`Bearer ${e.writeKey}`,...i?{"content-type":"application/json"}:{},...l?e.headers():{}},...i?{body:JSON.stringify(i)}:{}}),g=null;try{g=await h.json()}catch{}return{status:h.status,body:g}}catch{return{status:0,body:null}}}return{decide:(c,p)=>o(`${r}/v1/decisions`,{method:"POST",consent:!0,body:{slots:[p?{key:c,pin:{experiment:p[0],arm:p[1],split:p[2]}}:c],identifier_value:e.anonymousId()??void 0,session_id:e.sessionId()??void 0,...e.preview?{preview:e.preview}:{}}}),challenge:()=>o(`${d}${$e(s.challenge)}`),capture:c=>o(`${d}/v1/capture`,{method:"POST",body:c}),answers:c=>o(`${d}/v1/capture/answers`,{method:"POST",body:c}),claim:c=>o(`${r}/v1/offers/claim`,{method:"POST",consent:!0,body:c,timeoutMs:8e3})}}function Q(e,s){let n={},r=()=>{try{let o=JSON.parse(e().getItem(s));o&&typeof o=="object"&&(n=o)}catch{}return n};return{read:r,write:o=>{let c=r();o(c),n=c;try{e().setItem(s,JSON.stringify(c))}catch{}}}}function ee(e,s=()=>!0){let n=Q(()=>sessionStorage,e),r=Q(()=>localStorage,e),d=()=>s()?r:n,o=()=>{let i=r.read();(i.sub!==void 0||i.k!==void 0)&&r.write(l=>{delete l.sub,delete l.k})},c=()=>s()?[n.read(),r.read()]:(o(),[n.read()]),p=(i,l)=>{var a;return i.f??(i.f={}),(a=i.f)[l]??(a[l]={}),i.f[l]};return{seen(i){let l=r.read().f?.[i]??{};return{session:n.read().f?.[i]?.n??0,lifetime:l.n??0,closedAt:l.c??null,submitted:l.s===1}},subscribed:()=>c().some(i=>i.sub===1),shown(i){n.write(l=>{let a=p(l,i);a.n=(a.n??0)+1}),r.write(l=>{let a=p(l,i);a.n=(a.n??0)+1})},closed(i,l=Date.now()){r.write(a=>{p(a,i).c=l})},tab(i,l){n.write(a=>{let h=p(a,i);l?h.t=1:delete h.t})},tabOut:i=>n.read().f?.[i]?.t===1,pin(i,l){if(l===void 0)return n.read().f?.[i]?.p??null;n.write(a=>{p(a,i).p=l})},coveredAt:()=>n.read().o??null,covered(i=Date.now()){n.write(l=>{l.o=i})},code(i,l=Date.now()){if(i===void 0){let[a]=c().flatMap(h=>h.k?[h.k]:[]).sort((h,g)=>g.at-h.at);return a&&l-a.at<14*864e5?a.c:null}return d().write(a=>{a.k={c:i,at:l}}),i},submitted(i){r.write(l=>{p(l,i).s=1}),d().write(l=>{l.sub=1})}}}var Oe=I("onsite-render.min.js"),te=()=>$(Oe,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render"));var ie=["popup","sheet","bar","teaser","inline","fullscreen"],Ce=["entry","exit","scroll","time","idle","inline","manual"],z=e=>e!=="inline",re=e=>e==="popup"||e==="sheet"||e==="fullscreen",S=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),F=e=>Array.isArray(e)?e.filter(s=>typeof s=="string"):[],ne=e=>Number.isInteger(e)&&e>=0?e:null;function le(e){if(!S(e)||typeof e.slot!="string"||e.slot==="")return null;let s=S(e.trigger)?e.trigger:{};if(!ie.includes(e.format)||!Ce.includes(s.type))return null;let n=S(e.caps)?e.caps:{};return{...e,trigger:s,priority:Number.isFinite(e.priority)?e.priority:0,pages:S(e.pages)?e.pages:{},devices:F(e.devices),audiences:F(e.audiences),caps:{per_session:ne(n.per_session),lifetime:ne(n.lifetime),after_close_days:Number.isFinite(n.after_close_days)?n.after_close_days:null},window:S(e.window)?e.window:{},questions:Array.isArray(e.questions)?e.questions.filter(S):[],prizes:Array.isArray(e.prizes)?e.prizes.filter(S):[]}}var Pe=/^[a-z][a-z0-9_-]{0,31}$/;function ce(e){if(!S(e)||e.v!==1||!Array.isArray(e.steps))return null;let s=e.steps.filter(n=>S(n)&&Pe.test(n.id)&&Array.isArray(n.blocks));return s.length===0?null:{format:ie.includes(e.format)?e.format:null,theme:S(e.theme)?e.theme:{},steps:s}}function se(e,s){let n=String(e).split("*").map(r=>r.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(s)}function Me(e,s){let n=F(e?.include);return(!n.length||n.some(r=>se(r,s)))&&!F(e?.exclude).some(r=>se(r,s))}function ae(e){return e.matchMedia?.("(hover: none) and (pointer: coarse)")?.matches===!0||e.innerWidth<768?"mobile":"desktop"}var oe=e=>typeof e=="string"?Date.parse(e):Number.NaN;function X(e,s){let n=[];Me(e.pages,s.path)||n.push("page not included"),e.devices.length&&!e.devices.includes(s.device)&&n.push(`not on ${s.device}`);let r=oe(e.window.starts_at),d=oe(e.window.ends_at);if((s.now<r||s.now>=d)&&n.push("outside its dates"),e.audiences.length&&(s.personalisation?s.audiences&&!e.audiences.some(p=>s.audiences.includes(p))&&n.push("not in its audiences"):n.push("audiences need personalisation consent")),s.preview)return n;let{seen:o}=s,{caps:c}=e;return o.submitted&&n.push("already submitted"),e.exclude_subscribed===!0&&s.subscribed&&n.push("already subscribed"),c.per_session!==null&&o.session>=c.per_session&&n.push("per_session cap"),c.lifetime!==null&&o.lifetime>=c.lifetime&&n.push("lifetime cap"),c.after_close_days!==null&&o.closedAt&&s.now-o.closedAt<c.after_close_days*864e5&&n.push("closed recently"),n}var ue=(e,s)=>s.priority-e.priority;var Ne=["mousemove","pointerdown","keydown","scroll","touchstart","wheel"];function Re(){let e=[];return{on:(r,d,o,c={passive:!0})=>{r.addEventListener(d,o,c),e.push(()=>r.removeEventListener(d,o,c))},later:(r,d)=>{let o=setTimeout(r,d);e.push(()=>clearTimeout(o))},stop:()=>{for(let r of e.splice(0))r()}}}var de=(e,s)=>{let n=s.documentElement.scrollHeight||0;return n>0?(e.scrollY+e.innerHeight)/n:0},ke=e=>{let s=e.activeElement;return!!(s&&(/^(INPUT|TEXTAREA|SELECT)$/.test(s.tagName)||s.isContentEditable))};function Le({on:e,later:s},n,r,d,o){let c=!1,p=!1,i=null,l=0;s(()=>{c=!0},r.delay_ms??5e3),e(o,"mousemove",a=>{a.clientY>d.innerHeight*.1&&(p=!0),i!==null&&(l=a.clientY-i),i=a.clientY}),e(o,"mouseout",a=>{c&&p&&!a.relatedTarget&&a.clientY<=0&&l<0&&!ke(o)&&n("exit")})}function De({on:e,later:s},n,r,d,o){let c=!1,p=0,i=d.scrollY,l=Date.now(),a=null,h=null;s(()=>{c=!0},r.delay_ms??5e3),e(d,"scroll",()=>{let g=d.scrollY,E=Date.now();if(p=Math.max(p,de(d,o)),g<i){(!a||E-a.t>300)&&(a={y:i,t:l});let y=a.y-g;c&&p>=.3&&y>=120&&y/Math.max(1,E-a.t)>=.5&&n("exit_scroll")}else a=null;i=g,l=E}),e(o,"visibilitychange",()=>{o.visibilityState==="hidden"?h=Date.now():h!==null&&Date.now()-h>=1e4&&n("return"),o.visibilityState!=="hidden"&&(h=null)})}function pe(e,s,{device:n,win:r=window,doc:d=document}){let o=Re(),c=(e.seconds??30)*1e3;if(e.type==="entry"&&o.later(()=>s("entry"),e.delay_ms??0),e.type==="time"&&o.later(()=>s("time"),c),e.type==="exit"&&(n==="mobile"?De:Le)(o,s,e,r,d),e.type==="scroll"){let p=e.depth??.5;o.on(r,"scroll",()=>de(r,d)>=p&&s("scroll"))}if(e.type==="idle"){let p=null,i=()=>{clearTimeout(p),p=setTimeout(()=>s("idle"),c)};i();for(let l of Ne)o.on(l==="scroll"?r:d,l,i);return o.on(d,"visibilitychange",i),()=>{clearTimeout(p),o.stop()}}return o.stop}var Fe=I("onsite-wheel.min.js"),fe=()=>$(Fe,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.wheel"));var he=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite-access"),M=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite"),je=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.pending"),Ue=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.listeners"),we=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.suppressed"),ge={seen:()=>({session:0,lifetime:0,closedAt:null,submitted:!1}),subscribed:()=>!1,shown(){},closed(){},submitted(){},tab(){},tabOut:()=>!1,pin:()=>null,coveredAt:()=>null,covered(){},code:()=>null},We=50,Ye=()=>{try{return new URLSearchParams(location.search).get("hp_debug")==="onsite"}catch{return!1}};function me(e,s={}){if(typeof window>"u"||typeof document>"u")return null;if(window[M])return window[M];let n=typeof e?.[he]=="function"?e[he]():null;if(!n)return console.warn("[hp] onsite: startOnsite needs the client bootstrap or createAnalytics made"),null;let r=s.settings??n.settings??{},d=Z(n,{...s,challenge:r.capture?.challenge}),o=n.preview?ge:ee(n.storageKey,n.personalisation),c=new Map,p=()=>window[we]?.size>0,i=(t,u)=>{for(let f of window[Ue]?.[t]??[])try{f(u)}catch(_){console.warn(`[hp] onsite ${t} listener failed:`,_)}},l=ae(window),a=n.debug||s.debug===!0||Ye(),h=new Map,g=new Map,E=[];for(let t of Array.isArray(r.forms)?r.forms:[]){let u=le(t);u?E.push(u):h.set(String(t?.slot??`form ${h.size+1}`),{slot:String(t?.slot??""),state:"invalid",reasons:["not a form this SDK can show"]})}let y=null,N=[],j=Number.isInteger(r.overlay_gap_minutes)?r.overlay_gap_minutes:0,ye=()=>{let t=o.coveredAt();if(!(j>0)||typeof t!="number")return null;let u=Math.max(0,Math.floor((Date.now()-t)/6e4));return u<j?`a popup showed ${u} min ago; ${j} min between them`:null},O=new Set,R=new Set,w=(t,u,f=[])=>(h.set(t.slot,{slot:t.slot,format:t.format,trigger:t.trigger.type,priority:t.priority,state:u,reasons:f}),a&&console.info(`[hp] onsite ${t.slot}: ${u}${f.length?` (${f.join("; ")})`:""}`),u),be=()=>{try{let t=s.audiences?.();return Array.isArray(t)?t:null}catch{return null}},U=t=>({path:location.pathname,device:l,now:Date.now(),seen:o.seen(t.slot),subscribed:o.subscribed()||s.subscribed?.()===!0,personalisation:n.personalisation(),preview:!!n.preview,audiences:be()}),W=t=>{g.get(t.slot)?.(),g.delete(t.slot)};async function C(t,u,f=!1){if(p())return w(t,"not shown",[`suppressed: ${[...window[we]].join(", ")}`]);let _=X(t,f?{...U(t),seen:ge.seen()}:U(t));if(_.length)return w(t,"not eligible",_);let x=re(t.format)&&!f,k=x&&ye();if(k)return w(t,"not shown",[k]);if(x&&!n.preview&&n.consentAnswered?.()===!1)return R.add(t),w(t,"not shown",["waiting for the consent banner"]);let A=z(t.format);if(A&&y)return w(t,"not shown",[`${y} is showing`]);let v=null;if(!A){try{v=document.querySelector(t.trigger.selector??"")}catch{v=null}if(!v)return w(t,"not shown",["no element matches its selector"])}A&&(y=t.slot),W(t),w(t,"asking for a decision",[u]);let Ae=te().catch(b=>(console.warn("[hp] onsite renderer not loaded:",b?.message??b),null)),T=await d.decide(t.slot,o.pin(t.slot)),m=T.status===200?T.body?.decisions?.find(b=>b?.slot===t.slot):null;m?.experiment&&m.arm&&m.split&&o.pin(t.slot,[m.experiment,m.arm,m.split]);let L=m&&m.holdout!==!0?ce(m.payload):null,G=L?.steps[0].blocks??[],V=m?.offer?.code??(n.preview?"PREVIEW":o.code()),Ee=n.basketValue?.()??null,H=G.some(b=>b?.t==="code")&&!V&&"no code to remind of"||G.some(b=>b?.t==="progress")&&!(Ee>0)&&"the basket is empty";if(H)return A&&(y=null),H==="the basket is empty"&&O.add(t),w(t,"not shown",[H]);if(O.delete(t),!L)return m?.holdout===!0&&n.analytics()&&e.recordExposure(T.body),A&&(y=null),w(t,m?.holdout===!0?"held out":"no decision",[T.status===200?"no creative for this visitor":`decisions answered ${T.status}`]);let q=await Ae;if(!q)return A&&(y=null),w(t,"not shown",["the renderer did not load"]);f||o.shown(t.slot),x&&o.covered();let K=(b,ve={})=>i(b,{slot:t.slot,arm:m.arm??null,format:L.format??t.format,...ve}),xe=q.mountForm({form:t,creative:L,decision:m,access:n,client:e,api:d,counters:o,loadWheel:fe,loadAnswers:J,container:v,coupon:V,basket:()=>n.basketValue?.()??null,emit:K,onClose(b){c.delete(t.slot),y===t.slot&&(y=null),w(t,"closed",[b]),K("closed",{reason:b})}});return c.set(t.slot,xe),n.analytics()&&e.recordExposure(T.body),w(t,"shown",[u]),K("shown"),"shown"}function Y(t,u){if(!z(t.format))return C(t,u);N.push([t,u]),!(N.length>1)&&setTimeout(async()=>{let f=N.sort(([_],[x])=>ue(_,x));N=[];for(let[_,[x,k]]of f.entries()){let A=await C(x,k);if(A==="shown"||A==="held out"){for(let[v]of f.slice(_+1))w(v,"not shown",[`${x.slot} has a higher priority`]);return}}},We)}for(let t of E){if(t.format==="teaser"&&o.tabOut(t.slot)){C(t,"tab kept from an earlier page",!0);continue}let u=X(t,U(t));if(u.length){w(t,"not eligible",u);continue}let f=t.trigger.type;f==="manual"?w(t,"waiting for hp.onsite.open"):f==="inline"||t.format==="inline"?C(t,"inline"):B(t)}function B(t){W(t),g.set(t.slot,pe(t.trigger,u=>{W(t),Y(t,u)},{device:l})),w(t,"armed",[`${t.trigger.type} on ${l}`])}let _e=n.onConsentAnswered?.(()=>{let t=[...R];R.clear();for(let u of t)c.has(u.slot)||(u.trigger.type==="manual"?Y(u,"manual"):B(u))}),Se=n.onBasket?.(()=>{if(!((n.basketValue?.()??0)>0))return;let t=[...O];O.clear();for(let u of t)c.has(u.slot)||Y(u,"the basket changed")}),P=Object.freeze({open(t){let u=E.find(f=>f.slot===t);return u&&!c.has(t)?C(u,"manual").then(f=>f==="shown"):Promise.resolve(c.has(t))},suppress(){for(let[t,u]of c){u.destroy(),c.delete(t),y===t&&(y=null);let f=E.find(_=>_.slot===t);f&&w(f,"closed",["suppressed"])}},debug:()=>[...h.values()].map(t=>({...t,reasons:[...t.reasons]})),stop(){for(let t of g.values())t();g.clear(),Se?.(),_e?.(),O.clear(),R.clear(),window[M]===P&&delete window[M]}});window[M]=P;for(let{slot:t,resolve:u}of window[je]?.splice(0)??[])u(P.open(t));return a&&console.table?.(P.debug()),P}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.module")]={startOnsite:me};})();
|
|
1
|
+
(()=>{function P(e){let s=typeof document>"u"?null:document.currentScript?.src;return s?new URL(e,s).href:null}var Y=new Map;function O(e,s){return window[s]?Promise.resolve(window[s]):e?(Y.has(s)||Y.set(s,new Promise((n,r)=>{let d=document.createElement("script");d.src=e,d.async=!0,d.onload=()=>window[s]?n(window[s]):r(new Error(`${e} did not register`)),d.onerror=()=>r(new Error(`${e} did not load`)),document.head.append(d)}).finally(()=>Y.delete(s))),Y.get(s)):Promise.reject(new Error("the CDN script\u2019s own URL is unknown"))}var Ne=P("onsite-answers.min.js"),se=()=>O(Ne,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.answers"));var ke="/v1/capture/challenge",De=e=>typeof e=="string"&&/^\/v1\/[\w/-]+$/.test(e)?e:ke;function oe(e,s={}){let n=s.fetch??globalThis.fetch?.bind(globalThis),r=s.servingHost??e.servingHost,d=s.gatewayHost??e.gatewayHost;async function o(l,{method:p="GET",body:i,consent:c=!1,timeoutMs:u}={}){if(!n)return{status:0,body:null};try{let w=await n(l,{method:p,credentials:"omit",signal:u&&AbortSignal.timeout?.(u),headers:{accept:"application/json",authorization:`Bearer ${e.writeKey}`,...i?{"content-type":"application/json"}:{},...c?e.headers():{}},...i?{body:JSON.stringify(i)}:{}}),b=null;try{b=await w.json()}catch{}return{status:w.status,body:b}}catch{return{status:0,body:null}}}return{decide:(l,p)=>o(`${r}/v1/decisions`,{method:"POST",consent:!0,body:{slots:[p?{key:l,pin:{experiment:p[0],arm:p[1],split:p[2]}}:l],identifier_value:e.anonymousId()??void 0,session_id:e.sessionId()??void 0,...e.preview?{preview:e.preview}:{}}}),challenge:()=>o(`${d}${De(s.challenge)}`),capture:l=>o(`${d}/v1/capture`,{method:"POST",body:l}),answers:l=>o(`${d}/v1/capture/answers`,{method:"POST",body:l}),claim:l=>o(`${r}/v1/offers/claim`,{method:"POST",consent:!0,body:l,timeoutMs:8e3})}}function ie(e,s){let n={},r=()=>{try{let o=JSON.parse(e().getItem(s));o&&typeof o=="object"&&(n=o)}catch{}return n};return{read:r,write:o=>{let l=r();o(l),n=l;try{e().setItem(s,JSON.stringify(l))}catch{}}}}function re(e,s=()=>!0){let n=ie(()=>sessionStorage,e),r=ie(()=>localStorage,e),d=()=>s()?r:n,o=()=>{let i=r.read();(i.sub!==void 0||i.k!==void 0)&&r.write(c=>{delete c.sub,delete c.k})},l=()=>s()?[n.read(),r.read()]:(o(),[n.read()]),p=(i,c)=>{var u;return i.f??(i.f={}),(u=i.f)[c]??(u[c]={}),i.f[c]};return{seen(i){let c=r.read().f?.[i]??{};return{session:n.read().f?.[i]?.n??0,lifetime:c.n??0,closedAt:c.c??null,submitted:c.s===1}},subscribed:()=>l().some(i=>i.sub===1),shown(i){n.write(c=>{let u=p(c,i);u.n=(u.n??0)+1}),r.write(c=>{let u=p(c,i);u.n=(u.n??0)+1})},closed(i,c=Date.now()){r.write(u=>{p(u,i).c=c})},tab(i,c){n.write(u=>{let w=p(u,i);c?w.t=1:delete w.t})},tabOut:i=>n.read().f?.[i]?.t===1,pin(i,c){if(c===void 0)return n.read().f?.[i]?.p??null;n.write(u=>{p(u,i).p=c})},coveredAt:()=>n.read().o??null,covered(i=Date.now()){n.write(c=>{c.o=i})},code(i,c=Date.now()){if(i===void 0){let[u]=l().flatMap(w=>w.k?[w.k]:[]).sort((w,b)=>b.at-w.at);return u&&c-u.at<14*864e5?u.c:null}return d().write(u=>{u.k={c:i,at:c}}),i},submitted(i){r.write(c=>{p(c,i).s=1}),d().write(c=>{c.sub=1})}}}var Le=P("onsite-render.min.js"),le=()=>O(Le,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render"));var de=["popup","sheet","bar","teaser","inline","fullscreen"],Fe=["entry","exit","scroll","time","idle","inline","manual"],q=e=>e!=="inline",pe=e=>e==="popup"||e==="sheet"||e==="fullscreen",S=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),D=e=>Array.isArray(e)?e.filter(s=>typeof s=="string"):[],ce=e=>Number.isInteger(e)&&e>=0?e:null;function fe(e){if(!S(e)||typeof e.slot!="string"||e.slot==="")return null;let s=S(e.trigger)?e.trigger:{};if(!de.includes(e.format)||!Fe.includes(s.type))return null;let n=S(e.caps)?e.caps:{};return{...e,trigger:s,priority:Number.isFinite(e.priority)?e.priority:0,pages:S(e.pages)?e.pages:{},devices:D(e.devices),aliases:D(e.aliases),audiences:D(e.audiences),caps:{per_session:ce(n.per_session),lifetime:ce(n.lifetime),after_close_days:Number.isFinite(n.after_close_days)?n.after_close_days:null},window:S(e.window)?e.window:{},questions:Array.isArray(e.questions)?e.questions.filter(S):[],prizes:Array.isArray(e.prizes)?e.prizes.filter(S):[]}}var We=/^[a-z][a-z0-9_-]{0,31}$/;function he(e){if(!S(e)||e.v!==1||!Array.isArray(e.steps))return null;let s=e.steps.filter(n=>S(n)&&We.test(n.id)&&Array.isArray(n.blocks));return s.length===0?null:{format:de.includes(e.format)?e.format:null,theme:S(e.theme)?e.theme:{},steps:s}}function ae(e,s){let n=String(e).split("*").map(r=>r.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(s)}function je(e,s){let n=D(e?.include);return(!n.length||n.some(r=>ae(r,s)))&&!D(e?.exclude).some(r=>ae(r,s))}function we(e){return e.matchMedia?.("(hover: none) and (pointer: coarse)")?.matches===!0||e.innerWidth<768?"mobile":"desktop"}var ue=e=>typeof e=="string"?Date.parse(e):Number.NaN,L=e=>e.trigger.type==="manual";function J(e,s){let n=[];je(e.pages,s.path)||n.push("page not included"),e.devices.length&&!e.devices.includes(s.device)&&n.push(`not on ${s.device}`);let r=ue(e.window.starts_at),d=ue(e.window.ends_at);if((s.now<r||s.now>=d)&&n.push("outside its dates"),e.audiences.length&&(s.personalisation?s.audiences&&!e.audiences.some(p=>s.audiences.includes(p))&&n.push("not in its audiences"):n.push("audiences need personalisation consent")),s.preview||s.asked||L(e))return n;let{seen:o}=s,{caps:l}=e;return o.submitted&&n.push("already submitted"),e.exclude_subscribed===!0&&s.subscribed&&n.push("already subscribed"),l.per_session!==null&&o.session>=l.per_session&&n.push("per_session cap"),l.lifetime!==null&&o.lifetime>=l.lifetime&&n.push("lifetime cap"),l.after_close_days!==null&&o.closedAt&&s.now-o.closedAt<l.after_close_days*864e5&&n.push("closed recently"),n}var ge=(e,s)=>s.priority-e.priority;var Ue=["mousemove","pointerdown","keydown","scroll","touchstart","wheel"];function Ke(){let e=[];return{on:(r,d,o,l={passive:!0})=>{r.addEventListener(d,o,l),e.push(()=>r.removeEventListener(d,o,l))},later:(r,d)=>{let o=setTimeout(r,d);e.push(()=>clearTimeout(o))},stop:()=>{for(let r of e.splice(0))r()}}}var ye=(e,s)=>{let n=s.documentElement.scrollHeight||0;return n>0?(e.scrollY+e.innerHeight)/n:0},Ye=e=>{let s=e.activeElement;return!!(s&&(/^(INPUT|TEXTAREA|SELECT)$/.test(s.tagName)||s.isContentEditable))};function He({on:e,later:s},n,r,d,o){let l=!1,p=!1,i=null,c=0;s(()=>{l=!0},r.delay_ms??5e3),e(o,"mousemove",u=>{u.clientY>d.innerHeight*.1&&(p=!0),i!==null&&(c=u.clientY-i),i=u.clientY}),e(o,"mouseout",u=>{l&&p&&!u.relatedTarget&&u.clientY<=0&&c<0&&!Ye(o)&&n("exit")})}function ze({on:e,later:s},n,r,d,o){let l=!1,p=0,i=d.scrollY,c=Date.now(),u=null,w=null;s(()=>{l=!0},r.delay_ms??5e3),e(d,"scroll",()=>{let b=d.scrollY,A=Date.now();if(p=Math.max(p,ye(d,o)),b<i){(!u||A-u.t>300)&&(u={y:i,t:c});let _=u.y-b;l&&p>=.3&&_>=120&&_/Math.max(1,A-u.t)>=.5&&n("exit_scroll")}else u=null;i=b,c=A}),e(o,"visibilitychange",()=>{o.visibilityState==="hidden"?w=Date.now():w!==null&&Date.now()-w>=1e4&&n("return"),o.visibilityState!=="hidden"&&(w=null)})}function me(e,s,{device:n,win:r=window,doc:d=document}){let o=Ke(),l=(e.seconds??30)*1e3;if(e.type==="entry"&&o.later(()=>s("entry"),e.delay_ms??0),e.type==="time"&&o.later(()=>s("time"),l),e.type==="exit"&&(n==="mobile"?ze:He)(o,s,e,r,d),e.type==="scroll"){let p=e.depth??.5;o.on(r,"scroll",()=>ye(r,d)>=p&&s("scroll"))}if(e.type==="idle"){let p=null,i=()=>{clearTimeout(p),p=setTimeout(()=>s("idle"),l)};i();for(let c of Ue)o.on(c==="scroll"?r:d,c,i);return o.on(d,"visibilitychange",i),()=>{clearTimeout(p),o.stop()}}return o.stop}var Xe=P("onsite-wheel.min.js"),be=()=>O(Xe,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.wheel"));var _e=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite-access"),F=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite"),Be=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.pending"),Ge=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.listeners"),Se=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.suppressed"),Ae={seen:()=>({session:0,lifetime:0,closedAt:null,submitted:!1}),subscribed:()=>!1,shown(){},closed(){},submitted(){},tab(){},tabOut:()=>!1,pin:()=>null,coveredAt:()=>null,covered(){},code:()=>null},Ve=50,qe=300,Je=()=>{try{return new URLSearchParams(location.search).get("hp_debug")==="onsite"}catch{return!1}};function Ee(e,s={}){if(typeof window>"u"||typeof document>"u")return null;if(window[F])return window[F];let n=typeof e?.[_e]=="function"?e[_e]():null;if(!n)return console.warn("[hp] onsite: startOnsite needs the client bootstrap or createAnalytics made"),null;let r=s.settings??n.settings??{},d=oe(n,{...s,challenge:r.capture?.challenge}),o=n.preview?Ae:re(n.storageKey,n.personalisation),l=new Map,p=()=>window[Se]?.size>0,i=(t,a)=>{for(let f of window[Ge]?.[t]??[])try{f(a)}catch(h){console.warn(`[hp] onsite ${t} listener failed:`,h)}},c=we(window),u=n.debug||s.debug===!0||Je(),w=new Map,b=new Map,A=[];for(let t of Array.isArray(r.forms)?r.forms:[]){let a=fe(t);a?A.push(a):w.set(String(t?.slot??`form ${w.size+1}`),{slot:String(t?.slot??""),state:"invalid",reasons:["not a form this SDK can show"]})}let _=new Map,W=new Map,x=null,Z=new Set,ve=t=>{for(let a of _.keys()){let f=l.get(a);if(!t||!f||f.modal?.())return a}return null},j=[],H=Number.isInteger(r.overlay_gap_minutes)?r.overlay_gap_minutes:0,xe=()=>{let t=o.coveredAt();if(!(H>0)||typeof t!="number")return null;let a=Math.max(0,Math.floor((Date.now()-t)/6e4));return a<H?`a popup showed ${a} min ago; ${H} min between them`:null},C=new Set,U=new Map,g=(t,a,f=[])=>(w.set(t.slot,{slot:t.slot,format:t.format,trigger:t.trigger.type,priority:t.priority,state:a,reasons:f}),u&&console.info(`[hp] onsite ${t.slot}: ${a}${f.length?` (${f.join("; ")})`:""}`),a),Te=()=>{try{let t=s.audiences?.();return Array.isArray(t)?t:null}catch{return null}},Q=t=>({path:location.pathname,device:c,now:Date.now(),seen:o.seen(t.slot),subscribed:o.subscribed()||s.subscribed?.()===!0,personalisation:n.personalisation(),preview:!!n.preview,audiences:Te()}),z=t=>{b.get(t.slot)?.(),b.delete(t.slot)};function R(t,a,f=!1,h=L(t)){return l.has(t.slot)?Promise.resolve("shown"):(W.has(t.slot)||W.set(t.slot,Ie(t,a,f,h).finally(()=>W.delete(t.slot))),W.get(t.slot))}async function Ie(t,a,f,h){if(p())return g(t,"not shown",[`suppressed: ${[...window[Se]].join(", ")}`]);let T=J(t,{...Q(t),...f?{seen:Ae.seen()}:{},asked:h});if(T.length)return g(t,"not eligible",T);let E=pe(t.format)&&!f,K=E&&!h&&xe();if(K)return g(t,"not shown",[K]);if(E&&!n.preview&&n.consentAnswered?.()===!1)return U.set(t,h),g(t,"not shown",["waiting for the consent banner"]);let v=q(t.format),k=v&&ve(h);if(k)return g(t,"not shown",[`${k} is showing`]);if(v&&x&&!h)return g(t,"not shown",[`${x} already showed on this page view`]);let I=null;if(!v){try{I=document.querySelector(t.trigger.selector??"")}catch{I=null}if(!I)return g(t,"not shown",["no element matches its selector"])}v&&_.set(t.slot,t),z(t),g(t,"asking for a decision",[a]);let Pe=le().catch(m=>(console.warn("[hp] onsite renderer not loaded:",m?.message??m),null)),$=await d.decide(t.slot,o.pin(t.slot)),y=$.status===200?$.body?.decisions?.find(m=>m?.slot===t.slot):null;y?.experiment&&y.arm&&y.split&&o.pin(t.slot,[y.experiment,y.arm,y.split]);let M=y&&y.holdout!==!0?he(y.payload):null,te=M?.steps[0].blocks??[],ne=y?.offer?.code??(n.preview?"PREVIEW":o.code()),Oe=n.basketValue?.()??null,B=te.some(m=>m?.t==="code")&&!ne&&"no code to remind of"||te.some(m=>m?.t==="progress")&&!(Oe>0)&&"the basket is empty";if(B)return _.delete(t.slot),B==="the basket is empty"&&C.add(t),g(t,"not shown",[B]);if(C.delete(t),!M)return y?.holdout===!0&&n.analytics()&&e.recordExposure($.body),_.delete(t.slot),v&&y?.holdout===!0&&(x??(x=t.slot)),y?.holdout===!0&&!h&&i("held",{slot:t.slot,arm:y.arm??null,format:t.format}),g(t,y?.holdout===!0?"held out":"no decision",[$.status===200?"no creative for this visitor":`decisions answered ${$.status}`]);let G=await Pe;if(!G)return _.delete(t.slot),g(t,"not shown",["the renderer did not load"]);if(await Promise.race([G.warm?.(t,M,M.steps[0].id,Z),new Promise(m=>setTimeout(m,qe))]),p())return _.delete(t.slot),g(t,"not shown",["suppressed"]);f||o.shown(t.slot),E&&o.covered(),v&&(x??(x=t.slot));let V=(m,Re={})=>i(m,{slot:t.slot,arm:y.arm??null,format:M.format??t.format,...Re}),Ce=G.mountForm({form:t,creative:M,decision:y,access:n,client:e,api:d,counters:o,loadWheel:be,loadAnswers:se,container:I,warmed:Z,coupon:ne,basket:()=>n.basketValue?.()??null,emit:V,onClose(m){l.delete(t.slot),_.delete(t.slot),g(t,"closed",[m]),V("closed",{reason:m})}});return l.set(t.slot,Ce),n.analytics()&&e.recordExposure($.body),g(t,"shown",[a]),V("shown"),"shown"}function X(t,a,f=L(t)){if(!q(t.format))return R(t,a,!1,f);j.push([t,a,f]),!(j.length>1)&&setTimeout(async()=>{let h=j.sort(([T],[E])=>ge(T,E));j=[];for(let[T,[E,K,v]]of h.entries()){let k=await R(E,K,!1,v);if(k==="shown"||k==="held out"){for(let[I]of h.slice(T+1))g(I,"not shown",[`${E.slot} has a higher priority`]);return}}},Ve)}for(let t of A){if(t.format==="teaser"&&o.tabOut(t.slot)){R(t,"tab kept from an earlier page",!0);continue}let a=J(t,Q(t));if(a.length){g(t,"not eligible",a);continue}let f=t.trigger.type;f==="manual"?g(t,"waiting for hp.onsite.open"):f==="inline"||t.format==="inline"?R(t,"inline"):ee(t)}function ee(t){z(t),b.set(t.slot,me(t.trigger,a=>{z(t),X(t,a)},{device:c})),g(t,"armed",[`${t.trigger.type} on ${c}`])}let $e=n.onConsentAnswered?.(()=>{let t=[...U];U.clear();for(let[a,f]of t)l.has(a.slot)||(f?X(a,"manual",f):ee(a))}),Me=n.onBasket?.(()=>{if(!((n.basketValue?.()??0)>0))return;let t=[...C];C.clear();for(let a of t)l.has(a.slot)||X(a,"the basket changed")}),N=Object.freeze({open(t){let a=A.find(h=>h.slot===t),f=a??A.find(h=>h.aliases.includes(t));return f?l.has(f.slot)?Promise.resolve(!0):R(f,"manual",!1,L(f)||!a).then(h=>h==="shown"):Promise.resolve(!1)},suppress(){for(let[t,a]of l){a.destroy(),l.delete(t),_.delete(t);let f=A.find(h=>h.slot===t);f&&g(f,"closed",["suppressed"])}},debug:()=>[...w.values()].map(t=>({...t,reasons:[...t.reasons]})),stop(){for(let t of b.values())t();b.clear(),Me?.(),$e?.(),C.clear(),U.clear(),window[F]===N&&delete window[F]}});window[F]=N;for(let{slot:t,resolve:a}of window[Be]?.splice(0)??[])a(N.open(t));return u&&console.table?.(N.debug()),N}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.module")]={startOnsite:Ee};})();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thg-agentic/hyper-personalisation-web",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.24.0",
|
|
4
4
|
"description": "Browser SDK for the THG Hyper-Personalisation event specification: event tracking from a write key and remote settings, strict CMP-agnostic consent, a GA4 dataLayer bridge and in-session audience evaluation. Dependency-free ESM on the Segment wire protocol, a CDN script (dist/hp.min.js), and an optional @segment/analytics-next plugin path.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/index.js",
|
package/src/ga4.js
CHANGED
|
@@ -38,10 +38,9 @@ const text = (v) => {
|
|
|
38
38
|
return trimmed === '' ? null : trimmed;
|
|
39
39
|
};
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
*/
|
|
41
|
+
// GA4's parent id is `item_group_id` (the Merchant Center attribute GA4 items accept); `item_id`
|
|
42
|
+
// is the purchasable variant. The spec's product_id is the parent, so they cross over.
|
|
43
|
+
|
|
45
44
|
/**
|
|
46
45
|
* The first usable id among candidates: a platform that sends `item_group_id: ''` has sent no
|
|
47
46
|
* parent, and letting the blank win would drop the product rather than fall back to the item.
|
package/src/index.js
CHANGED
|
@@ -717,15 +717,15 @@ export function createAnalytics(options) {
|
|
|
717
717
|
gate.start();
|
|
718
718
|
}
|
|
719
719
|
|
|
720
|
+
/** The property's holdout split from the settings, as a serving response would state it. */
|
|
721
|
+
const configuredShares = () =>
|
|
722
|
+
cfg.holdout ? holdoutShares(cfg.holdout) : null;
|
|
723
|
+
|
|
720
724
|
/**
|
|
721
725
|
* This shopper's group, as the edge and the public API decide it: `holdout` and `excluded` (outside
|
|
722
726
|
* the property's ramp) both get the default everywhere, so personalise in the page only for
|
|
723
727
|
* `personalised`.
|
|
724
728
|
*/
|
|
725
|
-
/** The property's holdout split from the settings, as a serving response would state it. */
|
|
726
|
-
const configuredShares = () =>
|
|
727
|
-
cfg.holdout ? holdoutShares(cfg.holdout) : null;
|
|
728
|
-
|
|
729
729
|
const personalisationGroup = () =>
|
|
730
730
|
holdoutAssignment(cfg.holdout, realId(perRequest(cfg.getAnonymousId, null)))
|
|
731
731
|
.group;
|