@thg-agentic/hyper-personalisation-web 3.27.0 → 3.28.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.
@@ -1,4 +1,4 @@
1
- (()=>{async function Re(i,o,a){let l=m=>Array.from(new Uint8Array(m),v=>v.toString(16).padStart(2,"0")).join(""),f=new TextEncoder,x=i.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",f.encode(i.salt+T)));let h=(await Promise.all(v)).findIndex(T=>l(T)===i.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(i=>setTimeout(i,0)),De=(i,o)=>Re(i,kt,o);function At(i,o){let a=`onmessage=async(e)=>postMessage(await(${Re})(e.data))`,l=URL.createObjectURL(new Blob([a],{type:"text/javascript"}));return new Promise((f,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(f,null),{once:!0}),m.onmessage=h=>v(f,h.data),m.onerror=h=>{h.preventDefault?.(),v(x,h)},m.postMessage({challenge:i.challenge,salt:i.salt,maxnumber:i.maxnumber})})}var St=i=>i&&i.algorithm==="SHA-256"&&typeof i.challenge=="string"&&typeof i.salt=="string"&&typeof i.signature=="string";async function Ue(i){if(!St(i)||typeof crypto?.subtle?.digest!="function")return null;let o=Date.now(),a=new AbortController,l,f=new Promise(v=>{l=setTimeout(()=>v(null),2e4)}),x=typeof Worker=="function"&&typeof Blob=="function"?At(i,a.signal).catch(()=>De(i,a.signal)):De(i,a.signal),m=await Promise.race([x,f]);return clearTimeout(l),a.abort(),typeof m!="number"?null:btoa(JSON.stringify({algorithm:i.algorithm,challenge:i.challenge,number:m,salt:i.salt,signature:i.signature,took:Date.now()-o}))}function B(i){if(typeof i!="string")return null;try{let o=new URL(i);return o.protocol==="https:"?o.href:null}catch{return null}}function G(i){if(typeof i!="string")return null;try{let o=new URL(i);return o.protocol==="https:"||o.protocol==="http:"&&o.hostname==="localhost"?o.href:null}catch{return null}}function pe(i,o,a,l){if(typeof o=="string"){i.append(a.createTextNode(o));return}if(l>6||o===null)return;if(Array.isArray(o)){for(let v of o)pe(i,v,a,l+1);return}if(typeof o!="object")return;let f="b"in o?"b":"i"in o?"i":"a"in o?"a":null;if(!f)return;let x=f==="a"?B(o.href):null,m=f==="a"&&!x?i:a.createElement(f);x&&(m.setAttribute("href",x),m.setAttribute("rel","noopener")),pe(m,o[f],a,l+1),m!==i&&i.append(m)}function We(i,o=document){let a=o.createDocumentFragment();return pe(a,i,o,0),a}var Et=i=>i!==null&&typeof i=="object"&&!Array.isArray(i);function V(i,o,a){if(typeof a=="string"&&a)return a;let l=Et(i?.next?.answers)?i.next.answers:{};for(let[f,x]of Object.entries(l)){let m=f.indexOf("="),v=o[f.slice(0,m)];if(m>0&&v?.includes(f.slice(m+1)))return x}return typeof i?.next?.default=="string"?i.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(i,o){let a=String(i??"").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=i=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(i);function fe(i,o,a,l,f){let x=i("select","i");x.setAttribute("aria-label",o);for(let[m,v]of[["",a],...l]){let h=i("option","",v);h.value=m,h.selected=m===f,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=`
1
+ (()=>{async function Re(i,o,a){let l=h=>Array.from(new Uint8Array(h),v=>v.toString(16).padStart(2,"0")).join(""),u=new TextEncoder,x=i.maxnumber??1e6;for(let h=0;h<=x;h+=256){let v=[];for(let T=h;T<h+256&&T<=x;T++)v.push(crypto.subtle.digest("SHA-256",u.encode(i.salt+T)));let m=(await Promise.all(v)).findIndex(T=>l(T)===i.challenge);if(m>=0)return h+m;if(o&&await o(),a?.aborted)return null}return null}var St=()=>globalThis.scheduler?.postTask?.(()=>{},{priority:"user-visible"})??new Promise(i=>setTimeout(i,0)),De=(i,o)=>Re(i,St,o);function Et(i,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 h;try{h=new Worker(l)}catch(m){URL.revokeObjectURL(l),x(m);return}let v=(m,T)=>{h.terminate(),URL.revokeObjectURL(l),m(T)};o.addEventListener("abort",()=>v(u,null),{once:!0}),h.onmessage=m=>v(u,m.data),h.onerror=m=>{m.preventDefault?.(),v(x,m)},h.postMessage({challenge:i.challenge,salt:i.salt,maxnumber:i.maxnumber})})}var _t=i=>i&&i.algorithm==="SHA-256"&&typeof i.challenge=="string"&&typeof i.salt=="string"&&typeof i.signature=="string";async function Ue(i){if(!_t(i)||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"?Et(i,a.signal).catch(()=>De(i,a.signal)):De(i,a.signal),h=await Promise.race([x,u]);return clearTimeout(l),a.abort(),typeof h!="number"?null:btoa(JSON.stringify({algorithm:i.algorithm,challenge:i.challenge,number:h,salt:i.salt,signature:i.signature,took:Date.now()-o}))}function B(i){if(typeof i!="string")return null;try{let o=new URL(i);return o.protocol==="https:"?o.href:null}catch{return null}}function G(i){if(typeof i!="string")return null;try{let o=new URL(i);return o.protocol==="https:"||o.protocol==="http:"&&o.hostname==="localhost"?o.href:null}catch{return null}}function pe(i,o,a,l){if(typeof o=="string"){i.append(a.createTextNode(o));return}if(l>6||o===null)return;if(Array.isArray(o)){for(let v of o)pe(i,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,h=u==="a"&&!x?i:a.createElement(u);x&&(h.setAttribute("href",x),h.setAttribute("rel","noopener")),pe(h,o[u],a,l+1),h!==i&&i.append(h)}function We(i,o=document){let a=o.createDocumentFragment();return pe(a,i,o,0),a}var $t=i=>i!==null&&typeof i=="object"&&!Array.isArray(i);function V(i,o,a){if(typeof a=="string"&&a)return a;let l=$t(i?.next?.answers)?i.next.answers:{};for(let[u,x]of Object.entries(l)){let h=u.indexOf("="),v=o[u.slice(0,h)];if(h>0&&v?.includes(u.slice(h+1)))return x}return typeof i?.next?.default=="string"?i.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(i,o){let a=String(i??"").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=i=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(i);function fe(i,o,a,l,u){let x=i("select","i");x.setAttribute("aria-label",o);for(let[h,v]of[["",a],...l]){let m=i("option","",v);m.value=h,m.selected=h===u,x.append(m)}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}
@@ -179,4 +179,4 @@ hr{width:100%;margin:4px 0;border:0;border-top:1px solid var(--ln)}
179
179
  @keyframes hp-down{from{transform:translateY(-100%)}}
180
180
  @keyframes hp-out{to{opacity:0;transform:translateY(12px) scale(.98)}}
181
181
  @media (prefers-reduced-motion:reduce){.s .w,.s .ov,.f>*{animation:hp-fade .15s ease both!important}.btn{transition:none}}
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,A={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",retry:"You\u2019re signed up, but we couldn\u2019t load your prize. Please try again.",unclaimed:"We couldn\u2019t load your prize right now.",unavailable:"Not available right now.",won:"You won"},P=i=>i!==null&&typeof i=="object"&&!Array.isArray(i),F=(i,o,a)=>i.includes(o)?o:a,I=(i,o,a)=>Number.isFinite(i)?Math.min(Math.max(i,o),a):null,ge=i=>i.type==="date"||i.type==="number",xe=()=>globalThis.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches===!0;function Ze(i){let o=P(i.layout)?i.layout:{},a=P(o.media)?o.media:null,l=F(zt,o.template,"stack"),f=a?.side==="right"?"right":"left";return!a&&P(o.image)&&o.image.side!=="none"&&(a=o.image,o.image.side!=="top"&&(l="split",f=o.image.side==="right"?"right":"left")),(!a||!G(a.asset))&&(a=null,l="stack"),{template:l,media:a,side:f,scrim:I(o.scrim,0,.9)??.45,padding:F(["none","sm","md","lg"],o.padding,"md")}}var Je=(i,o)=>F(["sm","md","lg","full"],i.size,null)??(o.template==="split"||o.template==="overlay"?"lg":"md"),Qe=(i,o,a=1)=>{if(i==="fullscreen"||o==="full")return"100vw";let l=i==="teaser"?220:i==="sheet"?400:Ve[o]??Ve.md;return`(max-width: 639px) 100vw, ${Math.round(l*a)}px`},et=(i,o,a)=>{if(!a||!Array.isArray(i.widths)||!o.endsWith(".webp"))return null;let l=i.widths.filter(f=>Number.isInteger(f)&&f>0&&f<a).sort((f,x)=>f-x);return l.length===0?null:[...l.map(f=>`${o.slice(0,-5)}-${f}w.webp ${f}w`),`${o} ${a}w`].join(",")},tt=(i,o)=>i.format==="inline"?"inline":o.format&&o.format!=="inline"?o.format:i.format,ve=i=>i.kind==="video"||i.t==="video",we={webm:"video/webm",mp4:"video/mp4",m4v:"video/mp4",mov:"video/quicktime",ogv:"video/ogg"},ke=i=>we[i.split(/[?#]/)[0].split(".").pop().toLowerCase()],Nt=(i,o)=>[...new Set([o,...Array.isArray(i.sources)?i.sources.map(G):[]])].filter(Boolean).sort((a,l)=>(ke(l)===we.webm)-(ke(a)===we.webm));function Ae(i,o,a,l=new Set){let f=o.steps.find(k=>k.id===a);if(!f)return Promise.resolve();let x=tt(i,o),m=Ze(f),v=x==="teaser"&&f===o.steps[0],h=x==="teaser"&&!v?"popup":x,T=Je(o.theme,m),E=v?[]:f.blocks.filter(k=>P(k)&&(k.t==="image"||k.t==="video")).map(k=>[k,1]);return m.media&&!(v&&m.template!=="image-only")&&E.push([m.media,m.template==="split"?.46:1]),Promise.all(E.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=i=>`hp-${i}-${++jt}`;function u(i,o,a){let l=document.createElement(i);return o&&(l.className=o),a!==void 0&&l.append(We(a)),l}var nt=i=>{let o=i.length===4?[...i.slice(1)].map(a=>a+a).join(""):i.slice(1);return[0,2,4].map(a=>Number.parseInt(o.slice(a,a+2),16))},K=i=>{let[o,a,l]=nt(i).map(f=>{let x=f/255;return x<=.04045?x/12.92:((x+.055)/1.055)**2.4});return .2126*o+.7152*a+.0722*l},Ke=(i,o=4.5)=>{let a=K(i)+.05,l=1.05/a;return l>=o?"#fff":a/(K("#111")+.05)>l?"#111":"#fff"};function qt(i,o){let a=(E,k)=>k&&i.style.setProperty(E,k),l=E=>_t.test(E??"")?E:null;a("--hp-accent",l(o.accent)),a("--hp-bg",l(o.background)),a("--hp-text",l(o.text));let f=I(o.radius,0,48);f!==null&&a("--hp-radius",`${f}px`),a("--hp-font",o.font==="site"?i.ownerDocument.defaultView.getComputedStyle(i.parentElement??i.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((E,k)=>K(E)-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(i){try{let o=new CSSStyleSheet;o.replaceSync(be),i.adoptedStyleSheets=[o]}catch{let o=document.createElement("style");o.textContent=be,i.append(o)}}function it(i){let{form:o,creative:a,decision:l,access:f,client:x,api:m,counters:v}=i,h=i.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},E=tt(o,a),k=a.theme,Z=F(Be[E]??[],k.position,Be[E]?.[0]),C=document.createElement("hp-onsite");h&&C.setAttribute("preview",""),qt(C,k);let L=C.attachShadow({mode:"open"});Dt(L);let U=E!=="inline"&&!h,y=u(U?"dialog":E==="inline"?"section":"div"),Se=u("div","ov"),_=u("div","w"),W=u("div","m");h&&(W.dataset.hpMedia="");let Ee=()=>{let e=u("form","f");return e.noValidate=!0,e.addEventListener("submit",gt),e.addEventListener("input",()=>{M.textContent&&S.getAttribute("aria-busy")!=="true"&&N(null)}),e},S=Ee(),M=u("p","e");M.id=ye("err"),M.setAttribute("aria-live","assertive");let re=u("div","hd");re.setAttribute("aria-hidden","true"),_.append(re,W,S),y.append(Se,_);let Y=E!=="inline"&&u("button","x");Y&&(Y.type="button",Y.addEventListener("click",()=>j("close")),_.append(Y),Se.addEventListener("click",()=>j("close"))),L.append(y);let n={step:null,mode:E,size:"md",modal:!1,mobile:h?.device==="mobile",answers:{},sent:new Set,receipt:null,claim:i.coupon?{code:i.coupon}:h?{code:"WELCOME15"}:null,claiming:null,touched:!1,toWarm:new Set,warmed:i.warmed??new Set,warming:!1,owed:!1,unclaimed:!1,misses:0,submitted:!1,pow:null,wheel:null,timers:[],codes:[],videos:[],closed:!1},J=o.locale||document.documentElement.lang,ot=o.questions.some(ge)&&i.loadAnswers().catch(()=>null),_e=new WeakMap,$e=()=>{let e=P(k.button)?k.button:{};y.className=`s ${n.mode}${Z?` p-${Z}`:""} b-${F(["pill","rounded","square"],e.shape,"rounded")}${n.mobile?" mob":""}${h?" pv":""}${e.style==="outline"?" bo":""}${k.caps===!0?" uc":""}`},X=h?null:globalThis.matchMedia?.("(max-width: 639px)"),ze=()=>{n.mobile=X?.matches===!0,le(),$e()};X&&(n.mobile=X.matches===!0,X.addEventListener?.("change",ze));let Q=(e,t)=>{h||!l.decision_id||!f.analytics()||x.slotEngaged({decision_id:l.decision_id,slot:l.slot,arm:l.arm??null,engagement:e,step:t??n.step?.id??null})},N=(e,t)=>{M.className="e",M.textContent=e??"";for(let s of S.querySelectorAll("[aria-invalid]"))s.removeAttribute("aria-invalid");let r=t?.closest("label,fieldset");r&&S.contains(r)?r.after(M):S.append(M),t&&(t.setAttribute("aria-invalid","true"),t.setAttribute("aria-describedby",M.id),t.focus(),t.scrollIntoView?.({block:"nearest"}))},H=e=>{S.setAttribute("aria-busy",String(e));for(let t of S.querySelectorAll("button"))t.disabled=e},Te=()=>h?Promise.resolve(null):(n.pow??(n.pow=m.challenge().then(e=>e.status===200?Ue(e.body):null).catch(()=>null)),n.pow),se=()=>{for(let e of n.videos)try{document.hidden||xe()?e.pause():e.play()?.catch?.(()=>{})}catch{}};document.addEventListener("visibilitychange",se);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=u("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=u("source");O.src=z;let q=ke(z);q&&(O.type=q),d.append(O)}else d.src=c;n.videos.push(d)}else{d=u("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(n.mode,n.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=u("label","l");r.append(u("span","lt",e.label??(t==="email"?"Email":"Mobile number")));let s=u("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(u,"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=u("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=u("fieldset");r.dataset.question=t.key,r.append(u("legend","",t.label??""));let s=n.answers[t.key]??[];if(ge(t))return ot.then(b=>{if(!b)return r.append(u("p","sm",A.unavailable));b.answerFields(r,t,u,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(u,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=u("input");g.value=b.value,g.checked=s.includes(b.value),g.type=c?"checkbox":"radio",g.name=`q_${t.key}`;let w=u("label",p==="buttons"?"ch":"c");w.append(g,u("span","",b.label??b.value)),r.append(w)}return r}function ee(){for(let e of n.codes){if(e.replaceChildren(),!n.claim){n.unclaimed&&e.append(u("p","",A.unclaimed));continue}if(!n.claim.code){let s=n.claim.held?A.claimed:n.claim.fallback===!0?A.code:n.claim.prize?.label;s&&e.append(u("p","",s));continue}n.claim.prize?.label&&e.append(u("p","",n.claim.prize.label));let t=u("output");t.textContent=n.claim.code;let r=u("button","btn cp");r.type="button",r.textContent="Copy code",r.addEventListener("click",()=>{navigator.clipboard?.writeText(n.claim.code).then(()=>{r.textContent=A.copied}).catch(()=>{})}),e.append(t,r)}}function st(e){if(n.claim&&!n.claim.code)return null;let t=u("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 n.timers.push(c),s(),t}function ae(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?ae(u("a",`btn${Xe[e.variant]??""}`,t),s):null}let r=u("button",`btn${Xe[e.variant]??""}`,t);return r.type=e.action==="submit"?"submit":"button",r.type==="button"?r.addEventListener("click",()=>ie(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",n.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=ae(u("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=u("div","pg"),s=u("p"),c=u("div","tr"),p=u("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(i.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(),n.timers.push(setInterval(b,2e3)),r}let Ie={heading(e){let t=Me(u("h2","",e.text),e,"xl");return t.id=ye("h"),t.tabIndex=-1,y.hasAttribute("aria-labelledby")||(y.setAttribute("aria-labelledby",t.id),n.step===a.steps[0]&&He.includes(n.mode)&&!h&&(t.autofocus=!0)),t},text:e=>Me(u("p","",e.text),e,"md"),email:e=>Le(e,"email"),phone:e=>Le(e,"tel"),consent(e){let t=T(n.step)?.text;if(typeof t!="string")return null;if(e.required!==!0)return u("p","sm",t);let r=u("label","c"),s=u("input");return s.type="checkbox",s.name="hp_consent",s.required=!0,s.setAttribute("aria-describedby",M.id),r.append(s,u("span","",t)),r},question:rt,wheel(){let e=u("div","wh");return i.loadWheel().then(t=>{n.closed||(n.wheel=t.mountWheel(e,o.prizes))}).catch(()=>{}),e},code(){let e=u("div","k");return e.setAttribute("aria-live","polite"),n.codes.push(e),e},button:at,decline(e){let t=u("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=u("div","sp");return t.style.height=`${Ge[e.size]??Ge.md}px`,t.setAttribute("aria-hidden","true"),t},divider:()=>u("hr")};function ct(e,t){W.replaceChildren();let r=e.media,s=!r||t&&e.template!=="image-only";if(n.size=Je(k,e),_.className=`w t-${e.template} z-${n.size}${e.side==="right"?" right":""}${k.text_align==="center"?" ta-center":""}${s?" nm":""}`,_.style.setProperty("--sc",String(e.scrim)),S.className=`f pd-${e.padding}`,W.hidden=s,W.hidden)return;let c=Ce(r,"",n.step===a.steps[0],e.template==="split"?.46:1);if(!c)return;if(c.width?_.style.setProperty("--ar",`${c.width} / ${c.height}`):_.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?ae(u("a","io"),p):u("button","io");p||(d.type="button",d.addEventListener("click",()=>ie({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=u("button","tb");return s.textContent=t?u("b","",t.text).textContent:r?.label??"Open",s.type="button",s.addEventListener("click",()=>ie(r??{action:"next"})),s}function D(e,t=new Set){let r=a.steps.find(z=>z.id===e);if(!r)return j("done");if(r.kind==="question"&&!h&&!f.analytics()&&!t.has(r.id))return D(V(r,n.answers),t.add(r.id));let s=n.step!==null,c=s&&(L.activeElement||document.activeElement===document.body),p=s&&!h?{mode:n.mode,w:_.offsetWidth,h:_.offsetHeight,top:_.offsetTop}:null;n.step=r,n.touched=!1;for(let z of n.timers.splice(0))clearInterval(z);n.codes=[],n.videos=[],n.wheel=null;let d=E==="teaser"&&r===a.steps[0];if(n.mode=E==="teaser"&&!d?"popup":E,E==="teaser"&&v.tab?.(o.slot,d),Y&&Y.setAttribute("aria-label",d?A.closeOffer:"Close"),$e(),y.removeAttribute("aria-labelledby"),p){let z=Ee();S.replaceWith(z),S=z}let b=Ze(r);ct(b,d);let g=p?.mode==="popup"&&n.mode==="popup";if(le(),p?.mode===n.mode&&p.h>0&&!g&&(_.style.setProperty("--lw",`${p.w}px`),_.style.setProperty("--lh",`${p.h}px`),_.classList.add("lk")),S.replaceChildren(),d&&b.template!=="image-only")S.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)),S.append(q))}let w=S.querySelector("[data-submit]"),$=S.querySelector("[name=hp_consent]")?.parentNode;w&&$&&w.before($),S.hidden=S.childElementCount===0,N(null),ee(),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(),se(),h||ut(r),c&&S.querySelector("h2")?.focus()}function le(){_.classList.remove("lk","an"),_.style.removeProperty("--tp")}function pt(e){let t=_.offsetHeight;_.classList.add("an");let r=_.offsetTop,s=Math.max(0,e.top-r);if(s+t>y.clientHeight-2*r)return le();_.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"&&n.toWarm.add(c);if(n.warming)return;n.warming=!0;let r=()=>{if(n.warming=!1,!n.closed&&C.isConnected)for(let c of n.toWarm)Ae(o,a,c,n.warmed);n.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(n.mode);if(!(y.open&&n.modal===e)){try{y.open&&y.close()}catch{}if(n.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 S.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?n.answers[t]=s:delete n.answers[t]}}function mt(){let e=[];for(let[r,s]of Object.entries(n.answers)){let c=`${r}=${s.join(",")}`;n.sent.has(c)||(n.sent.add(c),e.push({question:r,values:s}))}let t=n.step.id;if(n.signedUp&&e.length)return void m.answers({anonymousId:f.anonymousId(),sessionId:f.sessionId()??void 0,slot:l.slot,arm:l.arm??void 0,decision_id:l.decision_id??void 0,step:t,...n.signedUp,answers:e,context:Ne()});if(f.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:f.pageUrl()},locale:f.locale()??void 0,consent:f.consent()}),te=e=>{n.receipt&&!h&&mt(),D(V(n.step,n.answers,e))};async function ht(e){let t=n.step,r=S.querySelector("input[name=email],input[name=phone]");if(!r)return te(e.next);let s=r.name==="email"?"email":"sms",c=S.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"?A.email:c?A.phone:A.intl,r);let d=S.querySelector("input[name=hp_consent]");if(d&&!d.checked)return N(A.consent,d);N(null),H(!0);let b=await Te();n.pow=null;let g=Object.entries(n.answers).map(([R,de])=>({question:R,values:de})),w=s==="sms"?o.sms_consent_text:o.consent_text,$=await m.capture({anonymousId:f.anonymousId(),sessionId:f.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"&&n.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(n.closed&&!O)return;O||H(!1);let q=$.status===400?$.body?.field:null;if(q==="email"||q==="phone")return N(A[q],r);if(!O)return N($.status===429?A.busy:A.failed,r);r.value="";for(let[R,de]of Object.entries(n.answers))n.sent.add(`${R}=${de.join(",")}`);n.receipt=typeof $.body.receipt=="string"?$.body.receipt:null,s==="email"&&(n.signedUp={email:p,email_receipt:n.receipt}),n.submitted=!0,v.submitted(o.slot),Q("submit",t.id),n.owed=s==="email"&&o.prizes.length>0;let oe=n.owed?ce([]):null;oe||i.emit?.("submitted",{coupon:null});let yt=oe&&await Promise.race([oe,new Promise(R=>setTimeout(R,It))]);if(n.closed)return;if(H(!1),yt?.held)return D(ne("held"));let vt=z!=="ok"&&a.steps.some(R=>R.id===z);D(vt?z:V(t,n.answers,e.next));let wt=n.step;oe?.then(R=>{R?.held&&!n.closed&&n.step===wt&&!n.touched&&D(ne("held"))})}function ne(e){if(a.steps.some(s=>s.id===e))return e;let t={t:"button",label:A.shop,action:"close"},r=e==="unclaimed"?[{t:"heading",text:A.thanks},{t:"text",text:A.unclaimed},t]:e==="fallback"||n.claim?.code?[{t:"heading",text:e==="fallback"?A.thanks:A.yours},{t:"code"}]:[{t:"heading",text:A.held},{t:"text",text:o.code_relayed===!0?A.resent:A.inbox},t];return a.steps.push({id:e,blocks:r}),e}function je(e){n.owed&&(n.owed=!1,i.emit?.("submitted",{coupon:e?{code:e.code??null,prize:e.prize?.key}:null}))}function ce(e=Ot){let t=n.receipt;return n.claiming??(n.claiming=(async()=>{n.unclaimed=!1;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 n.claiming=null,!e.length&&r.status===503?ce():(je(null),n.unclaimed=!0,n.closed||ee(),null);let p=s.held&&!s.code?v.code?.():null;return p&&(s={...s,code:p}),n.claim=s,typeof s.code=="string"&&v.code?.(s.code),je(s),n.closed||ee(),s})()),n.claiming}async function bt(e){if(!n.receipt)return N(A.spin);H(!0);let t=await ce();if(n.closed)return;if(!t)return H(!1),n.misses+=1,n.misses<2?N(A.retry):D(ne("unclaimed"));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(n.wheel&&s>=0&&!r){if(await n.wheel.spinTo(s),n.closed)return;M.className="e won",M.textContent=`${A.won} ${t.prize.label}`,await new Promise(d=>setTimeout(d,Pt))}if(n.closed)return;H(!1);let c=r?"fallback":s<0?"held":null,p=c?ne(c):V(n.step,n.answers,e.next);p?D(p):ee()}function ie(e){if(e.action==="close")return j("close");let t=ft();return h?te(e.next):t?N(t.error,t.input):e.action==="apply"?(i.emit?.("apply",{coupon:n.claim?.code?{code:n.claim.code}:null}),Q("click"),V(n.step,n.answers,e.next)?te(e.next):j("done")):e.action==="submit"?ht(e):e.action==="spin"?bt(e):te(e.next)}function gt(e){if(e.preventDefault(),S.getAttribute("aria-busy")==="true")return;let t=n.step.blocks.find(r=>r?.t==="button"&&r.action==="submit");ie(t??{action:"next"})}function qe(){n.closed=!0;for(let t of n.timers.splice(0))clearInterval(t);document.removeEventListener("visibilitychange",se),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){n.closed||h||(!n.submitted&&e!=="done"&&Q("dismiss"),v.closed(o.slot),v.tab?.(o.slot,!1),qe(),i.onClose?.(e))}for(let e of["pointerdown","keydown","input"])y.addEventListener(e,()=>{n.touched=!0});y.addEventListener("cancel",e=>{e.preventDefault(),j("esc")}),y.addEventListener("keydown",e=>{e.key==="Escape"&&!n.modal&&E!=="inline"&&j("esc"),e.key==="Tab"&&n.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 re.addEventListener("pointerdown",e=>{if(!n.mobile||n.mode!=="sheet")return;let t=e.clientY,r=0,s=p=>{r=Math.max(0,p.clientY-t),_.style.transform=`translateY(${r}px)`},c=()=>{document.removeEventListener("pointermove",s),document.removeEventListener("pointerup",c),_.style.transform="",r>80&&j("close")};document.addEventListener("pointermove",s),document.addEventListener("pointerup",c)}),D(h?.step&&a.steps.some(e=>e.id===h.step)?h.step:a.steps[0].id),(i.container??document.body).append(C),Pe(),{close:j,root:L,host:C,show:D,step:()=>n.step?.id??null,modal:()=>!n.closed&&n.modal,destroy:()=>!n.closed&&qe()}}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render")]={mountForm:it,warm:Ae};})();
182
+ `;var zt=/^#(?:[0-9a-f]{3}){1,2}$/i,He=["popup","fullscreen"],Tt=["ok","verify","already"],Ct=["stack","split","overlay","image-only"],Be={bar:["bottom","top"],sheet:["bottom-right","bottom-left","bottom"],teaser:["bottom-left","bottom-right","left","right"]},Lt=["xs","sm","md","lg","xl","display"],Ge={xs:4,sm:8,md:16,lg:28,xl:44},Ve={sm:380,md:480,lg:880},Mt=["left","center","right"],Xe={secondary:" b2",link:" no"},Ot=220,It=["verify","already","held","fallback","success"],Pt=[500,1500],Nt=600,jt=1800,A={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",retry:"You\u2019re signed up, but we couldn\u2019t load your prize. Please try again.",unclaimed:"We couldn\u2019t load your prize right now.",unavailable:"Not available right now.",won:"You won"},P=i=>i!==null&&typeof i=="object"&&!Array.isArray(i),F=(i,o,a)=>i.includes(o)?o:a,I=(i,o,a)=>Number.isFinite(i)?Math.min(Math.max(i,o),a):null,ge=i=>i.type==="date"||i.type==="number",xe=()=>globalThis.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches===!0;function Je(i){let o=P(i.layout)?i.layout:{},a=P(o.media)?o.media:null,l=F(Ct,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 Qe=(i,o)=>F(["sm","md","lg","full"],i.size,null)??(o.template==="split"||o.template==="overlay"?"lg":"md"),et=(i,o,a=1)=>{if(i==="fullscreen"||o==="full")return"100vw";let l=i==="teaser"?220:i==="sheet"?400:Ve[o]??Ve.md;return`(max-width: 639px) 100vw, ${Math.round(l*a)}px`},tt=(i,o,a)=>{if(!a||!Array.isArray(i.widths)||!o.endsWith(".webp"))return null;let l=i.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(",")},nt=(i,o)=>i.format==="inline"?"inline":o.format&&o.format!=="inline"?o.format:i.format,ve=i=>i.kind==="video"||i.t==="video",we={webm:"video/webm",mp4:"video/mp4",m4v:"video/mp4",mov:"video/quicktime",ogv:"video/ogg"},ke=i=>we[i.split(/[?#]/)[0].split(".").pop().toLowerCase()],qt=(i,o)=>[...new Set([o,...Array.isArray(i.sources)?i.sources.map(G):[]])].filter(Boolean).sort((a,l)=>(ke(l)===we.webm)-(ke(a)===we.webm));function Ae(i,o,a,l=new Set){let u=o.steps.find(k=>k.id===a);if(!u)return Promise.resolve();let x=nt(i,o),h=Je(u),v=x==="teaser"&&u===o.steps[0],m=x==="teaser"&&!v?"popup":x,T=Qe(o.theme,h),E=v?[]:u.blocks.filter(k=>P(k)&&(k.t==="image"||k.t==="video")).map(k=>[k,1]);return h.media&&!(v&&h.template!=="image-only")&&E.push([h.media,h.template==="split"?.46:1]),Promise.all(E.map(([k,Q])=>{let L=G(ve(k)?k.poster:k.asset);if(!L)return null;let C=document.createElement("img"),U=!ve(k)&&tt(k,L,I(k.width,1,8192));U&&(C.sizes=et(m,T,Q),C.srcset=U);let y=`${C.sizes} ${U||L}`;return l.has(y)?null:(l.add(y),C.src=L,C.decode?.().catch(()=>{}))}))}var Ke=i=>i?.call?i():clearInterval(i),Dt=0,ye=i=>`hp-${i}-${++Dt}`;function p(i,o,a){let l=document.createElement(i);return o&&(l.className=o),a!==void 0&&l.append(We(a)),l}var it=i=>{let o=i.length===4?[...i.slice(1)].map(a=>a+a).join(""):i.slice(1);return[0,2,4].map(a=>Number.parseInt(o.slice(a,a+2),16))},J=i=>{let[o,a,l]=it(i).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},Ze=(i,o=4.5)=>{let a=J(i)+.05,l=1.05/a;return l>=o?"#fff":a/(J("#111")+.05)>l?"#111":"#fff"};function Rt(i,o){let a=(E,k)=>k&&i.style.setProperty(E,k),l=E=>zt.test(E??"")?E: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"?i.ownerDocument.defaultView.getComputedStyle(i.parentElement??i.ownerDocument.body).fontFamily:Object.hasOwn(he,o.font)?he[o.font]:null),l(o.accent)&&(a("--hp-on-accent",Ze(o.accent,3)),a("--hp-on-accent-text",Ze(o.accent))),l(o.background)&&J(o.background)<.18&&(a("--hp-field","#fff"),a("--hp-field-text","#111"));let x=P(o.overlay)?o.overlay:{},h=[l(o.text),l(o.background)].filter(Boolean).sort((E,k)=>J(E)-J(k))[0],[v,m,T]=it(l(x.colour)??h??"#0b0b0f");a("--hp-ov",`rgb(${v} ${m} ${T} / ${I(x.opacity,0,1)??.6})`)}function Ut(i){try{let o=new CSSStyleSheet;o.replaceSync(be),i.adoptedStyleSheets=[o]}catch{let o=document.createElement("style");o.textContent=be,i.append(o)}}function ot(i){let{form:o,creative:a,decision:l,access:u,client:x,api:h,counters:v}=i,m=i.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},E=nt(o,a),k=a.theme,Q=F(Be[E]??[],k.position,Be[E]?.[0]),L=document.createElement("hp-onsite");m&&L.setAttribute("preview",""),Rt(L,k);let C=L.attachShadow({mode:"open"});Ut(C);let U=E!=="inline"&&!m,y=p(U?"dialog":E==="inline"?"section":"div"),Se=p("div","ov"),_=p("div","w"),W=p("div","m");m&&(W.dataset.hpMedia="");let Ee=()=>{let e=p("form","f");return e.noValidate=!0,e.addEventListener("submit",yt),e.addEventListener("input",()=>{M.textContent&&S.getAttribute("aria-busy")!=="true"&&N(null)}),e},S=Ee(),M=p("p","e");M.id=ye("err"),M.setAttribute("aria-live","assertive");let re=p("div","hd");re.setAttribute("aria-hidden","true"),_.append(re,W,S),y.append(Se,_);let Y=E!=="inline"&&p("button","x");Y&&(Y.type="button",Y.addEventListener("click",()=>j("close")),_.append(Y),Se.addEventListener("click",()=>j("close"))),C.append(y);let n={step:null,mode:E,size:"md",modal:!1,mobile:m?.device==="mobile",answers:{},sent:new Set,seen:new Set,receipt:null,claim:i.coupon?{code:i.coupon}:m?{code:"WELCOME15"}:null,claiming:null,touched:!1,toWarm:new Set,warmed:i.warmed??new Set,warming:!1,owed:!1,unclaimed:!1,misses:0,submitted:!1,pow:null,wheel:null,timers:[],codes:[],videos:[],closed:!1},X=o.locale||document.documentElement.lang,rt=o.questions.some(ge)&&i.loadAnswers().catch(()=>null),_e=new WeakMap,$e=()=>{let e=P(k.button)?k.button:{};y.className=`s ${n.mode}${Q?` p-${Q}`:""} b-${F(["pill","rounded","square"],e.shape,"rounded")}${n.mobile?" mob":""}${m?" pv":""}${e.style==="outline"?" bo":""}${k.caps===!0?" uc":""}`},K=m?null:globalThis.matchMedia?.("(max-width: 639px)"),ze=()=>{n.mobile=K?.matches===!0,le(),$e()};K&&(n.mobile=K.matches===!0,K.addEventListener?.("change",ze));let Z=(e,t,r={})=>{m||!l.decision_id||!u.analytics()||x.slotEngaged({decision_id:l.decision_id,slot:l.slot,arm:l.arm??null,engagement:e,step:t??n.step?.id??null,...r})},N=(e,t)=>{M.className="e",M.textContent=e??"";for(let s of S.querySelectorAll("[aria-invalid]"))s.removeAttribute("aria-invalid");let r=t?.closest("label,fieldset");r&&S.contains(r)?r.after(M):S.append(M),t&&(t.setAttribute("aria-invalid","true"),t.setAttribute("aria-describedby",M.id),t.focus(),t.scrollIntoView?.({block:"nearest"}))},H=e=>{S.setAttribute("aria-busy",String(e));for(let t of S.querySelectorAll("button"))t.disabled=e},Te=()=>m?Promise.resolve(null):(n.pow??(n.pow=h.challenge().then(e=>e.status===200?Ue(e.body):null).catch(()=>null)),n.pow),se=()=>{for(let e of n.videos)try{document.hidden||xe()?e.pause():e.play()?.catch?.(()=>{})}catch{}};document.addEventListener("visibilitychange",se);function Ce(e,t,r,s){let c=G(e.asset);if(!c)return null;let f=typeof e.alt=="string"?e.alt:"",d;if(ve(e)){d=p("video",t),d.muted=d.defaultMuted=d.loop=d.playsInline=!0;let w=G(e.poster);w&&(d.poster=w),f?d.setAttribute("aria-label",f):d.setAttribute("aria-hidden","true"),d.autoplay=!xe()&&!m,d.preload=d.autoplay?"auto":w?"none":"metadata";let $=qt(e,c);if($.length>1)for(let z of $){let O=p("source");O.src=z;let q=ke(z);q&&(O.type=q),d.append(O)}else d.src=c;n.videos.push(d)}else{d=p("img",t),d.alt=f,d.decoding="async",d.loading=r?"eager":"lazy",r&&(d.fetchPriority="high");let w=tt(e,c,I(e.width,1,8192));w&&(d.sizes=et(n.mode,n.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=p("label","l");r.append(p("span","lt",e.label??(t==="email"?"Email":"Mobile number")));let s=p("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(p,"Country code","+",Object.entries(ue).map(([d,b])=>[d,`${d} +${b}`]),(e.country||/-(\w\w)$/.exec(X)?.[1]||"").toUpperCase());c.classList.add("cc"),c.name="hp_cc";let f=p("span","ph");return f.append(c,s),r.append(f),r}function st(e){let t=o.questions.find(b=>b.key===e.question);if(!t||!ge(t)&&!Array.isArray(t.options))return null;let r=p("fieldset");r.dataset.question=t.key,r.append(p("legend","",t.label??""));let s=n.answers[t.key]??[];if(ge(t))return rt.then(b=>{if(!b)return r.append(p("p","sm",A.unavailable));b.answerFields(r,t,p,s[0],X),_e.set(r,()=>b.answerOf(r,t,void 0,X))}),r;let c=t.type==="many",f=F(["list","dropdown"],e.display,"buttons"),d=t.options.filter(b=>P(b)&&typeof b.value=="string");if(f==="dropdown"&&!c)return r.append(fe(p,t.label??t.key,"\u2014",d.map(b=>[b.value,b.label??b.value]),s[0])),r;f!=="buttons"&&(r.className="ls");for(let b of d){let g=p("input");g.value=b.value,g.checked=s.includes(b.value),g.type=c?"checkbox":"radio",g.name=`q_${t.key}`;let w=p("label",f==="buttons"?"ch":"c");w.append(g,p("span","",b.label??b.value)),r.append(w)}return r}function ee(){for(let e of n.codes){if(e.replaceChildren(),!n.claim){n.unclaimed&&e.append(p("p","",A.unclaimed));continue}if(!n.claim.code){let s=n.claim.held?A.claimed:n.claim.fallback===!0?A.code:n.claim.prize?.label;s&&e.append(p("p","",s));continue}n.claim.prize?.label&&e.append(p("p","",n.claim.prize.label));let t=p("output");t.textContent=n.claim.code;let r=p("button","btn cp");r.type="button",r.textContent="Copy code",r.addEventListener("click",()=>{navigator.clipboard?.writeText(n.claim.code).then(()=>{r.textContent=A.copied}).catch(()=>{})}),e.append(t,r)}}function at(e){if(n.claim&&!n.claim.code)return null;let t=p("p","tm");t.setAttribute("role","timer");let r=Date.now()+Math.max(0,Number(e.minutes)||0)*6e4,s=()=>{let f=Math.max(0,Math.round((r-Date.now())/1e3));t.textContent=`${String(Math.floor(f/60)).padStart(2,"0")}:${String(f%60).padStart(2,"0")}`,f===0&&clearInterval(c)},c=setInterval(s,1e3);return n.timers.push(c),s(),t}function ae(e,t){return e.href=t,e.rel="noopener",e.addEventListener("click",r=>{m?r.preventDefault():Z("click")}),e}function lt(e){let t=e.label??"Continue";if(e.action==="link"){let s=B(e.href);return s?ae(p("a",`btn${Xe[e.variant]??""}`,t),s):null}let r=p("button",`btn${Xe[e.variant]??""}`,t);return r.type=e.action==="submit"?"submit":"button",r.type==="button"?r.addEventListener("click",()=>ie(e)):r.dataset.submit="",r}let Me=(e,t,r)=>(e.classList.add(`x-${F(Lt,t.size,r)}`),Mt.includes(t.align)&&e.classList.add(`a-${t.align}`),e);function Oe(e){let t=Ce(e,"bi",n.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=ae(p("a","bl"),B(e.href));return c.append(t),c}function ct(e){let t=I(e.threshold,.01,1e7);if(!t)return null;let r=p("div","pg"),s=p("p"),c=p("div","tr"),f=p("i");c.append(f),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(X||void 0,{style:"currency",currency:e.currency});d=w=>g.format(w)}catch{}let b=()=>{let g=Math.max(0,Number(i.basket?.())||0),w=t-g;s.textContent=w>0?String(e.text??"").replace("{amount}",d(w)):e.done??"",f.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(),n.timers.push(setInterval(b,2e3)),r}function dt(e){let t=p("div","pr");return i.loadProducts?.().then(r=>{t.isConnected&&n.timers.push(r.mountProducts(t,e,{el:p,lang:X,root:C,placement:o.slot,preview:m,client:!m&&u.analytics()&&x,engaged:Z,seen:n.seen}))}).catch(()=>{}),t}let Ie={heading(e){let t=Me(p("h2","",e.text),e,"xl");return t.id=ye("h"),t.tabIndex=-1,y.hasAttribute("aria-labelledby")||(y.setAttribute("aria-labelledby",t.id),n.step===a.steps[0]&&He.includes(n.mode)&&!m&&(t.autofocus=!0)),t},text:e=>Me(p("p","",e.text),e,"md"),email:e=>Le(e,"email"),phone:e=>Le(e,"tel"),consent(e){let t=T(n.step)?.text;if(typeof t!="string")return null;if(e.required!==!0)return p("p","sm",t);let r=p("label","c"),s=p("input");return s.type="checkbox",s.name="hp_consent",s.required=!0,s.setAttribute("aria-describedby",M.id),r.append(s,p("span","",t)),r},question:st,wheel(){let e=p("div","wh");return i.loadWheel().then(t=>{n.closed||(n.wheel=t.mountWheel(e,o.prizes))}).catch(()=>{}),e},code(){let e=p("div","k");return e.setAttribute("aria-live","polite"),n.codes.push(e),e},button:lt,decline(e){let t=p("button","btn no",e.label??"No thanks");return t.type="button",t.addEventListener("click",()=>j("decline")),t},countdown:at,progress:ct,products:dt,image:Oe,video:Oe,spacer(e){let t=p("div","sp");return t.style.height=`${Ge[e.size]??Ge.md}px`,t.setAttribute("aria-hidden","true"),t},divider:()=>p("hr")};function pt(e,t){W.replaceChildren();let r=e.media,s=!r||t&&e.template!=="image-only";if(n.size=Qe(k,e),_.className=`w t-${e.template} z-${n.size}${e.side==="right"?" right":""}${k.text_align==="center"?" ta-center":""}${s?" nm":""}`,_.style.setProperty("--sc",String(e.scrim)),S.className=`f pd-${e.padding}`,W.hidden=s,W.hidden)return;let c=Ce(r,"",n.step===a.steps[0],e.template==="split"?.46:1);if(!c)return;if(c.width?_.style.setProperty("--ar",`${c.width} / ${c.height}`):_.style.removeProperty("--ar"),e.template!=="image-only"){c.tagName==="IMG"&&e.template==="overlay"&&(c.alt=""),W.append(c);return}let f=B(r.href),d=f?ae(p("a","io"),f):p("button","io");f||(d.type="button",d.addEventListener("click",()=>ie({action:"next"}))),d.append(c),W.append(d)}function ut(e){let t=e.blocks.find(c=>c?.t==="heading"),r=e.blocks.find(c=>c?.t==="button"&&c.action==="next"),s=p("button","tb");return s.textContent=t?p("b","",t.text).textContent:r?.label??"Open",s.type="button",s.addEventListener("click",()=>ie(r??{action:"next"})),s}function D(e,t=new Set){let r=a.steps.find(z=>z.id===e);if(!r)return j("done");if(r.kind==="question"&&!m&&!u.analytics()&&!t.has(r.id))return D(V(r,n.answers),t.add(r.id));let s=n.step!==null,c=s&&(C.activeElement||document.activeElement===document.body),f=s&&!m?{mode:n.mode,w:_.offsetWidth,h:_.offsetHeight,top:_.offsetTop}:null;n.step=r,n.touched=!1;for(let z of n.timers.splice(0))Ke(z);n.codes=[],n.videos=[],n.wheel=null;let d=E==="teaser"&&r===a.steps[0];if(n.mode=E==="teaser"&&!d?"popup":E,E==="teaser"&&v.tab?.(o.slot,d),Y&&Y.setAttribute("aria-label",d?A.closeOffer:"Close"),$e(),y.removeAttribute("aria-labelledby"),f){let z=Ee();S.replaceWith(z),S=z}let b=Je(r);pt(b,d);let g=f?.mode==="popup"&&n.mode==="popup";if(le(),f?.mode===n.mode&&f.h>0&&!g&&(_.style.setProperty("--lw",`${f.w}px`),_.style.setProperty("--lh",`${f.h}px`),_.classList.add("lk")),S.replaceChildren(),d&&b.template!=="image-only")S.append(ut(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&&(m&&(q.dataset.hpBlock=String(z)),S.append(q))}let w=S.querySelector("[data-submit]"),$=S.querySelector("[name=hp_consent]")?.parentNode;w&&$&&w.before($),S.hidden=S.childElementCount===0,N(null),ee(),y.hasAttribute("aria-labelledby")?y.removeAttribute("aria-label"):y.setAttribute("aria-label",b.media?.alt?.trim?.()||"Sign up"),g&&f.h>0&&ft(f),s&&Pe(),se(),m||mt(r),c&&S.querySelector("h2")?.focus()}function le(){_.classList.remove("lk","an"),_.style.removeProperty("--tp")}function ft(e){let t=_.offsetHeight;_.classList.add("an");let r=_.offsetTop,s=Math.max(0,e.top-r);if(s+t>y.clientHeight-2*r)return le();_.style.setProperty("--tp",`${s}px`)}function mt(e){let t=e.next??{};for(let c of[t.default,...Object.values(P(t.answers)?t.answers:{}),...e.blocks.map(f=>f?.next),...It])typeof c=="string"&&n.toWarm.add(c);if(n.warming)return;n.warming=!0;let r=()=>{if(n.warming=!1,!n.closed&&L.isConnected)for(let c of n.toWarm)Ae(o,a,c,n.warmed);n.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(n.mode);if(!(y.open&&n.modal===e)){try{y.open&&y.close()}catch{}if(n.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}):L.blur()}else y.setAttribute("open","");!e||typeof y.showModal!="function"?y.setAttribute("role","dialog"):y.removeAttribute("role")}}function ht(){for(let e of S.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?n.answers[t]=s:delete n.answers[t]}}function bt(){let e=[];for(let[r,s]of Object.entries(n.answers)){let c=`${r}=${s.join(",")}`;n.sent.has(c)||(n.sent.add(c),e.push({question:r,values:s}))}let t=n.step.id;if(n.signedUp&&e.length)return void h.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,...n.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()}),te=e=>{n.receipt&&!m&&bt(),D(V(n.step,n.answers,e))};async function gt(e){let t=n.step,r=S.querySelector("input[name=email],input[name=phone]");if(!r)return te(e.next);let s=r.name==="email"?"email":"sms",c=S.querySelector("select[name=hp_cc]")?.value,f=s==="email"?Ye(r.value.trim())?r.value.trim():null:Fe(r.value,c);if(!f)return N(s==="email"?A.email:c?A.phone:A.intl,r);let d=S.querySelector("input[name=hp_consent]");if(d&&!d.checked)return N(A.consent,d);N(null),H(!0);let b=await Te();n.pow=null;let g=Object.entries(n.answers).map(([R,de])=>({question:R,values:de})),w=s==="sms"?o.sms_consent_text:o.consent_text,$=await h.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"]:f,...s==="sms"&&n.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)&&Tt.includes(z);if(n.closed&&!O)return;O||H(!1);let q=$.status===400?$.body?.field:null;if(q==="email"||q==="phone")return N(A[q],r);if(!O)return N($.status===429?A.busy:A.failed,r);r.value="";for(let[R,de]of Object.entries(n.answers))n.sent.add(`${R}=${de.join(",")}`);n.receipt=typeof $.body.receipt=="string"?$.body.receipt:null,s==="email"&&(n.signedUp={email:f,email_receipt:n.receipt}),n.submitted=!0,v.submitted(o.slot),Z("submit",t.id),n.owed=s==="email"&&o.prizes.length>0;let oe=n.owed?ce([]):null;oe||i.emit?.("submitted",{coupon:null});let wt=oe&&await Promise.race([oe,new Promise(R=>setTimeout(R,Nt))]);if(n.closed)return;if(H(!1),wt?.held)return D(ne("held"));let kt=z!=="ok"&&a.steps.some(R=>R.id===z);D(kt?z:V(t,n.answers,e.next));let At=n.step;oe?.then(R=>{R?.held&&!n.closed&&n.step===At&&!n.touched&&D(ne("held"))})}function ne(e){if(a.steps.some(s=>s.id===e))return e;let t={t:"button",label:A.shop,action:"close"},r=e==="unclaimed"?[{t:"heading",text:A.thanks},{t:"text",text:A.unclaimed},t]:e==="fallback"||n.claim?.code?[{t:"heading",text:e==="fallback"?A.thanks:A.yours},{t:"code"}]:[{t:"heading",text:A.held},{t:"text",text:o.code_relayed===!0?A.resent:A.inbox},t];return a.steps.push({id:e,blocks:r}),e}function je(e){n.owed&&(n.owed=!1,i.emit?.("submitted",{coupon:e?{code:e.code??null,prize:e.prize?.key}:null}))}function ce(e=Pt){let t=n.receipt;return n.claiming??(n.claiming=(async()=>{n.unclaimed=!1;let r;for(let d of[0,...e])if(d&&await new Promise(b=>setTimeout(b,d)),r=await h.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 n.claiming=null,!e.length&&r.status===503?ce():(je(null),n.unclaimed=!0,n.closed||ee(),null);let f=s.held&&!s.code?v.code?.():null;return f&&(s={...s,code:f}),n.claim=s,typeof s.code=="string"&&v.code?.(s.code),je(s),n.closed||ee(),s})()),n.claiming}async function xt(e){if(!n.receipt)return N(A.spin);H(!0);let t=await ce();if(n.closed)return;if(!t)return H(!1),n.misses+=1,n.misses<2?N(A.retry):D(ne("unclaimed"));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(n.wheel&&s>=0&&!r){if(await n.wheel.spinTo(s),n.closed)return;M.className="e won",M.textContent=`${A.won} ${t.prize.label}`,await new Promise(d=>setTimeout(d,jt))}if(n.closed)return;H(!1);let c=r?"fallback":s<0?"held":null,f=c?ne(c):V(n.step,n.answers,e.next);f?D(f):ee()}function ie(e){if(e.action==="close")return j("close");let t=ht();return m?te(e.next):t?N(t.error,t.input):e.action==="apply"?(i.emit?.("apply",{coupon:n.claim?.code?{code:n.claim.code}:null}),Z("click"),V(n.step,n.answers,e.next)?te(e.next):j("done")):e.action==="submit"?gt(e):e.action==="spin"?xt(e):te(e.next)}function yt(e){if(e.preventDefault(),S.getAttribute("aria-busy")==="true")return;let t=n.step.blocks.find(r=>r?.t==="button"&&r.action==="submit");ie(t??{action:"next"})}function qe(){n.closed=!0;for(let t of n.timers.splice(0))Ke(t);document.removeEventListener("visibilitychange",se),K?.removeEventListener?.("change",ze);let e=()=>{try{y.open&&y.close()}catch{}L.remove()};if(!U||xe())return e();y.classList.add("out"),setTimeout(e,Ot)}function j(e){n.closed||m||(!n.submitted&&e!=="done"&&Z("dismiss"),v.closed(o.slot),v.tab?.(o.slot,!1),qe(),i.onClose?.(e))}for(let e of["pointerdown","keydown","input"])y.addEventListener(e,()=>{n.touched=!0});y.addEventListener("cancel",e=>{e.preventDefault(),j("esc")}),y.addEventListener("keydown",e=>{e.key==="Escape"&&!n.modal&&E!=="inline"&&j("esc"),e.key==="Tab"&&n.modal&&vt(e)});function vt(e){let t=[...C.querySelectorAll("input[type=radio]:checked")],r=new Set,s=[...C.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,f=C.activeElement;f?.type==="radio"&&(f=s.find(g=>g.type==="radio"&&g.name===f.name)??f);let d=s.indexOf(f),b=null;if(d<0){let g=w=>f&&f.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 re.addEventListener("pointerdown",e=>{if(!n.mobile||n.mode!=="sheet")return;let t=e.clientY,r=0,s=f=>{r=Math.max(0,f.clientY-t),_.style.transform=`translateY(${r}px)`},c=()=>{document.removeEventListener("pointermove",s),document.removeEventListener("pointerup",c),_.style.transform="",r>80&&j("close")};document.addEventListener("pointermove",s),document.addEventListener("pointerup",c)}),D(m?.step&&a.steps.some(e=>e.id===m.step)?m.step:a.steps[0].id),(i.container??document.body).append(L),Pe(),{close:j,root:C,host:L,show:D,step:()=>n.step?.id??null,modal:()=>!n.closed&&n.modal,destroy:()=>!n.closed&&qe()}}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render")]={mountForm:ot,warm:Ae};})();
@@ -1 +1 @@
1
- (()=>{function T(e){let s=typeof document>"u"?null:document.currentScript?.src;return s?new URL(e,s).href:null}var H=new Map;function I(e,s){return window[s]?Promise.resolve(window[s]):e?(H.has(s)||H.set(s,new Promise((n,i)=>{let a=document.createElement("script");a.src=e,a.async=!0,a.onload=()=>window[s]?n(window[s]):i(new Error(`${e} did not register`)),a.onerror=()=>i(new Error(`${e} did not load`)),document.head.append(a)}).finally(()=>H.delete(s))),H.get(s)):Promise.reject(new Error("the CDN script\u2019s own URL is unknown"))}var Ke=T("onsite-answers.min.js"),ae=()=>I(Ke,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.answers"));var Ye="/v1/capture/challenge",He=e=>typeof e=="string"&&/^\/v1\/[\w/-]+$/.test(e)?e:Ye;function ce(e,s={}){let n=s.fetch??globalThis.fetch?.bind(globalThis),i=s.servingHost??e.servingHost,a=s.gatewayHost??e.gatewayHost;async function r(d,{method:p="GET",body:o,consent:l=!1,timeoutMs:c}={}){if(!n)return{status:0,body:null};try{let w=await n(d,{method:p,credentials:"omit",signal:c&&AbortSignal.timeout?.(c),headers:{accept:"application/json",authorization:`Bearer ${e.writeKey}`,...o?{"content-type":"application/json"}:{},...l?e.headers():{}},...o?{body:JSON.stringify(o)}:{}}),b=null;try{b=await w.json()}catch{}return{status:w.status,body:b}}catch{return{status:0,body:null}}}return{decide:(d,p,{visitAudiences:o,visitCampaign:l}={})=>r(`${i}/v1/decisions`,{method:"POST",consent:!0,body:{slots:[p?{key:d,pin:{experiment:p[0],arm:p[1],split:p[2]}}:d],identifier_value:e.anonymousId()??void 0,session_id:e.sessionId()??void 0,identity_token:e.identityToken?.()??void 0,...e.preview?{preview:e.preview}:{},...o?{visit_audiences:o}:{},...l?{visit_campaign:l}:{}}}),datafile:()=>r(`${i}/v1/audiences/datafile`,{timeoutMs:1500}),challenge:()=>r(`${a}${He(s.challenge)}`),capture:d=>r(`${a}/v1/capture`,{method:"POST",body:d}),answers:d=>r(`${a}/v1/capture/answers`,{method:"POST",body:d}),claim:d=>r(`${i}/v1/offers/claim`,{method:"POST",consent:!0,body:d,timeoutMs:8e3})}}var Xe=T("onsite-audiences.min.js"),ue=()=>I(Xe,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.audiences"));function de(e,s){let n={},i=()=>{try{let r=JSON.parse(e().getItem(s));r&&typeof r=="object"&&(n=r)}catch{}return n};return{read:i,write:r=>{let d=i();r(d),n=d;try{e().setItem(s,JSON.stringify(d))}catch{}}}}function pe(e,s=()=>!0){let n=de(()=>sessionStorage,e),i=de(()=>localStorage,e),a=()=>s()?i:n,r=()=>{let o=i.read();(o.sub!==void 0||o.k!==void 0)&&i.write(l=>{delete l.sub,delete l.k})},d=()=>s()?[n.read(),i.read()]:(r(),[n.read()]),p=(o,l)=>{var c;return o.f??(o.f={}),(c=o.f)[l]??(c[l]={}),o.f[l]};return{seen(o){let l=i.read().f?.[o]??{};return{session:n.read().f?.[o]?.n??0,lifetime:l.n??0,closedAt:l.c??null,submitted:l.s===1}},subscribed:()=>d().some(o=>o.sub===1),shown(o){n.write(l=>{let c=p(l,o);c.n=(c.n??0)+1}),i.write(l=>{let c=p(l,o);c.n=(c.n??0)+1})},closed(o,l=Date.now()){i.write(c=>{p(c,o).c=l})},tab(o,l){n.write(c=>{let w=p(c,o);l?w.t=1:delete w.t})},tabOut:o=>n.read().f?.[o]?.t===1,pin(o,l){if(l===void 0)return n.read().f?.[o]?.p??null;n.write(c=>{p(c,o).p=l})},coveredAt:()=>n.read().o??null,covered(o=Date.now()){n.write(l=>{l.o=o})},code(o,l=Date.now()){if(o===void 0){let[c]=d().flatMap(w=>w.k?[w.k]:[]).sort((w,b)=>b.at-w.at);return c&&l-c.at<14*864e5?c.c:null}return a().write(c=>{c.k={c:o,at:l}}),o},submitted(o){i.write(l=>{p(l,o).s=1}),a().write(l=>{l.sub=1})}}}var ze=T("onsite-render.min.js"),fe=()=>I(ze,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render"));var Ve=["source","medium","campaign","content","term"];var he=e=>String(e).trim().toLowerCase();function Ge(e,s,n){let i=he(e),a=he(n);return s==="is"?i===a:s==="contains"&&a!==""&&i.includes(a)}function ge(e,s){return(Array.isArray(e)?e:[]).every(n=>{let i=s?.[n?.field];return!Ve.includes(n?.field)||typeof i!="string"?!1:[].concat(n.values??[]).some(a=>Ge(i,n.match,a))})}var be=["popup","sheet","bar","teaser","inline","fullscreen"],Be=["entry","exit","scroll","time","idle","inline","manual"],Z=e=>e!=="inline",Se=e=>e==="popup"||e==="sheet"||e==="fullscreen",S=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),k=e=>Array.isArray(e)?e.filter(s=>typeof s=="string"):[],me=e=>Number.isInteger(e)&&e>=0?e:null,qe={field:null,match:null,values:[]},Je=e=>e==null?[]:Array.isArray(e)&&e.every(S)?e:[qe];function _e(e){if(!S(e)||typeof e.slot!="string"||e.slot==="")return null;let s=S(e.trigger)?e.trigger:{};if(!be.includes(e.format)||!Be.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:k(e.devices),aliases:k(e.aliases),audiences:k(e.audiences),arrived_from:Je(e.arrived_from),caps:{per_session:me(n.per_session),lifetime:me(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 Ze=/^[a-z][a-z0-9_-]{0,31}$/;function Ae(e){if(!S(e)||e.v!==1||!Array.isArray(e.steps))return null;let s=e.steps.filter(n=>S(n)&&Ze.test(n.id)&&Array.isArray(n.blocks));return s.length===0?null:{format:be.includes(e.format)?e.format:null,theme:S(e.theme)?e.theme:{},steps:s}}function we(e,s){let n=String(e).split("*").map(i=>i.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(s)}function Qe(e,s){let n=k(e?.include);return(!n.length||n.some(i=>we(i,s)))&&!k(e?.exclude).some(i=>we(i,s))}function ve(e){return e.matchMedia?.("(hover: none) and (pointer: coarse)")?.matches===!0||e.innerWidth<768?"mobile":"desktop"}var ye=e=>typeof e=="string"?Date.parse(e):Number.NaN,F=e=>e.trigger.type==="manual";function Q(e,s){let n=[];Qe(e.pages,s.path)||n.push("page not included"),e.devices.length&&!e.devices.includes(s.device)&&n.push(`not on ${s.device}`),ge(e.arrived_from,s.campaign)||n.push("not from its campaign");let i=ye(e.window.starts_at),a=ye(e.window.ends_at);if((s.now<i||s.now>=a)&&n.push("outside its dates"),e.audiences.length&&!s.preview&&(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||F(e))return n;let{seen:r}=s,{caps:d}=e;return r.submitted&&n.push("already submitted"),e.exclude_subscribed===!0&&s.subscribed&&n.push("already subscribed"),d.per_session!==null&&r.session>=d.per_session&&n.push("per_session cap"),d.lifetime!==null&&r.lifetime>=d.lifetime&&n.push("lifetime cap"),d.after_close_days!==null&&r.closedAt&&s.now-r.closedAt<d.after_close_days*864e5&&n.push("closed recently"),n}var Ee=(e,s)=>s.priority-e.priority;var et=["mousemove","pointerdown","keydown","scroll","touchstart","wheel"];function tt(){let e=[];return{on:(i,a,r,d={passive:!0})=>{i.addEventListener(a,r,d),e.push(()=>i.removeEventListener(a,r,d))},later:(i,a)=>{let r=setTimeout(i,a);e.push(()=>clearTimeout(r))},stop:()=>{for(let i of e.splice(0))i()}}}var xe=(e,s)=>{let n=s.documentElement.scrollHeight||0;return n>0?(e.scrollY+e.innerHeight)/n:0},nt=e=>{let s=e.activeElement;return!!(s&&(/^(INPUT|TEXTAREA|SELECT)$/.test(s.tagName)||s.isContentEditable))};function st({on:e,later:s},n,i,a,r){let d=!1,p=!1,o=null,l=0;s(()=>{d=!0},i.delay_ms??5e3),e(r,"mousemove",c=>{c.clientY>a.innerHeight*.1&&(p=!0),o!==null&&(l=c.clientY-o),o=c.clientY}),e(r,"mouseout",c=>{d&&p&&!c.relatedTarget&&c.clientY<=0&&l<0&&!nt(r)&&n("exit")})}function ot({on:e,later:s},n,i,a,r){let d=!1,p=0,o=a.scrollY,l=Date.now(),c=null,w=null;s(()=>{d=!0},i.delay_ms??5e3),e(a,"scroll",()=>{let b=a.scrollY,_=Date.now();if(p=Math.max(p,xe(a,r)),b<o){(!c||_-c.t>300)&&(c={y:o,t:l});let A=c.y-b;d&&p>=.3&&A>=120&&A/Math.max(1,_-c.t)>=.5&&n("exit_scroll")}else c=null;o=b,l=_}),e(r,"visibilitychange",()=>{r.visibilityState==="hidden"?w=Date.now():w!==null&&Date.now()-w>=1e4&&n("return"),r.visibilityState!=="hidden"&&(w=null)})}function Te(e,s,{device:n,win:i=window,doc:a=document}){let r=tt(),d=(e.seconds??30)*1e3;if(e.type==="entry"&&r.later(()=>s("entry"),e.delay_ms??0),e.type==="time"&&r.later(()=>s("time"),d),e.type==="exit"&&(n==="mobile"?ot:st)(r,s,e,i,a),e.type==="scroll"){let p=e.depth??.5;r.on(i,"scroll",()=>xe(i,a)>=p&&s("scroll"))}if(e.type==="idle"){let p=null,o=()=>{clearTimeout(p),p=setTimeout(()=>s("idle"),d)};o();for(let l of et)r.on(l==="scroll"?i:a,l,o);return r.on(a,"visibilitychange",o),()=>{clearTimeout(p),r.stop()}}return r.stop}var it=T("onsite-wheel.min.js"),Ie=()=>I(it,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.wheel"));var Me=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite-access"),j=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite"),rt=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.pending"),lt=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.listeners"),Oe=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.suppressed"),Ce={seen:()=>({session:0,lifetime:0,closedAt:null,submitted:!1}),subscribed:()=>!1,shown(){},closed(){},submitted(){},tab(){},tabOut:()=>!1,pin:()=>null,coveredAt:()=>null,covered(){},code:()=>null},at=1500,ct=50,ut=300,dt=()=>{try{return new URLSearchParams(location.search).get("hp_debug")==="onsite"}catch{return!1}};function Pe(e,s={}){if(typeof window>"u"||typeof document>"u")return null;if(window[j])return window[j];let n=typeof e?.[Me]=="function"?e[Me]():null;if(!n)return console.warn("[hp] onsite: startOnsite needs the client bootstrap or createAnalytics made"),null;let i=s.settings??n.settings??{},a=ce(n,{...s,challenge:i.capture?.challenge}),r=n.preview?Ce:pe(n.storageKey,n.personalisation),d=()=>n.campaign?.()??null,p=new Map,o=()=>window[Oe]?.size>0,l=(t,u)=>{for(let f of window[lt]?.[t]??[])try{f(u)}catch(g){console.warn(`[hp] onsite ${t} listener failed:`,g)}},c=ve(window),w=n.debug||s.debug===!0||dt(),b=new Map,_=new Map,A=[];for(let t of Array.isArray(i.forms)?i.forms:[]){let u=_e(t);u?A.push(u):b.set(String(t?.slot??`form ${b.size+1}`),{slot:String(t?.slot??""),state:"invalid",reasons:["not a form this SDK can show"]})}let ee=()=>ue().catch(t=>(console.warn("[hp] onsite audiences not loaded:",t?.message??t),null));n.personalisation()&&A.some(t=>t.audiences.length>0)&&ee().then(t=>t?.prefetch(a));let v=new Map,U=new Map,M=null,te=new Set,$e=t=>{for(let u of v.keys()){let f=p.get(u);if(!t||!f||f.modal?.())return u}return null},W=[],X=Number.isInteger(i.overlay_gap_minutes)?i.overlay_gap_minutes:0,Ne=()=>{let t=r.coveredAt();if(!(X>0)||typeof t!="number")return null;let u=Math.max(0,Math.floor((Date.now()-t)/6e4));return u<X?`a popup showed ${u} min ago; ${X} min between them`:null},N=new Set,K=new Map,m=(t,u,f=[])=>(b.set(t.slot,{slot:t.slot,format:t.format,trigger:t.trigger.type,priority:t.priority,state:u,reasons:f}),w&&console.info(`[hp] onsite ${t.slot}: ${u}${f.length?` (${f.join("; ")})`:""}`),u),ne=()=>{try{let t=s.audiences?.();return Array.isArray(t)?t:null}catch{return null}},se=t=>({path:location.pathname,device:c,campaign:d(),now:Date.now(),seen:r.seen(t.slot),subscribed:r.subscribed()||s.subscribed?.()===!0,personalisation:n.personalisation(),preview:!!n.preview,audiences:ne()}),z=t=>{_.get(t.slot)?.(),_.delete(t.slot)};function R(t,u,f=!1,g=F(t)){return p.has(t.slot)?Promise.resolve("shown"):(U.has(t.slot)||U.set(t.slot,Re(t,u,f,g).finally(()=>U.delete(t.slot))),U.get(t.slot))}async function Re(t,u,f,g){if(o())return m(t,"not shown",[`suppressed: ${[...window[Oe]].join(", ")}`]);let O=Q(t,{...se(t),...f?{seen:Ce.seen()}:{},asked:g});if(O.length)return m(t,"not eligible",O);let E=Se(t.format)&&!f,Y=E&&!g&&Ne();if(Y)return m(t,"not shown",[Y]);if(E&&!n.preview&&n.consentAnswered?.()===!1)return K.set(t,g),m(t,"not shown",["waiting for the consent banner"]);let x=Z(t.format),L=x&&$e(g);if(L)return m(t,"not shown",[`${L} is showing`]);if(x&&M&&!g)return m(t,"not shown",[`${M} already showed on this page view`]);let C=null;if(!x){try{C=document.querySelector(t.trigger.selector??"")}catch{C=null}if(!C)return m(t,"not shown",["no element matches its selector"])}x&&v.set(t.slot,t),z(t),m(t,"asking for a decision",[u]);let ke=fe().catch(h=>(console.warn("[hp] onsite renderer not loaded:",h?.message??h),null)),G=ne()??[],ie=[...new Set([...t.audiences,...G])].filter(h=>G.includes(h)).slice(0,100),Fe=t.audiences.length>0&&!n.preview&&n.personalisation()?await Promise.race([ee().then(h=>h?h.visitAudiences(a,n.sessionSignals,t.audiences,G):ie),new Promise(h=>setTimeout(h,at,ie))]):null,P=await a.decide(t.slot,r.pin(t.slot),{visitAudiences:Fe,visitCampaign:t.arrived_from.length?d():null}),y=P.status===200?P.body?.decisions?.find(h=>h?.slot===t.slot):null;y?.experiment&&y.arm&&y.split&&r.pin(t.slot,[y.experiment,y.arm,y.split]);let $=y&&y.holdout!==!0?Ae(y.payload):null,re=$?.steps[0].blocks??[],le=y?.offer?.code??(n.preview?"PREVIEW":r.code()),je=n.basketValue?.()??null,B=re.some(h=>h?.t==="code")&&!le&&"no code to remind of"||re.some(h=>h?.t==="progress")&&!(je>0)&&"the basket is empty";if(B)return v.delete(t.slot),B==="the basket is empty"&&N.add(t),m(t,"not shown",[B]);if(N.delete(t),!$)return y?.holdout===!0&&n.analytics()&&e.recordExposure(P.body),v.delete(t.slot),x&&y?.holdout===!0&&(M??(M=t.slot)),y?.holdout===!0&&!g&&l("held",{slot:t.slot,arm:y.arm??null,format:t.format}),m(t,y?.holdout===!0?"held out":"no decision",[P.status===200?"no creative for this visitor":`decisions answered ${P.status}`]);let q=await ke;if(!q)return v.delete(t.slot),m(t,"not shown",["the renderer did not load"]);if(await Promise.race([q.warm?.(t,$,$.steps[0].id,te),new Promise(h=>setTimeout(h,ut))]),o())return v.delete(t.slot),m(t,"not shown",["suppressed"]);f||r.shown(t.slot),E&&r.covered(),x&&(M??(M=t.slot));let J=(h,We={})=>l(h,{slot:t.slot,arm:y.arm??null,format:$.format??t.format,...We}),Ue=q.mountForm({form:t,creative:$,decision:y,access:n,client:e,api:a,counters:r,loadWheel:Ie,loadAnswers:ae,container:C,warmed:te,coupon:le,basket:()=>n.basketValue?.()??null,emit:J,onClose(h){p.delete(t.slot),v.delete(t.slot),m(t,"closed",[h]),J("closed",{reason:h})}});return p.set(t.slot,Ue),n.analytics()&&e.recordExposure(P.body),m(t,"shown",[u]),J("shown"),"shown"}function V(t,u,f=F(t)){if(!Z(t.format))return R(t,u,!1,f);W.push([t,u,f]),!(W.length>1)&&setTimeout(async()=>{let g=W.sort(([O],[E])=>Ee(O,E));W=[];for(let[O,[E,Y,x]]of g.entries()){let L=await R(E,Y,!1,x);if(L==="shown"||L==="held out"){for(let[C]of g.slice(O+1))m(C,"not shown",[`${E.slot} has a higher priority`]);return}}},ct)}for(let t of A){if(t.format==="teaser"&&r.tabOut(t.slot)){R(t,"tab kept from an earlier page",!0);continue}let u=Q(t,se(t));if(u.length){m(t,"not eligible",u);continue}let f=t.trigger.type;f==="manual"?m(t,"waiting for hp.onsite.open"):f==="inline"||t.format==="inline"?R(t,"inline"):oe(t)}function oe(t){z(t),_.set(t.slot,Te(t.trigger,u=>{z(t),V(t,u)},{device:c})),m(t,"armed",[`${t.trigger.type} on ${c}`])}let De=n.onConsentAnswered?.(()=>{let t=[...K];K.clear();for(let[u,f]of t)p.has(u.slot)||(f?V(u,"manual",f):oe(u))}),Le=n.onBasket?.(()=>{if(!((n.basketValue?.()??0)>0))return;let t=[...N];N.clear();for(let u of t)p.has(u.slot)||V(u,"the basket changed")}),D=Object.freeze({open(t){let u=A.find(g=>g.slot===t),f=u??A.find(g=>g.aliases.includes(t));return f?p.has(f.slot)?Promise.resolve(!0):R(f,"manual",!1,F(f)||!u).then(g=>g==="shown"):Promise.resolve(!1)},suppress(){for(let[t,u]of p){u.destroy(),p.delete(t),v.delete(t);let f=A.find(g=>g.slot===t);f&&m(f,"closed",["suppressed"])}},debug:()=>[...b.values()].map(t=>({...t,reasons:[...t.reasons]})),stop(){for(let t of _.values())t();_.clear(),Le?.(),De?.(),N.clear(),K.clear(),window[j]===D&&delete window[j]}});window[j]=D;for(let{slot:t,resolve:u}of window[rt]?.splice(0)??[])u(D.open(t));return w&&console.table?.(D.debug()),D}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.module")]={startOnsite:Pe};})();
1
+ (()=>{function _(e){let s=typeof document>"u"?null:document.currentScript?.src;return s?new URL(e,s).href:null}var X=new Map;function A(e,s){return window[s]?Promise.resolve(window[s]):e?(X.has(s)||X.set(s,new Promise((n,i)=>{let c=document.createElement("script");c.src=e,c.async=!0,c.onload=()=>window[s]?n(window[s]):i(new Error(`${e} did not register`)),c.onerror=()=>i(new Error(`${e} did not load`)),document.head.append(c)}).finally(()=>X.delete(s))),X.get(s)):Promise.reject(new Error("the CDN script\u2019s own URL is unknown"))}var He=_("onsite-answers.min.js"),ue=()=>A(He,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.answers"));var Xe="/v1/capture/challenge",ze=e=>typeof e=="string"&&/^\/v1\/[\w/-]+$/.test(e)?e:Xe;function de(e,s={}){let n=s.fetch??globalThis.fetch?.bind(globalThis),i=s.servingHost??e.servingHost,c=s.gatewayHost??e.gatewayHost;async function r(d,{method:p="GET",body:o,consent:l=!1,timeoutMs:a}={}){if(!n)return{status:0,body:null};try{let w=await n(d,{method:p,credentials:"omit",signal:a&&AbortSignal.timeout?.(a),headers:{accept:"application/json",authorization:`Bearer ${e.writeKey}`,...o?{"content-type":"application/json"}:{},...l?e.headers():{}},...o?{body:JSON.stringify(o)}:{}}),b=null;try{b=await w.json()}catch{}return{status:w.status,body:b}}catch{return{status:0,body:null}}}return{decide:(d,p,{visitAudiences:o,visitCampaign:l,visitContext:a}={})=>r(`${i}/v1/decisions`,{method:"POST",consent:!0,body:{slots:[p?{key:d,pin:{experiment:p[0],arm:p[1],split:p[2]}}:d],identifier_value:e.anonymousId()??void 0,session_id:e.sessionId()??void 0,identity_token:e.identityToken?.()??void 0,...e.preview?{preview:e.preview}:{},...o?{visit_audiences:o}:{},...l?{visit_campaign:l}:{},...a?{visit_context:a}:{}}}),datafile:()=>r(`${i}/v1/audiences/datafile`,{timeoutMs:1500}),challenge:()=>r(`${c}${ze(s.challenge)}`),capture:d=>r(`${c}/v1/capture`,{method:"POST",body:d}),answers:d=>r(`${c}/v1/capture/answers`,{method:"POST",body:d}),claim:d=>r(`${i}/v1/offers/claim`,{method:"POST",consent:!0,body:d,timeoutMs:8e3})}}var Ve=_("onsite-audiences.min.js"),pe=()=>A(Ve,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.audiences"));function fe(e,s){let n={},i=()=>{try{let r=JSON.parse(e().getItem(s));r&&typeof r=="object"&&(n=r)}catch{}return n};return{read:i,write:r=>{let d=i();r(d),n=d;try{e().setItem(s,JSON.stringify(d))}catch{}}}}function he(e,s=()=>!0){let n=fe(()=>sessionStorage,e),i=fe(()=>localStorage,e),c=()=>s()?i:n,r=()=>{let o=i.read();(o.sub!==void 0||o.k!==void 0)&&i.write(l=>{delete l.sub,delete l.k})},d=()=>s()?[n.read(),i.read()]:(r(),[n.read()]),p=(o,l)=>{var a;return o.f??(o.f={}),(a=o.f)[l]??(a[l]={}),o.f[l]};return{seen(o){let l=i.read().f?.[o]??{};return{session:n.read().f?.[o]?.n??0,lifetime:l.n??0,closedAt:l.c??null,submitted:l.s===1}},subscribed:()=>d().some(o=>o.sub===1),shown(o){n.write(l=>{let a=p(l,o);a.n=(a.n??0)+1}),i.write(l=>{let a=p(l,o);a.n=(a.n??0)+1})},closed(o,l=Date.now()){i.write(a=>{p(a,o).c=l})},tab(o,l){n.write(a=>{let w=p(a,o);l?w.t=1:delete w.t})},tabOut:o=>n.read().f?.[o]?.t===1,pin(o,l){if(l===void 0)return n.read().f?.[o]?.p??null;n.write(a=>{p(a,o).p=l})},coveredAt:()=>n.read().o??null,covered(o=Date.now()){n.write(l=>{l.o=o})},code(o,l=Date.now()){if(o===void 0){let[a]=d().flatMap(w=>w.k?[w.k]:[]).sort((w,b)=>b.at-w.at);return a&&l-a.at<14*864e5?a.c:null}return c().write(a=>{a.k={c:o,at:l}}),o},submitted(o){i.write(l=>{p(l,o).s=1}),c().write(l=>{l.sub=1})}}}var Ge=_("onsite-products.min.js"),z=()=>A(Ge,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.products"));var Be=_("onsite-render.min.js"),ge=()=>A(Be,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render"));var qe=["source","medium","campaign","content","term"];var me=e=>String(e).trim().toLowerCase();function Je(e,s,n){let i=me(e),c=me(n);return s==="is"?i===c:s==="contains"&&c!==""&&i.includes(c)}function we(e,s){return(Array.isArray(e)?e:[]).every(n=>{let i=s?.[n?.field];return!qe.includes(n?.field)||typeof i!="string"?!1:[].concat(n.values??[]).some(c=>Je(i,n.match,c))})}var _e=["popup","sheet","bar","teaser","inline","fullscreen"],Ze=["entry","exit","scroll","time","idle","inline","manual"],ee=e=>e!=="inline",Ae=e=>e==="popup"||e==="sheet"||e==="fullscreen",S=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),k=e=>Array.isArray(e)?e.filter(s=>typeof s=="string"):[],ye=e=>Number.isInteger(e)&&e>=0?e:null,Qe={field:null,match:null,values:[]},et=e=>e==null?[]:Array.isArray(e)&&e.every(S)?e:[Qe];function ve(e){if(!S(e)||typeof e.slot!="string"||e.slot==="")return null;let s=S(e.trigger)?e.trigger:{};if(!_e.includes(e.format)||!Ze.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:k(e.devices),aliases:k(e.aliases),audiences:k(e.audiences),arrived_from:et(e.arrived_from),caps:{per_session:ye(n.per_session),lifetime:ye(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 tt=/^[a-z][a-z0-9_-]{0,31}$/;function Ee(e){if(!S(e)||e.v!==1||!Array.isArray(e.steps))return null;let s=e.steps.filter(n=>S(n)&&tt.test(n.id)&&Array.isArray(n.blocks));return s.length===0?null:{format:_e.includes(e.format)?e.format:null,theme:S(e.theme)?e.theme:{},steps:s}}function be(e,s){let n=String(e).split("*").map(i=>i.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(s)}function nt(e,s){let n=k(e?.include);return(!n.length||n.some(i=>be(i,s)))&&!k(e?.exclude).some(i=>be(i,s))}function xe(e){return e.matchMedia?.("(hover: none) and (pointer: coarse)")?.matches===!0||e.innerWidth<768?"mobile":"desktop"}var Se=e=>typeof e=="string"?Date.parse(e):Number.NaN,F=e=>e.trigger.type==="manual";function te(e,s){let n=[];nt(e.pages,s.path)||n.push("page not included"),e.devices.length&&!e.devices.includes(s.device)&&n.push(`not on ${s.device}`),we(e.arrived_from,s.campaign)||n.push("not from its campaign");let i=Se(e.window.starts_at),c=Se(e.window.ends_at);if((s.now<i||s.now>=c)&&n.push("outside its dates"),e.audiences.length&&!s.preview&&(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||F(e))return n;let{seen:r}=s,{caps:d}=e;return r.submitted&&n.push("already submitted"),e.exclude_subscribed===!0&&s.subscribed&&n.push("already subscribed"),d.per_session!==null&&r.session>=d.per_session&&n.push("per_session cap"),d.lifetime!==null&&r.lifetime>=d.lifetime&&n.push("lifetime cap"),d.after_close_days!==null&&r.closedAt&&s.now-r.closedAt<d.after_close_days*864e5&&n.push("closed recently"),n}var Te=(e,s)=>s.priority-e.priority;var st=["mousemove","pointerdown","keydown","scroll","touchstart","wheel"];function ot(){let e=[];return{on:(i,c,r,d={passive:!0})=>{i.addEventListener(c,r,d),e.push(()=>i.removeEventListener(c,r,d))},later:(i,c)=>{let r=setTimeout(i,c);e.push(()=>clearTimeout(r))},stop:()=>{for(let i of e.splice(0))i()}}}var Ie=(e,s)=>{let n=s.documentElement.scrollHeight||0;return n>0?(e.scrollY+e.innerHeight)/n:0},it=e=>{let s=e.activeElement;return!!(s&&(/^(INPUT|TEXTAREA|SELECT)$/.test(s.tagName)||s.isContentEditable))};function rt({on:e,later:s},n,i,c,r){let d=!1,p=!1,o=null,l=0;s(()=>{d=!0},i.delay_ms??5e3),e(r,"mousemove",a=>{a.clientY>c.innerHeight*.1&&(p=!0),o!==null&&(l=a.clientY-o),o=a.clientY}),e(r,"mouseout",a=>{d&&p&&!a.relatedTarget&&a.clientY<=0&&l<0&&!it(r)&&n("exit")})}function lt({on:e,later:s},n,i,c,r){let d=!1,p=0,o=c.scrollY,l=Date.now(),a=null,w=null;s(()=>{d=!0},i.delay_ms??5e3),e(c,"scroll",()=>{let b=c.scrollY,v=Date.now();if(p=Math.max(p,Ie(c,r)),b<o){(!a||v-a.t>300)&&(a={y:o,t:l});let E=a.y-b;d&&p>=.3&&E>=120&&E/Math.max(1,v-a.t)>=.5&&n("exit_scroll")}else a=null;o=b,l=v}),e(r,"visibilitychange",()=>{r.visibilityState==="hidden"?w=Date.now():w!==null&&Date.now()-w>=1e4&&n("return"),r.visibilityState!=="hidden"&&(w=null)})}function Me(e,s,{device:n,win:i=window,doc:c=document}){let r=ot(),d=(e.seconds??30)*1e3;if(e.type==="entry"&&r.later(()=>s("entry"),e.delay_ms??0),e.type==="time"&&r.later(()=>s("time"),d),e.type==="exit"&&(n==="mobile"?lt:rt)(r,s,e,i,c),e.type==="scroll"){let p=e.depth??.5;r.on(i,"scroll",()=>Ie(i,c)>=p&&s("scroll"))}if(e.type==="idle"){let p=null,o=()=>{clearTimeout(p),p=setTimeout(()=>s("idle"),d)};o();for(let l of st)r.on(l==="scroll"?i:c,l,o);return r.on(c,"visibilitychange",o),()=>{clearTimeout(p),r.stop()}}return r.stop}var at=_("onsite-wheel.min.js"),Ce=()=>A(at,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.wheel"));var Oe=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite-access"),j=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite"),ct=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.pending"),ut=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.listeners"),Pe=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.suppressed"),$e={seen:()=>({session:0,lifetime:0,closedAt:null,submitted:!1}),subscribed:()=>!1,shown(){},closed(){},submitted(){},tab(){},tabOut:()=>!1,pin:()=>null,coveredAt:()=>null,covered(){},code:()=>null},dt=1500,pt=50,ft=300,ht=()=>{try{return new URLSearchParams(location.search).get("hp_debug")==="onsite"}catch{return!1}},gt=e=>Array.isArray(e?.steps)&&e.steps.some(s=>Array.isArray(s?.blocks)&&s.blocks.some(n=>n?.t==="products"));function Ne(e,s={}){if(typeof window>"u"||typeof document>"u")return null;if(window[j])return window[j];let n=typeof e?.[Oe]=="function"?e[Oe]():null;if(!n)return console.warn("[hp] onsite: startOnsite needs the client bootstrap or createAnalytics made"),null;let i=s.settings??n.settings??{},c=de(n,{...s,challenge:i.capture?.challenge}),r=n.preview?$e:he(n.storageKey,n.personalisation),d=()=>n.campaign?.()??null,p=new Map,o=()=>window[Pe]?.size>0,l=(t,u)=>{for(let f of window[ut]?.[t]??[])try{f(u)}catch(g){console.warn(`[hp] onsite ${t} listener failed:`,g)}},a=xe(window),w=n.debug||s.debug===!0||ht(),b=new Map,v=new Map,E=[];for(let t of Array.isArray(i.forms)?i.forms:[]){let u=ve(t);u?E.push(u):b.set(String(t?.slot??`form ${b.size+1}`),{slot:String(t?.slot??""),state:"invalid",reasons:["not a form this SDK can show"]})}let ne=()=>pe().catch(t=>(console.warn("[hp] onsite audiences not loaded:",t?.message??t),null));n.personalisation()&&E.some(t=>t.audiences.length>0)&&ne().then(t=>t?.prefetch(c));let x=new Map,U=new Map,C=null,se=new Set,Re=t=>{for(let u of x.keys()){let f=p.get(u);if(!t||!f||f.modal?.())return u}return null},W=[],V=Number.isInteger(i.overlay_gap_minutes)?i.overlay_gap_minutes:0,De=()=>{let t=r.coveredAt();if(!(V>0)||typeof t!="number")return null;let u=Math.max(0,Math.floor((Date.now()-t)/6e4));return u<V?`a popup showed ${u} min ago; ${V} min between them`:null},N=new Set,K=new Map,m=(t,u,f=[])=>(b.set(t.slot,{slot:t.slot,format:t.format,trigger:t.trigger.type,priority:t.priority,state:u,reasons:f}),w&&console.info(`[hp] onsite ${t.slot}: ${u}${f.length?` (${f.join("; ")})`:""}`),u),oe=()=>{try{let t=s.audiences?.();return Array.isArray(t)?t:null}catch{return null}},ie=t=>({path:location.pathname,device:a,campaign:d(),now:Date.now(),seen:r.seen(t.slot),subscribed:r.subscribed()||s.subscribed?.()===!0,personalisation:n.personalisation(),preview:!!n.preview,audiences:oe()}),G=t=>{v.get(t.slot)?.(),v.delete(t.slot)};function R(t,u,f=!1,g=F(t)){return p.has(t.slot)?Promise.resolve("shown"):(U.has(t.slot)||U.set(t.slot,Le(t,u,f,g).finally(()=>U.delete(t.slot))),U.get(t.slot))}async function Le(t,u,f,g){if(o())return m(t,"not shown",[`suppressed: ${[...window[Pe]].join(", ")}`]);let O=te(t,{...ie(t),...f?{seen:$e.seen()}:{},asked:g});if(O.length)return m(t,"not eligible",O);let T=Ae(t.format)&&!f,Y=T&&!g&&De();if(Y)return m(t,"not shown",[Y]);if(T&&!n.preview&&n.consentAnswered?.()===!1)return K.set(t,g),m(t,"not shown",["waiting for the consent banner"]);let I=ee(t.format),L=I&&Re(g);if(L)return m(t,"not shown",[`${L} is showing`]);if(I&&C&&!g)return m(t,"not shown",[`${C} already showed on this page view`]);let P=null;if(!I){try{P=document.querySelector(t.trigger.selector??"")}catch{P=null}if(!P)return m(t,"not shown",["no element matches its selector"])}I&&x.set(t.slot,t),G(t),m(t,"asking for a decision",[u]);let je=ge().catch(h=>(console.warn("[hp] onsite renderer not loaded:",h?.message??h),null)),H=t.visit_context===!0?z().catch(()=>null):null,q=oe()??[],le=[...new Set([...t.audiences,...q])].filter(h=>q.includes(h)).slice(0,100),Ue=t.audiences.length>0&&!n.preview&&n.personalisation()?await Promise.race([ne().then(h=>h?h.visitAudiences(c,n.sessionSignals,t.audiences,q):le),new Promise(h=>setTimeout(h,dt,le))]):null,$=await c.decide(t.slot,r.pin(t.slot),{visitAudiences:Ue,visitCampaign:t.arrived_from.length?d():null,visitContext:t.visit_context===!0?n.visitContext?.()??null:null}),y=$.status===200?$.body?.decisions?.find(h=>h?.slot===t.slot):null;y?.experiment&&y.arm&&y.split&&r.pin(t.slot,[y.experiment,y.arm,y.split]);let M=y&&y.holdout!==!0?Ee(y.payload):null,ae=M?.steps[0].blocks??[],ce=y?.offer?.code??(n.preview?"PREVIEW":r.code()),We=n.basketValue?.()??null,J=ae.some(h=>h?.t==="code")&&!ce&&"no code to remind of"||ae.some(h=>h?.t==="progress")&&!(We>0)&&"the basket is empty";if(J)return x.delete(t.slot),J==="the basket is empty"&&N.add(t),m(t,"not shown",[J]);if(N.delete(t),!M)return y?.holdout===!0&&n.analytics()&&e.recordExposure($.body),x.delete(t.slot),I&&y?.holdout===!0&&(C??(C=t.slot)),y?.holdout===!0&&!g&&l("held",{slot:t.slot,arm:y.arm??null,format:t.format}),m(t,y?.holdout===!0?"held out":"no decision",[$.status===200?"no creative for this visitor":`decisions answered ${$.status}`]);let Z=await je;if(!Z)return x.delete(t.slot),m(t,"not shown",["the renderer did not load"]);if(gt(M)&&(H??(H=z().catch(()=>null)),!await H))return x.delete(t.slot),m(t,"not shown",["its products did not load"]);if(await Promise.race([Z.warm?.(t,M,M.steps[0].id,se),new Promise(h=>setTimeout(h,ft))]),o())return x.delete(t.slot),m(t,"not shown",["suppressed"]);f||r.shown(t.slot),T&&r.covered(),I&&(C??(C=t.slot));let Q=(h,Ye={})=>l(h,{slot:t.slot,arm:y.arm??null,format:M.format??t.format,...Ye}),Ke=Z.mountForm({form:t,creative:M,decision:y,access:n,client:e,api:c,counters:r,loadWheel:Ce,loadAnswers:ue,loadProducts:()=>H??z(),container:P,warmed:se,coupon:ce,basket:()=>n.basketValue?.()??null,emit:Q,onClose(h){p.delete(t.slot),x.delete(t.slot),m(t,"closed",[h]),Q("closed",{reason:h})}});return p.set(t.slot,Ke),n.analytics()&&e.recordExposure($.body),m(t,"shown",[u]),Q("shown"),"shown"}function B(t,u,f=F(t)){if(!ee(t.format))return R(t,u,!1,f);W.push([t,u,f]),!(W.length>1)&&setTimeout(async()=>{let g=W.sort(([O],[T])=>Te(O,T));W=[];for(let[O,[T,Y,I]]of g.entries()){let L=await R(T,Y,!1,I);if(L==="shown"||L==="held out"){for(let[P]of g.slice(O+1))m(P,"not shown",[`${T.slot} has a higher priority`]);return}}},pt)}for(let t of E){if(t.format==="teaser"&&r.tabOut(t.slot)){R(t,"tab kept from an earlier page",!0);continue}let u=te(t,ie(t));if(u.length){m(t,"not eligible",u);continue}let f=t.trigger.type;f==="manual"?m(t,"waiting for hp.onsite.open"):f==="inline"||t.format==="inline"?R(t,"inline"):re(t)}function re(t){G(t),v.set(t.slot,Me(t.trigger,u=>{G(t),B(t,u)},{device:a})),m(t,"armed",[`${t.trigger.type} on ${a}`])}let ke=n.onConsentAnswered?.(()=>{let t=[...K];K.clear();for(let[u,f]of t)p.has(u.slot)||(f?B(u,"manual",f):re(u))}),Fe=n.onBasket?.(()=>{if(!((n.basketValue?.()??0)>0))return;let t=[...N];N.clear();for(let u of t)p.has(u.slot)||B(u,"the basket changed")}),D=Object.freeze({open(t){let u=E.find(g=>g.slot===t),f=u??E.find(g=>g.aliases.includes(t));return f?p.has(f.slot)?Promise.resolve(!0):R(f,"manual",!1,F(f)||!u).then(g=>g==="shown"):Promise.resolve(!1)},suppress(){for(let[t,u]of p){u.destroy(),p.delete(t),x.delete(t);let f=E.find(g=>g.slot===t);f&&m(f,"closed",["suppressed"])}},debug:()=>[...b.values()].map(t=>({...t,reasons:[...t.reasons]})),stop(){for(let t of v.values())t();v.clear(),Fe?.(),ke?.(),N.clear(),K.clear(),window[j]===D&&delete window[j]}});window[j]=D;for(let{slot:t,resolve:u}of window[ct]?.splice(0)??[])u(D.open(t));return w&&console.table?.(D.debug()),D}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.module")]={startOnsite:Ne};})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thg-agentic/hyper-personalisation-web",
3
- "version": "3.27.0",
3
+ "version": "3.28.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",
@@ -60,6 +60,7 @@
60
60
  "dist/onsite.min.js",
61
61
  "dist/onsite-render.min.js",
62
62
  "dist/onsite-wheel.min.js",
63
+ "dist/onsite-products.min.js",
63
64
  "dist/onsite-answers.min.js",
64
65
  "dist/onsite-audiences.min.js"
65
66
  ],
package/src/index.js CHANGED
@@ -535,11 +535,18 @@ export function createAnalytics(options) {
535
535
  * Noted before the plan, the sample or beforeSend can drop the event.
536
536
  */
537
537
  let pageBasket = null;
538
+ /** The product this page is about: the last Product Viewed it sent, for an onsite form's products. */
539
+ let pageProduct = null;
538
540
  const basketListeners = new Set();
539
541
  /** Told once the consent banner is answered, granted or denied (./onsite). */
540
542
  const consentListeners = new Set();
541
543
 
542
544
  function noteBasket(partial) {
545
+ if (partial.type === 'page') pageProduct = null;
546
+ if (partial.type === 'track' && partial.event === 'Product Viewed') {
547
+ const id = partial.properties?.products?.[0]?.product_id;
548
+ pageProduct = typeof id === 'string' && id ? id : pageProduct;
549
+ }
543
550
  if (partial.type !== 'track' || partial.event !== 'Cart Updated') return;
544
551
  const value = partial.properties?.value;
545
552
  pageBasket =
@@ -1222,6 +1229,32 @@ export function createAnalytics(options) {
1222
1229
  }),
1223
1230
  };
1224
1231
  },
1232
+ /**
1233
+ * The visit's context for a form that shows products (`visit_context`): the page's type and
1234
+ * product, and only under personalisation consent the basket's product ids and the visit's
1235
+ * views, 20 of each, newest first. Sent with that form's decision request only.
1236
+ */
1237
+ visitContext: () => {
1238
+ const personal = personalisationGranted();
1239
+ if (personal) scopeVisit();
1240
+ const signals = personal ? getSessionSignals() : null;
1241
+ const ids = (list) =>
1242
+ Array.isArray(list)
1243
+ ? list
1244
+ .filter((id) => typeof id === 'string' && id.length <= 128)
1245
+ .slice(0, 20)
1246
+ : [];
1247
+ return {
1248
+ ...(cfg.pageType ? { page_type: cfg.pageType } : {}),
1249
+ ...(pageProduct ? { product_id: pageProduct } : {}),
1250
+ ...(signals
1251
+ ? {
1252
+ basket: ids(signals.basketProducts),
1253
+ viewed: ids(signals.recentProducts),
1254
+ }
1255
+ : {}),
1256
+ };
1257
+ },
1225
1258
  /** Calls `listener` whenever the page reports its basket; answers how to stop. */
1226
1259
  onBasket: (listener) => {
1227
1260
  basketListeners.add(listener);
package/src/onsite/api.js CHANGED
@@ -64,9 +64,10 @@ export function createApi(access, options = {}) {
64
64
  * The decision for one slot, as the page's other serving calls ask for it, with its pin and
65
65
  * what the browser knows of the visit: for a form limited to audiences, `visitAudiences`, the
66
66
  * session audiences it meets; for a form that names a campaign, `visitCampaign`, the campaign
67
- * the visit arrived from. The server holds either form back unless its rules hold.
67
+ * the visit arrived from. The server holds either form back unless its rules hold. For a form
68
+ * that shows products, `visitContext`: the page and the visit its products are filled from.
68
69
  */
69
- decide: (slot, pin, { visitAudiences, visitCampaign } = {}) =>
70
+ decide: (slot, pin, { visitAudiences, visitCampaign, visitContext } = {}) =>
70
71
  call(`${serving}/v1/decisions`, {
71
72
  method: 'POST',
72
73
  consent: true,
@@ -86,6 +87,7 @@ export function createApi(access, options = {}) {
86
87
  ...(access.preview ? { preview: access.preview } : {}),
87
88
  ...(visitAudiences ? { visit_audiences: visitAudiences } : {}),
88
89
  ...(visitCampaign ? { visit_campaign: visitCampaign } : {}),
90
+ ...(visitContext ? { visit_context: visitContext } : {}),
89
91
  },
90
92
  }),
91
93
  /** The property's audience definitions: the same for everybody, so no consent header. */
@@ -21,6 +21,7 @@ import { loadAnswers } from './answers-loader.js';
21
21
  import { createApi } from './api.js';
22
22
  import { loadAudiences } from './audiences-loader.js';
23
23
  import { createCounters } from './counters.js';
24
+ import { loadProducts } from './products-loader.js';
24
25
  import { loadRender } from './render-loader.js';
25
26
  import {
26
27
  ASKED,
@@ -79,6 +80,15 @@ const debugParam = () => {
79
80
  }
80
81
  };
81
82
 
83
+ /** Whether a creative shows a products block on any step. */
84
+ const showsProducts = (creative) =>
85
+ Array.isArray(creative?.steps) &&
86
+ creative.steps.some(
87
+ (step) =>
88
+ Array.isArray(step?.blocks) &&
89
+ step.blocks.some((block) => block?.t === 'products'),
90
+ );
91
+
82
92
  /**
83
93
  * Start onsite forms for `client`, once per page. Returns the controller, or null without a
84
94
  * browser or a client from this SDK.
@@ -308,6 +318,9 @@ export function startOnsite(client, options = {}) {
308
318
  console.warn('[hp] onsite renderer not loaded:', err?.message ?? err);
309
319
  return null;
310
320
  });
321
+ // A form that shows products has their cards fetched beside the renderer too.
322
+ let cards =
323
+ form.visit_context === true ? loadProducts().catch(() => null) : null;
311
324
  // The server decides a limited form's audiences; the browser tells it which session rules hold,
312
325
  // and which the page gave. Within CLAIMS_MS, else only the page's: the server decides from what
313
326
  // it holds.
@@ -336,6 +349,9 @@ export function startOnsite(client, options = {}) {
336
349
  const res = await api.decide(form.slot, counters.pin(form.slot), {
337
350
  visitAudiences: claimed,
338
351
  visitCampaign: form.arrived_from.length ? campaign() : null,
352
+ // Only for a form whose products are filled from it; never kept or logged by the server.
353
+ visitContext:
354
+ form.visit_context === true ? (access.visitContext?.() ?? null) : null,
339
355
  });
340
356
  const decision =
341
357
  res.status === 200
@@ -400,6 +416,14 @@ export function startOnsite(client, options = {}) {
400
416
  covering.delete(form.slot);
401
417
  return note(form, 'not shown', ['the renderer did not load']);
402
418
  }
419
+ // Its products are drawn by their own chunk: without it the form would open on an empty block.
420
+ if (showsProducts(creative)) {
421
+ cards ??= loadProducts().catch(() => null);
422
+ if (!(await cards)) {
423
+ covering.delete(form.slot);
424
+ return note(form, 'not shown', ['its products did not load']);
425
+ }
426
+ }
403
427
  // Its first step's pictures fetched and decoded first, so it never opens on an empty one, and
404
428
  // never waits for them longer than WARM_MS.
405
429
  await Promise.race([
@@ -430,6 +454,7 @@ export function startOnsite(client, options = {}) {
430
454
  counters,
431
455
  loadWheel,
432
456
  loadAnswers,
457
+ loadProducts: () => cards ?? loadProducts(),
433
458
  container,
434
459
  warmed,
435
460
  coupon,
@@ -7,6 +7,7 @@
7
7
  */
8
8
 
9
9
  import { answerFields, answerOf } from './answers.js';
10
+ import { mountProducts } from './products.js';
10
11
  import { mountForm } from './render.js';
11
12
  import { readCreative } from './rules.js';
12
13
  import { mountWheel } from './wheel.js';
@@ -67,6 +68,7 @@ export function mountPreview(host, creative, options = {}) {
67
68
  counters: inert,
68
69
  loadWheel: () => Promise.resolve({ mountWheel }),
69
70
  loadAnswers: () => Promise.resolve({ answerFields, answerOf }),
71
+ loadProducts: () => Promise.resolve({ mountProducts }),
70
72
  basket: () =>
71
73
  Number.isFinite(opts.basketValue) ? opts.basketValue : SAMPLE_BASKET,
72
74
  container: host,
@@ -0,0 +1,6 @@
1
+ /**
2
+ * A products block's cards, only for a form that shows them: a bundler splits this import out of
3
+ * ./onsite, and the CDN build swaps this module for cdn/products-loader.js, which loads
4
+ * dist/onsite-products.min.js.
5
+ */
6
+ export const loadProducts = () => import('./products.js');