@thg-agentic/hyper-personalisation-web 3.30.0 → 3.32.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
- (()=>{var M=Array.from({length:11},(n,e)=>e/10);function F(n,e){if(!n.isIntersecting)return!1;let{intersectionRect:s,boundingClientRect:r,rootBounds:c}=n;if(!s||!r)return!0;let f=s.width*s.height,a=r.width*r.height,u=c?Math.min(a,c.width*c.height):a;return u>0&&f/u>=e}function R(n){let{selector:e,onViewable:s,visibleRatio:r=.5,dwellMs:c=1e3,root:f=document}=n,a=new Map,u=new WeakSet,l=new Set,p=i=>{a.has(i)||a.set(i,setTimeout(()=>{a.delete(i),s(i)&&(h?.unobserve(i),l.delete(i))},c))},d=i=>{clearTimeout(a.get(i)),a.delete(i)},h=typeof IntersectionObserver>"u"?null:new IntersectionObserver(i=>{for(let E of i){let o=E.target;if(!F(E,r)){l.delete(o),d(o);continue}l.add(o),b()&&p(o)}},{threshold:M}),b=()=>typeof document>"u"||document.visibilityState!=="hidden",x=()=>{if(b())for(let i of l)p(i);else for(let i of l)d(i)};document.addEventListener("visibilitychange",x);let y=()=>{for(let i of f.querySelectorAll(e))u.has(i)||(u.add(i),h?.observe(i))},_=typeof MutationObserver>"u"?null:new MutationObserver(()=>y()),v=()=>{y(),_?.observe(f===document?document.body:f,{childList:!0,subtree:!0})},w=f===document&&!document.body;return w?document.addEventListener("DOMContentLoaded",v,{once:!0}):v(),()=>{w&&document.removeEventListener("DOMContentLoaded",v),document.removeEventListener("visibilitychange",x),h?.disconnect(),_?.disconnect();for(let i of a.values())clearTimeout(i);a.clear(),l.clear()}}function T(n){if(typeof n!="string")return null;try{let e=new URL(n);return e.protocol==="https:"?e.href:null}catch{return null}}var O=n=>n!==null&&typeof n=="object"&&!Array.isArray(n);var P=`.pr ul{list-style:none;margin:0;padding:0;display:grid;gap:12px}
1
+ (()=>{var P=Array.from({length:11},(t,e)=>e/10);function F(t,e){if(!t.isIntersecting)return!1;let{intersectionRect:s,boundingClientRect:n,rootBounds:c}=t;if(!s||!n)return!0;let f=s.width*s.height,a=n.width*n.height,u=c?Math.min(a,c.width*c.height):a;return u>0&&f/u>=e}function R(t){let{selector:e,onViewable:s,visibleRatio:n=.5,dwellMs:c=1e3,root:f=document}=t,a=new Map,u=new WeakSet,l=new Set,p=i=>{a.has(i)||a.set(i,setTimeout(()=>{a.delete(i),s(i)&&(h?.unobserve(i),l.delete(i))},c))},d=i=>{clearTimeout(a.get(i)),a.delete(i)},h=typeof IntersectionObserver>"u"?null:new IntersectionObserver(i=>{for(let E of i){let o=E.target;if(!F(E,n)){l.delete(o),d(o);continue}l.add(o),b()&&p(o)}},{threshold:P}),b=()=>typeof document>"u"||document.visibilityState!=="hidden",_=()=>{if(b())for(let i of l)p(i);else for(let i of l)d(i)};document.addEventListener("visibilitychange",_);let y=()=>{for(let i of f.querySelectorAll(e))u.has(i)||(u.add(i),h?.observe(i))},x=typeof MutationObserver>"u"?null:new MutationObserver(()=>y()),v=()=>{y(),x?.observe(f===document?document.body:f,{childList:!0,subtree:!0})},w=f===document&&!document.body;return w?document.addEventListener("DOMContentLoaded",v,{once:!0}):v(),()=>{w&&document.removeEventListener("DOMContentLoaded",v),document.removeEventListener("visibilitychange",_),h?.disconnect(),x?.disconnect();for(let i of a.values())clearTimeout(i);a.clear(),l.clear()}}function $(t,e){try{return new Intl.NumberFormat(t||void 0,{style:"currency",currency:e})}catch{return null}}function T(t){if(typeof t!="string")return null;try{let e=new URL(t);return e.protocol==="https:"?e.href:null}catch{return null}}var D=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);var C=`.pr ul{list-style:none;margin:0;padding:0;display:grid;gap:12px}
2
2
  .pr-c ul{grid-auto-flow:column;grid-auto-columns:minmax(132px,42%);overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;padding-bottom:6px;overscroll-behavior-x:contain}
3
3
  .pr-c li{scroll-snap-align:start}
4
4
  .pr-g ul{grid-template-columns:repeat(auto-fill,minmax(132px,1fr))}
@@ -19,4 +19,4 @@
19
19
  .ar+.ar{left:auto;right:-6px}
20
20
  .ar[aria-disabled=true]{opacity:.35;cursor:default}
21
21
  .mob .ar,.pr-f .ar{display:none}
22
- @media (prefers-reduced-motion:reduce){.pr-c ul{scroll-behavior:auto}}`,C=["left","center","right"];function z(n,e){try{let s=new Intl.NumberFormat(n||void 0,{style:"currency",currency:e});return r=>s.format(r)}catch{return s=>s.toFixed(2)}}function $(n,e,s){let{el:r}=s,c=O(e.served)?e.served:{},f=Number.isInteger(e.limit)?Math.min(Math.max(e.limit,1),12):4,a=(Array.isArray(c.products)?c.products:[]).filter(o=>O(o)&&typeof o.product_id=="string"&&T(o.url)).slice(0,f);if(a.length===0)return;let u=O(e.show)?e.show:{},l=e.layout==="grid";n.classList.add(l?"pr-g":"pr-c"),C.includes(e.align)&&n.classList.add(`a-${e.align}`),l||(n.setAttribute("role","region"),n.setAttribute("aria-label","Products"));let p=r("style");p.textContent=P;let d=r("ul");d.setAttribute("role","list");let h=(o,t)=>({product_id:o.product_id,...typeof o.name=="string"?{name:o.name}:{},...Number.isFinite(o.price)?{price:o.price}:{},position:t}),b=typeof c.recommendation_request_id=="string"&&!s.preview?s.client:null,x=new Map,y=c.recommendation_request_id,_=s.seen??new Set,v=null,w=()=>{clearTimeout(v),!(!b||_.has(y))&&(_.add(y),b.recommendationsViewed({recommendation_request_id:y,placement:c.placement||s.placement,strategy:c.strategy||c.recipe||e.source,recipe:c.recipe??null,algorithm_version:c.algorithm_version??null,products:a.map((o,t)=>h(o,t+1)),viewable:[...x.values()].sort((o,t)=>o.position-t.position)}))};for(let[o,t]of a.entries()){let L=o+1,S=r("li","pc");S.dataset.hpProduct=t.product_id,S.dataset.hpPosition=String(L);let g=r("a","pa"),D=typeof t.name=="string"?t.name:"",I=T(t.image);if(I){let m=r("img","pi");m.alt=u.name===!1?D:"",m.loading="lazy",m.decoding="async",m.src=I;let A=r("span","pf");A.append(m),g.append(A)}else g.append(r("span","pf e"));if(u.name!==!1&&g.append(r("span","pn",D)),u.price!==!1&&Number.isFinite(t.price)){let m=z(s.lang,t.currency),A=r("span","pp");if(A.append(r("span","",m(t.price))),Number.isFinite(t.compare_at_price)&&t.compare_at_price>t.price){let N=r("s","",m(t.compare_at_price));N.setAttribute("aria-label",`was ${m(t.compare_at_price)}`),A.append(" ",N)}g.append(A)}u.name===!1&&!I&&g.setAttribute("aria-label",D||t.product_id),typeof e.button=="string"&&e.button&&g.append(r("span","btn bs pb",e.button)),g.href=T(t.url),g.rel="noopener",g.addEventListener("click",m=>{if(s.preview)return m.preventDefault();w(),b?.productClicked({recommendation_request_id:c.recommendation_request_id,interaction:"navigate",products:[h(t,L)]}),s.engaged("click",void 0,{position:L,products:[h(t,L)]})}),S.append(g),d.append(S)}n.append(p,d);let i=l?null:q(n,d,r),E=b&&!_.has(y)&&R({selector:"[data-hp-product]",root:s.root,onViewable(o){let t=Number(o.dataset.hpPosition);return x.has(t)||x.set(t,{position:t,product_id:o.dataset.hpProduct,viewable_at:new Date().toISOString()}),v??(v=setTimeout(w,0)),!0}});return()=>{i?.disconnect(),E&&E()}}function q(n,e,s){let r=["Previous","Next"].map((u,l)=>{let p=s("button","ar",l?"\u203A":"\u2039");return p.type="button",p.setAttribute("aria-label",`${u} products`),p.addEventListener("click",()=>e.scrollBy({left:(l?1:-1)*e.clientWidth})),e.before(p),p}),c="",f=()=>{let u=e.scrollWidth-e.clientWidth,l=e.scrollLeft,p=e.firstElementChild?.offsetWidth??0,d=[u<2,l<2,l>u-2,p];`${d}`!==c&&(c=`${d}`,n.classList.toggle("pr-f",d[0]),n.style.setProperty("--ph",`${p}px`),r[0].setAttribute("aria-disabled",String(d[1])),r[1].setAttribute("aria-disabled",String(d[2])))};e.addEventListener("scroll",f,{passive:!0}),f();let a=globalThis.ResizeObserver&&new ResizeObserver(f);return a?.observe(e),a}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.products")]={mountProducts:$};})();
22
+ @media (prefers-reduced-motion:reduce){.pr-c ul{scroll-behavior:auto}}`,z=["left","center","right"];function q(t,e){let s=$(t,e);return s?n=>s.format(n):n=>n.toFixed(2)}function M(t,e,s){let{el:n}=s,c=D(e.served)?e.served:{},f=Number.isInteger(e.limit)?Math.min(Math.max(e.limit,1),12):4,a=(Array.isArray(c.products)?c.products:[]).filter(o=>D(o)&&typeof o.product_id=="string"&&T(o.url)).slice(0,f);if(a.length===0)return;let u=D(e.show)?e.show:{},l=e.layout==="grid";t.classList.add(l?"pr-g":"pr-c"),z.includes(e.align)&&t.classList.add(`a-${e.align}`),l||(t.setAttribute("role","region"),t.setAttribute("aria-label","Products"));let p=n("style");p.textContent=C;let d=n("ul");d.setAttribute("role","list");let h=(o,r)=>({product_id:o.product_id,...typeof o.name=="string"?{name:o.name}:{},...Number.isFinite(o.price)?{price:o.price}:{},position:r}),b=typeof c.recommendation_request_id=="string"&&!s.preview?s.client:null,_=new Map,y=c.recommendation_request_id,x=s.seen??new Set,v=null,w=()=>{clearTimeout(v),!(!b||x.has(y))&&(x.add(y),b.recommendationsViewed({recommendation_request_id:y,placement:c.placement||s.placement,strategy:c.strategy||c.recipe||e.source,recipe:c.recipe??null,algorithm_version:c.algorithm_version??null,products:a.map((o,r)=>h(o,r+1)),viewable:[..._.values()].sort((o,r)=>o.position-r.position)}))};for(let[o,r]of a.entries()){let L=o+1,S=n("li","pc");S.dataset.hpProduct=r.product_id,S.dataset.hpPosition=String(L);let g=n("a","pa"),O=typeof r.name=="string"?r.name:"",I=T(r.image);if(I){let m=n("img","pi");m.alt=u.name===!1?O:"",m.loading="lazy",m.decoding="async",m.src=I;let A=n("span","pf");A.append(m),g.append(A)}else g.append(n("span","pf e"));if(u.name!==!1&&g.append(n("span","pn",O)),u.price!==!1&&Number.isFinite(r.price)){let m=q(s.lang,r.currency),A=n("span","pp");if(A.append(n("span","",m(r.price))),Number.isFinite(r.compare_at_price)&&r.compare_at_price>r.price){let N=n("s","",m(r.compare_at_price));N.setAttribute("aria-label",`was ${m(r.compare_at_price)}`),A.append(" ",N)}g.append(A)}u.name===!1&&!I&&g.setAttribute("aria-label",O||r.product_id),typeof e.button=="string"&&e.button&&g.append(n("span","btn bs pb",e.button)),g.href=T(r.url),g.rel="noopener",g.addEventListener("click",m=>{if(s.preview)return m.preventDefault();w(),b?.productClicked({recommendation_request_id:c.recommendation_request_id,interaction:"navigate",products:[h(r,L)]}),s.engaged("click",void 0,{position:L,products:[h(r,L)]})}),S.append(g),d.append(S)}t.append(p,d);let i=l?null:V(t,d,n),E=b&&!x.has(y)&&R({selector:"[data-hp-product]",root:s.root,onViewable(o){let r=Number(o.dataset.hpPosition);return _.has(r)||_.set(r,{position:r,product_id:o.dataset.hpProduct,viewable_at:new Date().toISOString()}),v??(v=setTimeout(w,0)),!0}});return()=>{i?.disconnect(),E&&E()}}function V(t,e,s){let n=["Previous","Next"].map((u,l)=>{let p=s("button","ar",l?"\u203A":"\u2039");return p.type="button",p.setAttribute("aria-label",`${u} products`),p.addEventListener("click",()=>e.scrollBy({left:(l?1:-1)*e.clientWidth})),e.before(p),p}),c="",f=()=>{let u=e.scrollWidth-e.clientWidth,l=e.scrollLeft,p=e.firstElementChild?.offsetWidth??0,d=[u<2,l<2,l>u-2,p];`${d}`!==c&&(c=`${d}`,t.classList.toggle("pr-f",d[0]),t.style.setProperty("--ph",`${p}px`),n[0].setAttribute("aria-disabled",String(d[1])),n[1].setAttribute("aria-disabled",String(d[2])))};e.addEventListener("scroll",f,{passive:!0}),f();let a=globalThis.ResizeObserver&&new ResizeObserver(f);return a?.observe(e),a}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.products")]={mountProducts:M};})();
@@ -1,4 +1,4 @@
1
- (()=>{async function Be(o,r,a){let l=b=>Array.from(new Uint8Array(b),w=>w.toString(16).padStart(2,"0")).join(""),p=new TextEncoder,x=o.maxnumber??1e6;for(let b=0;b<=x;b+=256){let w=[];for(let C=b;C<b+256&&C<=x;C++)w.push(crypto.subtle.digest("SHA-256",p.encode(o.salt+C)));let h=(await Promise.all(w)).findIndex(C=>l(C)===o.challenge);if(h>=0)return b+h;if(r&&await r(),a?.aborted)return null}return null}var Ct=()=>globalThis.scheduler?.postTask?.(()=>{},{priority:"user-visible"})??new Promise(o=>setTimeout(o,0)),He=(o,r)=>Be(o,Ct,r);function Tt(o,r){let a=`onmessage=async(e)=>postMessage(await(${Be})(e.data))`,l=URL.createObjectURL(new Blob([a],{type:"text/javascript"}));return new Promise((p,x)=>{let b;try{b=new Worker(l)}catch(h){URL.revokeObjectURL(l),x(h);return}let w=(h,C)=>{b.terminate(),URL.revokeObjectURL(l),h(C)};r.addEventListener("abort",()=>w(p,null),{once:!0}),b.onmessage=h=>w(p,h.data),b.onerror=h=>{h.preventDefault?.(),w(x,h)},b.postMessage({challenge:o.challenge,salt:o.salt,maxnumber:o.maxnumber})})}var Lt=o=>o&&o.algorithm==="SHA-256"&&typeof o.challenge=="string"&&typeof o.salt=="string"&&typeof o.signature=="string";async function Ge(o){if(!Lt(o)||typeof crypto?.subtle?.digest!="function")return null;let r=Date.now(),a=new AbortController,l,p=new Promise(w=>{l=setTimeout(()=>w(null),2e4)}),x=typeof Worker=="function"&&typeof Blob=="function"?Tt(o,a.signal).catch(()=>He(o,a.signal)):He(o,a.signal),b=await Promise.race([x,p]);return clearTimeout(l),a.abort(),typeof b!="number"?null:btoa(JSON.stringify({algorithm:o.algorithm,challenge:o.challenge,number:b,salt:o.salt,signature:o.signature,took:Date.now()-r}))}function X(o){if(typeof o!="string")return null;try{let r=new URL(o);return r.protocol==="https:"?r.href:null}catch{return null}}function K(o){if(typeof o!="string")return null;try{let r=new URL(o);return r.protocol==="https:"||r.protocol==="http:"&&r.hostname==="localhost"?r.href:null}catch{return null}}function be(o,r,a,l){if(typeof r=="string"){o.append(a.createTextNode(r));return}if(l>6||r===null)return;if(Array.isArray(r)){for(let w of r)be(o,w,a,l+1);return}if(typeof r!="object")return;let p="b"in r?"b":"i"in r?"i":"a"in r?"a":null;if(!p)return;let x=p==="a"?X(r.href):null,b=p==="a"&&!x?o:a.createElement(p);x&&(b.setAttribute("href",x),b.setAttribute("rel","noopener")),be(b,r[p],a,l+1),b!==o&&o.append(b)}function Ve(o,r=document){let a=r.createDocumentFragment();return be(a,o,r,0),a}var M=o=>o!==null&&typeof o=="object"&&!Array.isArray(o);function ee(o,r,a){if(typeof a=="string"&&a)return a;let l=M(o?.next?.answers)?o.next.answers:{};for(let p of o?.blocks??[])for(let x of r[p?.question]??[]){let b=l[`${p.question}=${x}`];if(typeof b=="string")return b}return typeof o?.next?.default=="string"?o.next.default:null}var ge={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 Xe(o,r){let a=String(o??"").replace(/[\s.()-]/g,"");a.startsWith("00")&&(a=`+${a.slice(2)}`);let l=ge[String(r??"").toUpperCase()];return!a.startsWith("+")&&l&&(a=`+${l}${a.replace(/^0/,"")}`),/^\+[1-9]\d{7,14}$/.test(a)?a:null}var Ke=o=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(o);function xe(o,r,a,l,p){let x=o("select","i");x.setAttribute("aria-label",r);for(let[b,w]of[["",a],...l]){let h=o("option","",w);h.value=b,h.selected=b===p,x.append(h)}return x}var Ze=o=>{let r=o.options.length;return r<=4?r:r%4?3:4};var ve={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'},ye="cubic-bezier(.16,1,.3,1)",we=`
1
+ (()=>{async function Be(o,r,a){let l=b=>Array.from(new Uint8Array(b),w=>w.toString(16).padStart(2,"0")).join(""),p=new TextEncoder,x=o.maxnumber??1e6;for(let b=0;b<=x;b+=256){let w=[];for(let C=b;C<b+256&&C<=x;C++)w.push(crypto.subtle.digest("SHA-256",p.encode(o.salt+C)));let h=(await Promise.all(w)).findIndex(C=>l(C)===o.challenge);if(h>=0)return b+h;if(r&&await r(),a?.aborted)return null}return null}var Ct=()=>globalThis.scheduler?.postTask?.(()=>{},{priority:"user-visible"})??new Promise(o=>setTimeout(o,0)),He=(o,r)=>Be(o,Ct,r);function Tt(o,r){let a=`onmessage=async(e)=>postMessage(await(${Be})(e.data))`,l=URL.createObjectURL(new Blob([a],{type:"text/javascript"}));return new Promise((p,x)=>{let b;try{b=new Worker(l)}catch(h){URL.revokeObjectURL(l),x(h);return}let w=(h,C)=>{b.terminate(),URL.revokeObjectURL(l),h(C)};r.addEventListener("abort",()=>w(p,null),{once:!0}),b.onmessage=h=>w(p,h.data),b.onerror=h=>{h.preventDefault?.(),w(x,h)},b.postMessage({challenge:o.challenge,salt:o.salt,maxnumber:o.maxnumber})})}var Lt=o=>o&&o.algorithm==="SHA-256"&&typeof o.challenge=="string"&&typeof o.salt=="string"&&typeof o.signature=="string";async function Ve(o){if(!Lt(o)||typeof crypto?.subtle?.digest!="function")return null;let r=Date.now(),a=new AbortController,l,p=new Promise(w=>{l=setTimeout(()=>w(null),2e4)}),x=typeof Worker=="function"&&typeof Blob=="function"?Tt(o,a.signal).catch(()=>He(o,a.signal)):He(o,a.signal),b=await Promise.race([x,p]);return clearTimeout(l),a.abort(),typeof b!="number"?null:btoa(JSON.stringify({algorithm:o.algorithm,challenge:o.challenge,number:b,salt:o.salt,signature:o.signature,took:Date.now()-r}))}function X(o){if(typeof o!="string")return null;try{let r=new URL(o);return r.protocol==="https:"?r.href:null}catch{return null}}function K(o){if(typeof o!="string")return null;try{let r=new URL(o);return r.protocol==="https:"||r.protocol==="http:"&&r.hostname==="localhost"?r.href:null}catch{return null}}function be(o,r,a,l){if(typeof r=="string"){o.append(a.createTextNode(r));return}if(l>6||r===null)return;if(Array.isArray(r)){for(let w of r)be(o,w,a,l+1);return}if(typeof r!="object")return;let p="b"in r?"b":"i"in r?"i":"a"in r?"a":null;if(!p)return;let x=p==="a"?X(r.href):null,b=p==="a"&&!x?o:a.createElement(p);x&&(b.setAttribute("href",x),b.setAttribute("rel","noopener")),be(b,r[p],a,l+1),b!==o&&o.append(b)}function Ge(o,r=document){let a=r.createDocumentFragment();return be(a,o,r,0),a}var M=o=>o!==null&&typeof o=="object"&&!Array.isArray(o);function ee(o,r,a){if(typeof a=="string"&&a)return a;let l=M(o?.next?.answers)?o.next.answers:{};for(let p of o?.blocks??[])for(let x of r[p?.question]??[]){let b=l[`${p.question}=${x}`];if(typeof b=="string")return b}return typeof o?.next?.default=="string"?o.next.default:null}var ge={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 Xe(o,r){let a=String(o??"").replace(/[\s.()-]/g,"");a.startsWith("00")&&(a=`+${a.slice(2)}`);let l=ge[String(r??"").toUpperCase()];return!a.startsWith("+")&&l&&(a=`+${l}${a.replace(/^0/,"")}`),/^\+[1-9]\d{7,14}$/.test(a)?a:null}var Ke=o=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(o);function xe(o,r,a,l,p){let x=o("select","i");x.setAttribute("aria-label",r);for(let[b,w]of[["",a],...l]){let h=o("option","",w);h.value=b,h.selected=b===p,x.append(h)}return x}var Ze=o=>{let r=o.options.length;return r<=4?r:r%4?3:4};var ve={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'},ye="cubic-bezier(.16,1,.3,1)",we=`
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}
@@ -178,4 +178,4 @@ hr{width:100%;margin:4px 0;border:0;border-top:1px solid var(--ln)}
178
178
  @keyframes hp-down{from{transform:translateY(-100%)}}
179
179
  @keyframes hp-out{to{opacity:0;transform:translateY(12px) scale(.98)}}
180
180
  @media (prefers-reduced-motion:reduce){.s .w,.s .ov,.f>*{animation:hp-fade .15s ease both!important}.btn{transition:none}}
181
- `;var Ot=/^#(?:[0-9a-f]{3}){1,2}$/i,Je=["popup","fullscreen"],Mt=["ok","verify","already"],It=["stack","split","overlay","image-only"],Qe={bar:["bottom","top"],sheet:["bottom-right","bottom-left","bottom"],teaser:["bottom-left","bottom-right","left","right"]},Pt=["xs","sm","md","lg","xl","display"],et={xs:4,sm:8,md:16,lg:28,xl:44},tt={sm:380,md:480,lg:880},qt=["left","center","right"],nt={secondary:" b2",link:" no"},Nt=220,jt=["verify","already","held","fallback","success"],Rt=[500,1500],Dt=600,Ut=1800,S={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"},H=(o,r,a)=>o.includes(r)?r:a,I=(o,r,a)=>Number.isFinite(o)?Math.min(Math.max(o,r),a):null,ke=o=>o.type==="date"||o.type==="number",Ae=()=>globalThis.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches===!0;function rt(o){let r=M(o.layout)?o.layout:{},a=M(r.media)?r.media:null,l=H(It,r.template,"stack"),p=a?.side==="right"?"right":"left";return!a&&M(r.image)&&r.image.side!=="none"&&(a=r.image,r.image.side!=="top"&&(l="split",p=r.image.side==="right"?"right":"left")),(!a||!K(a.asset))&&(a=null,l="stack"),{template:l,media:a,side:p,scrim:I(r.scrim,0,.9)??.45,padding:H(["none","sm","md","lg"],r.padding,"md")}}var st=(o,r)=>H(["sm","md","lg","full"],o.size,null)??(r.template==="split"||r.template==="overlay"?"lg":"md"),at=(o,r,a=1,l="100vw")=>{if(o==="fullscreen"||r==="full")return l;let p=o==="teaser"?220:o==="sheet"?400:tt[r]??tt.md;return`(max-width: 639px) ${l}, ${Math.round(p*a)}px`},lt=(o,r)=>o==="lg"?1/Ze(r):.5,ct=(o,r,a)=>{if(!a||!Array.isArray(o.widths)||!r.endsWith(".webp"))return null;let l=o.widths.filter(p=>Number.isInteger(p)&&p>0&&p<a).sort((p,x)=>p-x);return l.length===0?null:[...l.map(p=>`${r.slice(0,-5)}-${p}w.webp ${p}w`),`${r} ${a}w`].join(",")},dt=(o,r)=>o.format==="inline"?"inline":r.format&&r.format!=="inline"?r.format:o.format,Ee=o=>o.kind==="video"||o.t==="video",$e={webm:"video/webm",mp4:"video/mp4",m4v:"video/mp4",mov:"video/quicktime",ogv:"video/ogg"},_e=o=>$e[o.split(/[?#]/)[0].split(".").pop().toLowerCase()],Wt=(o,r)=>[...new Set([r,...Array.isArray(o.sources)?o.sources.map(K):[]])].filter(Boolean).sort((a,l)=>(_e(l)===$e.webm)-(_e(a)===$e.webm));function ze(o,r,a,l=new Set){let p=r.steps.find(v=>v.id===a);if(!p)return Promise.resolve();let x=dt(o,r),b=rt(p),w=x==="teaser"&&p===r.steps[0],h=x==="teaser"&&!w?"popup":x,C=st(r.theme,b),$=w?[]:p.blocks.flatMap(v=>{if(v?.t==="image"||v?.t==="video")return[[v]];let W=v?.display==="cards"&&o.questions.find(T=>T.key===v.question&&T.type==="one");return W?Object.values(v.pictures??{}).filter(M).map(T=>[T,lt(C,W),"50vw"]):[]});return b.media&&!(w&&b.template!=="image-only")&&$.push([b.media,b.template==="split"?.46:1]),Promise.all($.map(([v,W,T])=>{let L=K(Ee(v)?v.poster:v.asset);if(!L)return null;let j=document.createElement("img"),y=!Ee(v)&&ct(v,L,I(v.width,1,8192));y&&(j.sizes=at(h,C,W,T),j.srcset=y);let Z=`${j.sizes} ${y||L}`;return l.has(Z)?null:(l.add(Z),j.src=L,j.decode?.().catch(()=>{}))}))}var it=o=>o?.call?o():clearInterval(o),Ft=0,Se=o=>`hp-${o}-${++Ft}`;function d(o,r,a){let l=document.createElement(o);return r&&(l.className=r),a!==void 0&&l.append(Ve(a)),l}var pt=o=>{let r=o.length===4?[...o.slice(1)].map(a=>a+a).join(""):o.slice(1);return[0,2,4].map(a=>Number.parseInt(r.slice(a,a+2),16))},te=o=>{let[r,a,l]=pt(o).map(p=>{let x=p/255;return x<=.04045?x/12.92:((x+.055)/1.055)**2.4});return .2126*r+.7152*a+.0722*l},ot=(o,r=4.5)=>{let a=te(o)+.05,l=1.05/a;return l>=r?"#fff":a/(te("#111")+.05)>l?"#111":"#fff"};function Yt(o,r){let a=($,v)=>v&&o.style.setProperty($,v),l=$=>Ot.test($??"")?$:null;a("--hp-accent",l(r.accent)),a("--hp-bg",l(r.background)),a("--hp-text",l(r.text));let p=I(r.radius,0,48);p!==null&&a("--hp-radius",`${p}px`),a("--hp-font",r.font==="site"?o.ownerDocument.defaultView.getComputedStyle(o.parentElement??o.ownerDocument.body).fontFamily:Object.hasOwn(ve,r.font)?ve[r.font]:null),l(r.accent)&&(a("--hp-on-accent",ot(r.accent,3)),a("--hp-on-accent-text",ot(r.accent))),l(r.background)&&te(r.background)<.18&&(a("--hp-field","#fff"),a("--hp-field-text","#111"));let x=M(r.overlay)?r.overlay:{},b=[l(r.text),l(r.background)].filter(Boolean).sort(($,v)=>te($)-te(v))[0],[w,h,C]=pt(l(x.colour)??b??"#0b0b0f");a("--hp-ov",`rgb(${w} ${h} ${C} / ${I(x.opacity,0,1)??.6})`)}function Ht(o){try{let r=new CSSStyleSheet;r.replaceSync(we),o.adoptedStyleSheets=[r]}catch{let r=document.createElement("style");r.textContent=we,o.append(r)}}function ut(o){let{form:r,creative:a,decision:l,access:p,client:x,api:b,counters:w}=o,h=o.preview??null,C=e=>{let t=e.blocks.find(i=>i?.t==="email"||i?.t==="phone");return t?.t==="phone"||!t&&!r.consent_text?r.sms_consent_text:r.consent_text},$=dt(r,a),v=a.theme,W=H(Qe[$]??[],v.position,Qe[$]?.[0]),T=document.createElement("hp-onsite");h&&T.setAttribute("preview",""),Yt(T,v);let L=T.attachShadow({mode:"open"});Ht(L);let j=$!=="inline"&&!h,y=d(j?"dialog":$==="inline"?"section":"div"),Z=d("div","ov"),_=d("div","w"),F=d("div","m");h&&(F.dataset.hpMedia="");let Ce=()=>{let e=d("form","f");return e.noValidate=!0,e.addEventListener("submit",St),e.addEventListener("input",()=>{O.textContent&&E.getAttribute("aria-busy")!=="true"&&N(null)}),e},E=Ce(),O=d("p","e");O.id=Se("err"),O.setAttribute("aria-live","assertive");let se=d("div","hd");se.setAttribute("aria-hidden","true"),_.append(se,F,E),y.append(Z,_);let B=$!=="inline"&&d("button","x");B&&(B.type="button",B.addEventListener("click",()=>D("close")),_.append(B),Z.addEventListener("click",()=>D("close"))),L.append(y);let n={step:null,mode:$,size:"md",modal:!1,mobile:h?.device==="mobile",answers:{},answeredOn:{},sent:new Set,clicked:!1,seen:new Set,receipt:null,claim:o.coupon?{code:o.coupon}:h?{code:"WELCOME15"}:null,claiming:null,touched:!1,toWarm:new Set,warmed:o.warmed??new Set,warming:!1,owed:!1,unclaimed:!1,misses:0,submitted:!1,pow:null,wheel:null,timers:[],codes:[],videos:[],closed:!1},J=r.locale||document.documentElement.lang,Te=(r.questions.some(ke)||a.steps.some(e=>e.blocks.some(t=>t?.t==="countdown"||t?.display==="cards")))&&o.loadAnswers().catch(()=>null),Le=new WeakMap,Oe=()=>{let e=M(v.button)?v.button:{};y.className=`s ${n.mode}${W?` p-${W}`:""} b-${H(["pill","rounded","square"],e.shape,"rounded")}${n.mobile?" mob":""}${h?" pv":""}${e.style==="outline"?" bo":""}${v.caps===!0?" uc":""}`},Q=h?null:globalThis.matchMedia?.("(max-width: 639px)"),Me=()=>{n.mobile=Q?.matches===!0,pe(),Oe()};Q&&(n.mobile=Q.matches===!0,Q.addEventListener?.("change",Me));let ae=!r.channels?.length,G=(e,t,i={})=>{if(!(h||!l.decision_id||!p.analytics())){if(e==="click"){let s=n.clicked;if(n.clicked=!0,s&&!i.products)return}x.slotEngaged({decision_id:l.decision_id,slot:l.slot,arm:l.arm??null,engagement:e,step:t??n.step?.id??null,...i})}},N=(e,t)=>{O.className="e",O.textContent=e??"";for(let s of E.querySelectorAll("[aria-invalid]"))s.removeAttribute("aria-invalid");let i=t?.closest("label,fieldset");i&&E.contains(i)?i.after(O):E.append(O),t&&(t.setAttribute("aria-invalid","true"),t.setAttribute("aria-describedby",O.id),t.focus(),t.scrollIntoView?.({block:"nearest"}))},V=e=>{E.setAttribute("aria-busy",String(e));for(let t of E.querySelectorAll("button"))t.disabled=e},Ie=()=>h?Promise.resolve(null):(n.pow??(n.pow=b.challenge().then(e=>e.status===200?Ge(e.body):null).catch(()=>null)),n.pow),le=()=>{for(let e of n.videos)try{document.hidden||Ae()?e.pause():e.play()?.catch?.(()=>{})}catch{}};document.addEventListener("visibilitychange",le);function ce(e,t,i,s,c){let u=K(e.asset);if(!u)return null;let g=typeof e.alt=="string"?e.alt:"",m;if(Ee(e)){m=d("video",t),m.muted=m.defaultMuted=m.loop=m.playsInline=!0;let A=K(e.poster);A&&(m.poster=A),g?m.setAttribute("aria-label",g):m.setAttribute("aria-hidden","true"),m.autoplay=!Ae()&&!h,m.preload=m.autoplay?"auto":A?"none":"metadata";let z=Wt(e,u);if(z.length>1)for(let P of z){let q=d("source");q.src=P;let Y=_e(P);Y&&(q.type=Y),m.append(q)}else m.src=u;n.videos.push(m)}else{m=d("img",t),m.alt=g,m.decoding="async",m.loading=i?"eager":"lazy",i&&(m.fetchPriority="high");let A=ct(e,u,I(e.width,1,8192));A&&(m.sizes=at(n.mode,n.size,s,c),m.srcset=A),m.src=u}let f=I(e.width,1,8192),k=I(e.height,1,8192);return f&&k&&(m.width=f,m.height=k),M(e.focal)&&(m.style.objectPosition=`${I(e.focal.x,0,100)??50}% ${I(e.focal.y,0,100)??50}%`),m}function Pe(e,t){let i=d("label","l");i.append(d("span","lt",e.label??(t==="email"?"Email":"Mobile number")));let s=d("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",O.id),s.addEventListener("focus",Ie,{once:!0}),t!=="tel")return i.append(s),i;s.id=`${O.id}-p`,i.htmlFor=s.id;let c=xe(d,"Country code","+",Object.entries(ge).map(([g,m])=>[g,`${g} +${m}`]),(e.country||/-(\w\w)$/.exec(J)?.[1]||"").toUpperCase());c.classList.add("cc"),c.name="hp_cc";let u=d("span","ph");return u.append(c,s),i.append(u),i}function ft(e){let t=r.questions.find(f=>f.key===e.question);if(!t||!ke(t)&&!Array.isArray(t.options))return null;let i=d("fieldset");i.dataset.question=t.key,i.append(d("legend","",t.label??""));let s=n.answers[t.key]??[],c=e.display==="cards"&&t.type==="one";if(ke(t)||c)return Te.then(f=>{if(!f)return i.append(d("p","sm",S.unavailable));if(c)return f.answerCards(i,t,e,d,s,k=>ce(k,"qi",!1,lt(n.size,t),"50vw"),L);f.answerFields(i,t,d,s[0],J),Le.set(i,()=>f.answerOf(i,t,void 0,J))}),i;let u=t.type==="many",g=H(["list","dropdown"],e.display,"buttons"),m=t.options.filter(f=>M(f)&&typeof f.value=="string");if(g==="dropdown"&&!u)return i.append(xe(d,t.label??t.key,"\u2014",m.map(f=>[f.value,f.label??f.value]),s[0])),i;g!=="buttons"&&(i.className="ls");for(let f of m){let k=d("label",g==="buttons"?"ch":"c"),A=d("input");A.type=u?"checkbox":"radio",A.name=`q_${t.key}`,A.value=f.value,A.checked=s.includes(f.value),k.append(A,d("span","",f.label??f.value)),i.append(k)}return i}function ne(){for(let e of n.codes){if(e.replaceChildren(),!n.claim){n.unclaimed&&e.append(d("p","",S.unclaimed));continue}if(!n.claim.code){let s=n.claim.held?S.claimed:n.claim.fallback===!0?S.code:n.claim.prize?.label;s&&e.append(d("p","",s));continue}n.claim.prize?.label&&e.append(d("p","",n.claim.prize.label));let t=d("output");t.textContent=n.claim.code;let i=d("button","btn cp");i.type="button",i.textContent="Copy code",i.addEventListener("click",()=>{navigator.clipboard?.writeText(n.claim.code).then(()=>{i.textContent=S.copied}).catch(()=>{})}),e.append(t,i)}}function mt(e){if(n.claim&&!n.claim.code)return null;let t=d("div","cd");return t.hidden=!0,Te.then(i=>i&&t.isConnected&&n.timers.push(i.countdown(t,e,h,d))),t}function de(e,t){return e.href=t,e.rel="noopener",e.addEventListener("click",i=>{if(h)return i.preventDefault();G("click"),We()}),e}function ht(e){let t=e.label??"Continue";if(e.action==="link"){let s=X(e.href);return s?de(d("a",`btn${nt[e.variant]??""}`,t),s):null}let i=d("button",`btn${nt[e.variant]??""}`,t);return i.type=e.action==="submit"?"submit":"button",i.type==="button"?i.addEventListener("click",()=>re(e)):i.dataset.submit="",i}let qe=(e,t,i)=>(e.classList.add(`x-${H(Pt,t.size,i)}`),qt.includes(t.align)&&e.classList.add(`a-${t.align}`),e);function Ne(e){let t=ce(e,"bi",n.step===a.steps[0]);if(!t)return null;t.style.objectFit=e.fit==="contain"?"contain":"cover";let i=I(e.radius,0,48);i!==null&&(t.style.borderRadius=`${i}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"||!X(e.href))return t;let c=de(d("a","bl"),X(e.href));return c.append(t),c}function bt(e){let t=I(e.threshold,.01,1e7);if(!t)return null;let i=d("div","pg"),s=d("p"),c=d("div","tr"),u=d("i");c.append(u),c.setAttribute("role","progressbar"),c.setAttribute("aria-valuemin","0"),c.setAttribute("aria-valuemax",String(t)),i.append(s,c);let g=f=>f.toFixed(2);try{let f=new Intl.NumberFormat(J||void 0,{style:"currency",currency:e.currency});g=k=>f.format(k)}catch{}let m=()=>{let f=Math.max(0,Number(o.basket?.())||0),k=t-f;s.textContent=k>0?String(e.text??"").replace("{amount}",g(k)):e.done??"",u.style.transform=`scaleX(${Math.min(1,f/t)})`,c.setAttribute("aria-valuenow",String(Math.min(f,t))),s.id||(s.id=Se("pg")),c.setAttribute("aria-labelledby",s.id)};return m(),n.timers.push(setInterval(m,2e3)),i}function gt(e){let t=d("div","pr");return o.loadProducts?.().then(i=>{t.isConnected&&n.timers.push(i.mountProducts(t,e,{el:d,lang:J,root:L,placement:r.slot,preview:h,client:!h&&p.analytics()&&x,engaged:G,seen:n.seen}))}).catch(()=>{}),t}let je={heading(e){let t=qe(d("h2","",e.text),e,"xl");return t.id=Se("h"),t.tabIndex=-1,y.hasAttribute("aria-labelledby")||(y.setAttribute("aria-labelledby",t.id),n.step===a.steps[0]&&Je.includes(n.mode)&&!h&&(t.autofocus=!0)),t},text:e=>qe(d("p","",e.text),e,"md"),email:e=>Pe(e,"email"),phone:e=>Pe(e,"tel"),consent(e){let t=C(n.step)?.text;if(typeof t!="string")return null;if(e.required!==!0)return d("p","sm",t);let i=d("label","c"),s=d("input");return s.type="checkbox",s.name="hp_consent",s.required=!0,s.setAttribute("aria-describedby",O.id),i.append(s,d("span","",t)),i},question:ft,wheel(){let e=d("div","wh");return o.loadWheel().then(t=>{n.closed||(n.wheel=t.mountWheel(e,r.prizes))}).catch(()=>{}),e},code(){let e=d("div","k");return e.setAttribute("aria-live","polite"),n.codes.push(e),e},button:ht,decline(e){let t=d("button","btn no",e.label??"No thanks");return t.type="button",t.addEventListener("click",()=>D("decline")),t},countdown:mt,progress:bt,products:gt,image:Ne,video:Ne,spacer(e){let t=d("div","sp");return t.style.height=`${et[e.size]??et.md}px`,t.setAttribute("aria-hidden","true"),t},divider:()=>d("hr")};function xt(e,t){F.replaceChildren();let i=e.media,s=!i||t&&e.template!=="image-only";if(n.size=st(v,e),_.className=`w t-${e.template} z-${n.size}${e.side==="right"?" right":""}${v.text_align==="center"?" ta-center":""}${s?" nm":""}`,_.style.setProperty("--sc",String(e.scrim)),E.className=`f pd-${e.padding}`,F.hidden=s,F.hidden)return;let c=ce(i,"",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=""),F.append(c);return}let u=X(i.href),g=u?de(d("a","io"),u):d("button","io");u||(g.type="button",g.addEventListener("click",()=>re({action:"next"}))),g.append(c),F.append(g)}function yt(e){let t=e.blocks.find(c=>c?.t==="heading"),i=e.blocks.find(c=>c?.t==="button"&&c.action==="next"),s=d("button","tb");return s.textContent=t?d("b","",t.text).textContent:i?.label??"Open",s.type="button",s.addEventListener("click",()=>re(i??{action:"next"})),s}function R(e,t=new Set){let i=a.steps.find(z=>z.id===e);if(!i)return D("done");if(i.kind==="question"&&!h&&!p.analytics()&&!t.has(i.id))return R(ee(i,n.answers),t.add(i.id));let s=n.step!==null,c=s&&(L.activeElement||document.activeElement===document.body),u=s&&!h?{mode:n.mode,w:_.offsetWidth,h:_.offsetHeight,top:_.offsetTop}:null;n.step=i,n.touched=!1;for(let z of n.timers.splice(0))it(z);n.codes=[],n.videos=[],n.wheel=null;let g=$==="teaser"&&i===a.steps[0];if(n.mode=$==="teaser"&&!g?"popup":$,$==="teaser"&&w.tab?.(r.slot,g),B&&B.setAttribute("aria-label",g?S.closeOffer:"Close"),Oe(),y.removeAttribute("aria-labelledby"),u){let z=Ce();E.replaceWith(z),E=z}let m=rt(i);xt(m,g);let f=u?.mode==="popup"&&n.mode==="popup";if(pe(),u?.mode===n.mode&&u.h>0&&!f&&(_.style.setProperty("--lw",`${u.w}px`),_.style.setProperty("--lh",`${u.h}px`),_.classList.add("lk")),E.replaceChildren(),g&&m.template!=="image-only")E.append(yt(i));else for(let[z,P]of i.blocks.entries()){let q=M(P)&&Object.hasOwn(je,P.t)?je[P.t](P):null;q&&(h&&(q.dataset.hpBlock=String(z)),E.append(q))}let k=E.querySelector("[data-submit]"),A=E.querySelector("[name=hp_consent]")?.parentNode;k&&A&&k.before(A),E.hidden=E.childElementCount===0,N(null),ne(),y.hasAttribute("aria-labelledby")?y.removeAttribute("aria-label"):y.setAttribute("aria-label",m.media?.alt?.trim?.()||"Sign up"),f&&u.h>0&&vt(u),s&&Re(),le(),h||wt(i),c&&E.querySelector("h2")?.focus()}function pe(){_.classList.remove("lk","an"),_.style.removeProperty("--tp")}function vt(e){let t=_.offsetHeight;_.classList.add("an");let i=_.offsetTop,s=Math.max(0,e.top-i);if(s+t>y.clientHeight-2*i)return pe();_.style.setProperty("--tp",`${s}px`)}function wt(e){let t=e.next??{};for(let c of[t.default,...Object.values(M(t.answers)?t.answers:{}),...e.blocks.map(u=>u?.next),...jt])typeof c=="string"&&n.toWarm.add(c);if(n.warming)return;n.warming=!0;let i=()=>{if(n.warming=!1,!n.closed&&T.isConnected)for(let c of n.toWarm)ze(r,a,c,n.warmed);n.toWarm.clear()},s=()=>globalThis.requestIdleCallback?requestIdleCallback(i,{timeout:2e3}):setTimeout(i,200);document.readyState==="complete"?s():window.addEventListener("load",s,{once:!0})}function Re(){if(!j)return;let e=Je.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}):T.blur()}else y.setAttribute("open","");!e||typeof y.showModal!="function"?y.setAttribute("role","dialog"):y.removeAttribute("role")}}function De(){for(let e of E.querySelectorAll("fieldset[data-question]")){let t=e.dataset.question,i=Le.get(e)?.()??{};if(i.error)return i;let s=[i.value,...[...e.querySelectorAll("input:checked,select:not([name])")].map(c=>c.value)].filter(Boolean);s.length?(n.answers[t]=s,n.answeredOn[t]=n.step.id):delete n.answers[t]}}function Ue(){let e=Object.entries(n.answers).map(([i,s])=>({question:i,values:s})).filter(i=>!n.sent.has(ue(i))),t=({question:i})=>n.answeredOn[i];if(n.signedUp){for(let i of new Set(e.map(t))){let s=e.filter(c=>t(c)===i);for(let c of s)n.sent.add(ue(c));b.answers({anonymousId:p.anonymousId(),sessionId:p.sessionId()??void 0,slot:l.slot,arm:l.arm??void 0,decision_id:l.decision_id??void 0,step:i,...n.signedUp,answers:s,context:Fe()})}return}if(p.analytics())for(let i of e)n.sent.add(ue(i)),x.preferencesStated({...i,source:"onsite",slot:l.slot,arm:l.arm??null,decision_id:l.decision_id??null,step:t(i)})}let ue=({question:e,values:t})=>`${e}=${t.join(",")}`,We=()=>{ae&&(De(),Ue())},Fe=()=>({page:{url:p.pageUrl()},locale:p.locale()??void 0,consent:p.consent()}),ie=e=>{!h&&(n.receipt||ae)&&Ue(),R(ee(n.step,n.answers,e))};async function kt(e){let t=n.step,i=E.querySelector("input[name=email],input[name=phone]");if(!i)return ie(e.next);let s=i.name==="email"?"email":"sms",c=E.querySelector("select[name=hp_cc]")?.value,u=s==="email"?Ke(i.value.trim())?i.value.trim():null:Xe(i.value,c);if(!u)return N(s==="email"?S.email:c?S.phone:S.intl,i);let g=E.querySelector("input[name=hp_consent]");if(g&&!g.checked)return N(S.consent,g);N(null),V(!0);let m=await Ie();n.pow=null;let f=Object.entries(n.answers).map(([U,he])=>({question:U,values:he})),k=s==="sms"?r.sms_consent_text:r.consent_text,A=await b.capture({anonymousId:p.anonymousId(),sessionId:p.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"]:u,...s==="sms"&&n.signedUp,consent_text:k?{id:k.id,version:k.version}:void 0,...f.length?{answers:f}:{},...m?{altcha:m}:{},context:Fe()}),z=A.body?.status,P=(A.status===202||A.status===200)&&Mt.includes(z);if(n.closed&&!P)return;P||V(!1);let q=A.status===400?A.body?.field:null;if(q==="email"||q==="phone")return N(S[q],i);if(!P)return N(A.status===429?S.busy:S.failed,i);i.value="";for(let[U,he]of Object.entries(n.answers))n.sent.add(`${U}=${he.join(",")}`);n.receipt=typeof A.body.receipt=="string"?A.body.receipt:null,s==="email"&&(n.signedUp={email:u,email_receipt:n.receipt}),n.submitted=!0,w.submitted(r.slot),G("submit",t.id),n.owed=s==="email"&&r.prizes.length>0;let Y=n.owed?fe([]):null;Y||o.emit?.("submitted",{coupon:null});let $t=Y&&await Promise.race([Y,new Promise(U=>setTimeout(U,Dt))]);if(n.closed)return;if(V(!1),$t?.held)return R(oe("held"));let _t=z!=="ok"&&a.steps.some(U=>U.id===z);R(_t?z:ee(t,n.answers,e.next));let zt=n.step;Y?.then(U=>{U?.held&&!n.closed&&n.step===zt&&!n.touched&&R(oe("held"))})}function oe(e){if(a.steps.some(s=>s.id===e))return e;let t={t:"button",label:S.shop,action:"close"},i=e==="unclaimed"?[{t:"heading",text:S.thanks},{t:"text",text:S.unclaimed},t]:e==="fallback"||n.claim?.code?[{t:"heading",text:e==="fallback"?S.thanks:S.yours},{t:"code"}]:[{t:"heading",text:S.held},{t:"text",text:r.code_relayed===!0?S.resent:S.inbox},t];return a.steps.push({id:e,blocks:i}),e}function Ye(e){n.owed&&(n.owed=!1,o.emit?.("submitted",{coupon:e?{code:e.code??null,prize:e.prize?.key}:null}))}function fe(e=Rt){let t=n.receipt;return n.claiming??(n.claiming=(async()=>{n.unclaimed=!1;let i;for(let g of[0,...e])if(g&&await new Promise(m=>setTimeout(m,g)),i=await b.claim({slot:l.slot,decision_id:l.decision_id??void 0,receipt:t}),i.status!==503)break;let s=i.body,c=s?.fallback===!0&&!s.code;if(i.status!==200||!(M(s?.prize)||c))return n.claiming=null,!e.length&&i.status===503?fe():(Ye(null),n.unclaimed=!0,n.closed||ne(),null);let u=s.held&&!s.code?w.code?.():null;return u&&(s={...s,code:u}),n.claim=s,typeof s.code=="string"&&w.code?.(s.code),Ye(s),n.closed||ne(),s})()),n.claiming}async function At(e){if(!n.receipt)return N(S.spin);V(!0);let t=await fe();if(n.closed)return;if(!t)return V(!1),n.misses+=1,n.misses<2?N(S.retry):R(oe("unclaimed"));let i=t.fallback===!0&&!t.code,s=t.held?-1:r.prizes.findIndex(g=>g.key===t.prize?.key&&g.label===t.prize?.label);if(n.wheel&&s>=0&&!i){if(await n.wheel.spinTo(s),n.closed)return;O.className="e won",O.textContent=`${S.won} ${t.prize.label}`,await new Promise(g=>setTimeout(g,Ut))}if(n.closed)return;V(!1);let c=i?"fallback":s<0?"held":null,u=c?oe(c):ee(n.step,n.answers,e.next);u?R(u):ne()}function re(e){if(e.action==="close")return D("close");let t=De();return h?ie(e.next):t?N(t.error,t.input):(ae&&n.step.blocks.some(i=>n.answers[i?.question])&&G("click"),e.action==="apply"?(o.emit?.("apply",{coupon:n.claim?.code?{code:n.claim.code}:null}),G("click"),ie(e.next)):e.action==="submit"?kt(e):e.action==="spin"?At(e):ie(e.next))}function St(e){if(e.preventDefault(),E.getAttribute("aria-busy")==="true")return;let t=n.step.blocks.find(i=>i?.t==="button"&&i.action==="submit");re(t??{action:"next"})}function me(e=!1){n.closed=!0;for(let i of n.timers.splice(0))it(i);document.removeEventListener("visibilitychange",le),Q?.removeEventListener?.("change",Me);let t=()=>{try{y.open&&y.close()}catch{}T.remove()};if(e||!j||Ae())return t();y.classList.add("out"),setTimeout(t,Nt)}function D(e){n.closed||h||(We(),!n.submitted&&e!=="done"&&G("dismiss"),w.closed(r.slot),w.tab?.(r.slot,!1),me(),o.onClose?.(e))}for(let e of["pointerdown","keydown","input"])y.addEventListener(e,()=>{n.touched=!0});y.addEventListener("cancel",e=>{e.preventDefault(),D("esc")}),y.addEventListener("keydown",e=>{e.key==="Escape"&&!n.modal&&$!=="inline"&&D("esc"),e.key==="Tab"&&n.modal&&Et(e)});function Et(e){let t=[...L.querySelectorAll("input[type=radio]:checked")],i=new Set,s=[...L.querySelectorAll("a[href],button,input,select,textarea")].filter(f=>{if(f.disabled||!f.getClientRects().length)return!1;if(f.type!=="radio")return!0;let k=t.find(A=>A.name===f.name);return(k?f!==k:i.has(f.name))?!1:(i.add(f.name),!0)});if(!s.length)return;let c=e.shiftKey,u=L.activeElement;u?.type==="radio"&&(u=s.find(f=>f.type==="radio"&&f.name===u.name)??u);let g=s.indexOf(u),m=null;if(g<0){let f=k=>u&&u.compareDocumentPosition(k)&4;m=c?s.findLast(k=>!f(k))??s.at(-1):s.find(f)??s[0]}else(c?g===0:g===s.length-1)&&(m=s.at(c?-1:0));m&&(e.preventDefault(),m.focus())}se.addEventListener("pointerdown",e=>{if(!n.mobile||n.mode!=="sheet")return;let t=e.clientY,i=0,s=u=>{i=Math.max(0,u.clientY-t),_.style.transform=`translateY(${i}px)`},c=()=>{document.removeEventListener("pointermove",s),document.removeEventListener("pointerup",c),_.style.transform="",i>80&&D("close")};document.addEventListener("pointermove",s),document.addEventListener("pointerup",c)});try{R(h?.step&&a.steps.some(e=>e.id===h.step)?h.step:a.steps[0].id),(o.container??document.body).append(T),Re()}catch(e){throw me(!0),e}return{close:D,root:L,host:T,show:R,step:()=>n.step?.id??null,modal:()=>!n.closed&&n.modal,destroy:()=>!n.closed&&me()}}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render")]={mountForm:ut,warm:ze};})();
181
+ `;var Ot=/^#(?:[0-9a-f]{3}){1,2}$/i,Je=["popup","fullscreen"],Mt=["ok","verify","already"],Pt=["stack","split","overlay","image-only"],Qe={bar:["bottom","top"],sheet:["bottom-right","bottom-left","bottom"],teaser:["bottom-left","bottom-right","left","right"]},It=["xs","sm","md","lg","xl","display"],et={xs:4,sm:8,md:16,lg:28,xl:44},tt={sm:380,md:480,lg:880},qt=["left","center","right"],nt={secondary:" b2",link:" no"},Nt=220,jt=["verify","already","held","fallback","success"],Rt=[500,1500],Dt=600,Ut=1800,S={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"},H=(o,r,a)=>o.includes(r)?r:a,I=(o,r,a)=>Number.isFinite(o)?Math.min(Math.max(o,r),a):null,ke=o=>o.type==="date"||o.type==="number",Ae=()=>globalThis.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches===!0;function rt(o){let r=M(o.layout)?o.layout:{},a=M(r.media)?r.media:null,l=H(Pt,r.template,"stack"),p=a?.side==="right"?"right":"left";return!a&&M(r.image)&&r.image.side!=="none"&&(a=r.image,r.image.side!=="top"&&(l="split",p=r.image.side==="right"?"right":"left")),(!a||!K(a.asset))&&(a=null,l="stack"),{template:l,media:a,side:p,scrim:I(r.scrim,0,.9)??.45,padding:H(["none","sm","md","lg"],r.padding,"md")}}var st=(o,r)=>H(["sm","md","lg","full"],o.size,null)??(r.template==="split"||r.template==="overlay"?"lg":"md"),at=(o,r,a=1,l="100vw")=>{if(o==="fullscreen"||r==="full")return l;let p=o==="teaser"?220:o==="sheet"?400:tt[r]??tt.md;return`(max-width: 639px) ${l}, ${Math.round(p*a)}px`},lt=(o,r)=>o==="lg"?1/Ze(r):.5,ct=(o,r,a)=>{if(!a||!Array.isArray(o.widths)||!r.endsWith(".webp"))return null;let l=o.widths.filter(p=>Number.isInteger(p)&&p>0&&p<a).sort((p,x)=>p-x);return l.length===0?null:[...l.map(p=>`${r.slice(0,-5)}-${p}w.webp ${p}w`),`${r} ${a}w`].join(",")},dt=(o,r)=>o.format==="inline"?"inline":r.format&&r.format!=="inline"?r.format:o.format,Ee=o=>o.kind==="video"||o.t==="video",_e={webm:"video/webm",mp4:"video/mp4",m4v:"video/mp4",mov:"video/quicktime",ogv:"video/ogg"},$e=o=>_e[o.split(/[?#]/)[0].split(".").pop().toLowerCase()],Wt=(o,r)=>[...new Set([r,...Array.isArray(o.sources)?o.sources.map(K):[]])].filter(Boolean).sort((a,l)=>($e(l)===_e.webm)-($e(a)===_e.webm));function ze(o,r,a,l=new Set){let p=r.steps.find(v=>v.id===a);if(!p)return Promise.resolve();let x=dt(o,r),b=rt(p),w=x==="teaser"&&p===r.steps[0],h=x==="teaser"&&!w?"popup":x,C=st(r.theme,b),_=w?[]:p.blocks.flatMap(v=>{if(v?.t==="image"||v?.t==="video")return[[v]];let F=v?.display==="cards"&&o.questions.find(T=>T.key===v.question&&T.type==="one");return F?Object.values(v.pictures??{}).filter(M).map(T=>[T,lt(C,F),"50vw"]):[]});return b.media&&!(w&&b.template!=="image-only")&&_.push([b.media,b.template==="split"?.46:1]),Promise.all(_.map(([v,F,T])=>{let L=K(Ee(v)?v.poster:v.asset);if(!L)return null;let R=document.createElement("img"),y=!Ee(v)&&ct(v,L,I(v.width,1,8192));y&&(R.sizes=at(h,C,F,T),R.srcset=y);let Z=`${R.sizes} ${y||L}`;return l.has(Z)?null:(l.add(Z),R.src=L,R.decode?.().catch(()=>{}))}))}var it=o=>o?.call?o():clearInterval(o),Ft=0,Se=o=>`hp-${o}-${++Ft}`;function d(o,r,a){let l=document.createElement(o);return r&&(l.className=r),a!==void 0&&l.append(Ge(a)),l}var pt=o=>{let r=o.length===4?[...o.slice(1)].map(a=>a+a).join(""):o.slice(1);return[0,2,4].map(a=>Number.parseInt(r.slice(a,a+2),16))},te=o=>{let[r,a,l]=pt(o).map(p=>{let x=p/255;return x<=.04045?x/12.92:((x+.055)/1.055)**2.4});return .2126*r+.7152*a+.0722*l},ot=(o,r=4.5)=>{let a=te(o)+.05,l=1.05/a;return l>=r?"#fff":a/(te("#111")+.05)>l?"#111":"#fff"};function Yt(o,r){let a=(_,v)=>v&&o.style.setProperty(_,v),l=_=>Ot.test(_??"")?_:null;a("--hp-accent",l(r.accent)),a("--hp-bg",l(r.background)),a("--hp-text",l(r.text));let p=I(r.radius,0,48);p!==null&&a("--hp-radius",`${p}px`),a("--hp-font",r.font==="site"?o.ownerDocument.defaultView.getComputedStyle(o.parentElement??o.ownerDocument.body).fontFamily:Object.hasOwn(ve,r.font)?ve[r.font]:null),l(r.accent)&&(a("--hp-on-accent",ot(r.accent,3)),a("--hp-on-accent-text",ot(r.accent))),l(r.background)&&te(r.background)<.18&&(a("--hp-field","#fff"),a("--hp-field-text","#111"));let x=M(r.overlay)?r.overlay:{},b=[l(r.text),l(r.background)].filter(Boolean).sort((_,v)=>te(_)-te(v))[0],[w,h,C]=pt(l(x.colour)??b??"#0b0b0f");a("--hp-ov",`rgb(${w} ${h} ${C} / ${I(x.opacity,0,1)??.6})`)}function Ht(o){try{let r=new CSSStyleSheet;r.replaceSync(we),o.adoptedStyleSheets=[r]}catch{let r=document.createElement("style");r.textContent=we,o.append(r)}}function ut(o){let{form:r,creative:a,decision:l,access:p,client:x,api:b,counters:w}=o,h=o.preview??null,C=e=>{let t=e.blocks.find(i=>i?.t==="email"||i?.t==="phone");return t?.t==="phone"||!t&&!r.consent_text?r.sms_consent_text:r.consent_text},_=dt(r,a),v=a.theme,F=H(Qe[_]??[],v.position,Qe[_]?.[0]),T=document.createElement("hp-onsite");h&&T.setAttribute("preview",""),Yt(T,v);let L=T.attachShadow({mode:"open"});Ht(L);let R=_!=="inline"&&!h,y=d(R?"dialog":_==="inline"?"section":"div"),Z=d("div","ov"),$=d("div","w"),Y=d("div","m");h&&(Y.dataset.hpMedia="");let Ce=()=>{let e=d("form","f");return e.noValidate=!0,e.addEventListener("submit",St),e.addEventListener("input",()=>{O.textContent&&E.getAttribute("aria-busy")!=="true"&&N(null)}),e},E=Ce(),O=d("p","e");O.id=Se("err"),O.setAttribute("aria-live","assertive");let se=d("div","hd");se.setAttribute("aria-hidden","true"),$.append(se,Y,E),y.append(Z,$);let B=_!=="inline"&&d("button","x");B&&(B.type="button",B.addEventListener("click",()=>U("close")),$.append(B),Z.addEventListener("click",()=>U("close"))),L.append(y);let n={step:null,mode:_,size:"md",modal:!1,mobile:h?.device==="mobile",answers:{},answeredOn:{},sent:new Set,clicked:!1,seen:new Set,receipt:null,claim:o.coupon?{code:o.coupon}:h?{code:"WELCOME15"}:null,claiming:null,touched:!1,toWarm:new Set,warmed:o.warmed??new Set,warming:!1,owed:!1,unclaimed:!1,misses:0,submitted:!1,pow:null,wheel:null,timers:[],codes:[],videos:[],closed:!1},J=r.locale||document.documentElement.lang,Te=(r.questions.some(ke)||a.steps.some(e=>e.blocks.some(t=>t?.t==="countdown"||t?.display==="cards")))&&o.loadAnswers().catch(()=>null),Le=new WeakMap,Oe=()=>{let e=M(v.button)?v.button:{};y.className=`s ${n.mode}${F?` p-${F}`:""} b-${H(["pill","rounded","square"],e.shape,"rounded")}${n.mobile?" mob":""}${h?" pv":""}${e.style==="outline"?" bo":""}${v.caps===!0?" uc":""}`},Q=h?null:globalThis.matchMedia?.("(max-width: 639px)"),Me=()=>{n.mobile=Q?.matches===!0,pe(),Oe()};Q&&(n.mobile=Q.matches===!0,Q.addEventListener?.("change",Me));let ae=!r.channels?.length,V=(e,t,i={})=>{if(!(h||!l.decision_id||!p.analytics())){if(e==="click"){let s=n.clicked;if(n.clicked=!0,s&&!i.products)return}x.slotEngaged({decision_id:l.decision_id,slot:l.slot,arm:l.arm??null,engagement:e,step:t??n.step?.id??null,...i})}},N=(e,t)=>{O.className="e",O.textContent=e??"";for(let s of E.querySelectorAll("[aria-invalid]"))s.removeAttribute("aria-invalid");let i=t?.closest("label,fieldset");i&&E.contains(i)?i.after(O):E.append(O),t&&(t.setAttribute("aria-invalid","true"),t.setAttribute("aria-describedby",O.id),t.focus(),t.scrollIntoView?.({block:"nearest"}))},G=e=>{E.setAttribute("aria-busy",String(e));for(let t of E.querySelectorAll("button"))t.disabled=e},Pe=()=>h?Promise.resolve(null):(n.pow??(n.pow=b.challenge().then(e=>e.status===200?Ve(e.body):null).catch(()=>null)),n.pow),le=()=>{for(let e of n.videos)try{document.hidden||Ae()?e.pause():e.play()?.catch?.(()=>{})}catch{}};document.addEventListener("visibilitychange",le);function ce(e,t,i,s,c){let u=K(e.asset);if(!u)return null;let g=typeof e.alt=="string"?e.alt:"",m;if(Ee(e)){m=d("video",t),m.muted=m.defaultMuted=m.loop=m.playsInline=!0;let A=K(e.poster);A&&(m.poster=A),g?m.setAttribute("aria-label",g):m.setAttribute("aria-hidden","true"),m.autoplay=!Ae()&&!h,m.preload=m.autoplay?"auto":A?"none":"metadata";let j=Wt(e,u);if(j.length>1)for(let z of j){let P=d("source");P.src=z;let q=$e(z);q&&(P.type=q),m.append(P)}else m.src=u;n.videos.push(m)}else{m=d("img",t),m.alt=g,m.decoding="async",m.loading=i?"eager":"lazy",i&&(m.fetchPriority="high");let A=ct(e,u,I(e.width,1,8192));A&&(m.sizes=at(n.mode,n.size,s,c),m.srcset=A),m.src=u}let f=I(e.width,1,8192),k=I(e.height,1,8192);return f&&k&&(m.width=f,m.height=k),M(e.focal)&&(m.style.objectPosition=`${I(e.focal.x,0,100)??50}% ${I(e.focal.y,0,100)??50}%`),m}function Ie(e,t){let i=d("label","l");i.append(d("span","lt",e.label??(t==="email"?"Email":"Mobile number")));let s=d("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",O.id),s.addEventListener("focus",Pe,{once:!0}),t!=="tel")return i.append(s),i;s.id=`${O.id}-p`,i.htmlFor=s.id;let c=xe(d,"Country code","+",Object.entries(ge).map(([g,m])=>[g,`${g} +${m}`]),(e.country||/-(\w\w)$/.exec(J)?.[1]||"").toUpperCase());c.classList.add("cc"),c.name="hp_cc";let u=d("span","ph");return u.append(c,s),i.append(u),i}function ft(e){let t=r.questions.find(f=>f.key===e.question);if(!t||!ke(t)&&!Array.isArray(t.options))return null;let i=d("fieldset");i.dataset.question=t.key,i.append(d("legend","",t.label??""));let s=n.answers[t.key]??[],c=e.display==="cards"&&t.type==="one";if(ke(t)||c)return Te.then(f=>{if(!f)return i.append(d("p","sm",S.unavailable));if(c)return f.answerCards(i,t,e,d,s,k=>ce(k,"qi",!1,lt(n.size,t),"50vw"),L);f.answerFields(i,t,d,s[0],J),Le.set(i,()=>f.answerOf(i,t,void 0,J))}),i;let u=t.type==="many",g=H(["list","dropdown"],e.display,"buttons"),m=t.options.filter(f=>M(f)&&typeof f.value=="string");if(g==="dropdown"&&!u)return i.append(xe(d,t.label??t.key,"\u2014",m.map(f=>[f.value,f.label??f.value]),s[0])),i;g!=="buttons"&&(i.className="ls");for(let f of m){let k=d("label",g==="buttons"?"ch":"c"),A=d("input");A.type=u?"checkbox":"radio",A.name=`q_${t.key}`,A.value=f.value,A.checked=s.includes(f.value),k.append(A,d("span","",f.label??f.value)),i.append(k)}return i}function ne(){for(let e of n.codes){if(e.replaceChildren(),!n.claim){n.unclaimed&&e.append(d("p","",S.unclaimed));continue}if(!n.claim.code){let s=n.claim.held?S.claimed:n.claim.fallback===!0?S.code:n.claim.prize?.label;s&&e.append(d("p","",s));continue}n.claim.prize?.label&&e.append(d("p","",n.claim.prize.label));let t=d("output");t.textContent=n.claim.code;let i=d("button","btn cp");i.type="button",i.textContent="Copy code",i.addEventListener("click",()=>{navigator.clipboard?.writeText(n.claim.code).then(()=>{i.textContent=S.copied}).catch(()=>{})}),e.append(t,i)}}function mt(e){if(n.claim&&!n.claim.code)return null;let t=d("div","cd");return t.hidden=!0,Te.then(i=>i&&t.isConnected&&n.timers.push(i.countdown(t,e,h,d))),t}function de(e,t){return e.href=t,e.rel="noopener",e.addEventListener("click",i=>{if(h)return i.preventDefault();V("click"),We()}),e}function ht(e){let t=e.label??"Continue";if(e.action==="link"){let s=X(e.href);return s?de(d("a",`btn${nt[e.variant]??""}`,t),s):null}let i=d("button",`btn${nt[e.variant]??""}`,t);return i.type=e.action==="submit"?"submit":"button",i.type==="button"?i.addEventListener("click",()=>re(e)):i.dataset.submit="",i}let qe=(e,t,i)=>(e.classList.add(`x-${H(It,t.size,i)}`),qt.includes(t.align)&&e.classList.add(`a-${t.align}`),e);function Ne(e){let t=ce(e,"bi",n.step===a.steps[0]);if(!t)return null;t.style.objectFit=e.fit==="contain"?"contain":"cover";let i=I(e.radius,0,48);i!==null&&(t.style.borderRadius=`${i}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"||!X(e.href))return t;let c=de(d("a","bl"),X(e.href));return c.append(t),c}function bt(e){let t=I(e.threshold,.01,1e7);if(!t)return null;let i=d("div","pg"),s=d("p"),c=d("div","tr"),u=d("i");c.append(u),c.setAttribute("role","progressbar"),c.setAttribute("aria-valuemin","0"),c.setAttribute("aria-valuemax",String(t)),i.append(s,c);let g=f=>f.toFixed(2);try{let f=new Intl.NumberFormat(J||void 0,{style:"currency",currency:e.currency});g=k=>f.format(k)}catch{}let m=()=>{let f=Math.max(0,Number(o.basket?.())||0),k=t-f;s.textContent=k>0?String(e.text??"").replace("{amount}",g(k)):e.done??"",u.style.transform=`scaleX(${Math.min(1,f/t)})`,c.setAttribute("aria-valuenow",String(Math.min(f,t))),s.id||(s.id=Se("pg")),c.setAttribute("aria-labelledby",s.id)};return m(),n.timers.push(setInterval(m,2e3)),i}function gt(e){let t=d("div","pr");return o.loadProducts?.().then(i=>{t.isConnected&&n.timers.push(i.mountProducts(t,e,{el:d,lang:J,root:L,placement:r.slot,preview:h,client:!h&&p.analytics()&&x,engaged:V,seen:n.seen}))}).catch(()=>{}),t}let je={heading(e){let t=qe(d("h2","",e.text),e,"xl");return t.id=Se("h"),t.tabIndex=-1,y.hasAttribute("aria-labelledby")||(y.setAttribute("aria-labelledby",t.id),n.step===a.steps[0]&&Je.includes(n.mode)&&!h&&(t.autofocus=!0)),t},text:e=>qe(d("p","",e.text),e,"md"),email:e=>Ie(e,"email"),phone:e=>Ie(e,"tel"),consent(e){let t=C(n.step)?.text;if(typeof t!="string")return null;if(e.required!==!0)return d("p","sm",t);let i=d("label","c"),s=d("input");return s.type="checkbox",s.name="hp_consent",s.required=!0,s.setAttribute("aria-describedby",O.id),i.append(s,d("span","",t)),i},question:ft,wheel(){let e=d("div","wh");return o.loadWheel().then(t=>{n.closed||(n.wheel=t.mountWheel(e,r.prizes))}).catch(()=>{}),e},code(){let e=d("div","k");return e.setAttribute("aria-live","polite"),n.codes.push(e),e},button:ht,decline(e){let t=d("button","btn no",e.label??"No thanks");return t.type="button",t.addEventListener("click",()=>U("decline")),t},countdown:mt,progress:bt,products:gt,image:Ne,video:Ne,spacer(e){let t=d("div","sp");return t.style.height=`${et[e.size]??et.md}px`,t.setAttribute("aria-hidden","true"),t},divider:()=>d("hr")};function xt(e,t){Y.replaceChildren();let i=e.media,s=!i||t&&e.template!=="image-only";if(n.size=st(v,e),$.className=`w t-${e.template} z-${n.size}${e.side==="right"?" right":""}${v.text_align==="center"?" ta-center":""}${s?" nm":""}`,$.style.setProperty("--sc",String(e.scrim)),E.className=`f pd-${e.padding}`,Y.hidden=s,Y.hidden)return;let c=ce(i,"",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=""),Y.append(c);return}let u=X(i.href),g=u?de(d("a","io"),u):d("button","io");u||(g.type="button",g.addEventListener("click",()=>re({action:"next"}))),g.append(c),Y.append(g)}function yt(e){let t=e.find(c=>c?.t==="heading"),i=e.find(c=>c?.t==="button"&&c.action==="next"),s=d("button","tb");return s.textContent=t?d("b","",t.text).textContent:i?.label??"Open",s.type="button",s.addEventListener("click",()=>re(i??{action:"next"})),s}function D(e,t=new Set){let i=a.steps.find(z=>z.id===e);if(!i)return U("done");if(i.kind==="question"&&!h&&!p.analytics()&&!t.has(i.id))return D(ee(i,n.answers),t.add(i.id));let s=n.step!==null,c=s&&(L.activeElement||document.activeElement===document.body),u=s&&!h?{mode:n.mode,w:$.offsetWidth,h:$.offsetHeight,top:$.offsetTop}:null;n.step=i,n.touched=!1;for(let z of n.timers.splice(0))it(z);n.codes=[],n.videos=[],n.wheel=null;let g=_==="teaser"&&i===a.steps[0];if(n.mode=_==="teaser"&&!g?"popup":_,_==="teaser"&&w.tab?.(r.slot,g),B&&B.setAttribute("aria-label",g?S.closeOffer:"Close"),Oe(),y.removeAttribute("aria-labelledby"),u){let z=Ce();E.replaceWith(z),E=z}let m=rt(i);xt(m,g);let f=u?.mode==="popup"&&n.mode==="popup";pe(),u?.mode===n.mode&&u.h>0&&!f&&($.style.setProperty("--lw",`${u.w}px`),$.style.setProperty("--lh",`${u.h}px`),$.classList.add("lk")),E.replaceChildren();let k=i.blocks.map(z=>o.fill?.(z,n.answers)??z);if(g&&m.template!=="image-only")E.append(yt(k));else for(let[z,P]of k.entries()){let q=M(P)&&Object.hasOwn(je,P.t)?je[P.t](P):null;q&&(h&&(q.dataset.hpBlock=String(z)),E.append(q))}let A=E.querySelector("[data-submit]"),j=E.querySelector("[name=hp_consent]")?.parentNode;A&&j&&A.before(j),E.hidden=E.childElementCount===0,N(null),ne(),y.hasAttribute("aria-labelledby")?y.removeAttribute("aria-label"):y.setAttribute("aria-label",m.media?.alt?.trim?.()||"Sign up"),f&&u.h>0&&vt(u),s&&Re(),le(),h||wt(i),c&&E.querySelector("h2")?.focus()}function pe(){$.classList.remove("lk","an"),$.style.removeProperty("--tp")}function vt(e){let t=$.offsetHeight;$.classList.add("an");let i=$.offsetTop,s=Math.max(0,e.top-i);if(s+t>y.clientHeight-2*i)return pe();$.style.setProperty("--tp",`${s}px`)}function wt(e){let t=e.next??{};for(let c of[t.default,...Object.values(M(t.answers)?t.answers:{}),...e.blocks.map(u=>u?.next),...jt])typeof c=="string"&&n.toWarm.add(c);if(n.warming)return;n.warming=!0;let i=()=>{if(n.warming=!1,!n.closed&&T.isConnected)for(let c of n.toWarm)ze(r,a,c,n.warmed);n.toWarm.clear()},s=()=>globalThis.requestIdleCallback?requestIdleCallback(i,{timeout:2e3}):setTimeout(i,200);document.readyState==="complete"?s():window.addEventListener("load",s,{once:!0})}function Re(){if(!R)return;let e=Je.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}):T.blur()}else y.setAttribute("open","");!e||typeof y.showModal!="function"?y.setAttribute("role","dialog"):y.removeAttribute("role")}}function De(){for(let e of E.querySelectorAll("fieldset[data-question]")){let t=e.dataset.question,i=Le.get(e)?.()??{};if(i.error)return i;let s=[i.value,...[...e.querySelectorAll("input:checked,select:not([name])")].map(c=>c.value)].filter(Boolean);s.length?(n.answers[t]=s,n.answeredOn[t]=n.step.id):delete n.answers[t]}}function Ue(){let e=Object.entries(n.answers).map(([i,s])=>({question:i,values:s})).filter(i=>!n.sent.has(ue(i))),t=({question:i})=>n.answeredOn[i];if(n.signedUp){for(let i of new Set(e.map(t))){let s=e.filter(c=>t(c)===i);for(let c of s)n.sent.add(ue(c));b.answers({anonymousId:p.anonymousId(),sessionId:p.sessionId()??void 0,slot:l.slot,arm:l.arm??void 0,decision_id:l.decision_id??void 0,step:i,...n.signedUp,answers:s,context:Fe()})}return}if(p.analytics())for(let i of e)n.sent.add(ue(i)),x.preferencesStated({...i,source:"onsite",slot:l.slot,arm:l.arm??null,decision_id:l.decision_id??null,step:t(i)})}let ue=({question:e,values:t})=>`${e}=${t.join(",")}`,We=()=>{ae&&(De(),Ue())},Fe=()=>({page:{url:p.pageUrl()},locale:p.locale()??void 0,consent:p.consent()}),ie=e=>{!h&&(n.receipt||ae)&&Ue(),D(ee(n.step,n.answers,e))};async function kt(e){let t=n.step,i=E.querySelector("input[name=email],input[name=phone]");if(!i)return ie(e.next);let s=i.name==="email"?"email":"sms",c=E.querySelector("select[name=hp_cc]")?.value,u=s==="email"?Ke(i.value.trim())?i.value.trim():null:Xe(i.value,c);if(!u)return N(s==="email"?S.email:c?S.phone:S.intl,i);let g=E.querySelector("input[name=hp_consent]");if(g&&!g.checked)return N(S.consent,g);N(null),G(!0);let m=await Pe();n.pow=null;let f=Object.entries(n.answers).map(([W,he])=>({question:W,values:he})),k=s==="sms"?r.sms_consent_text:r.consent_text,A=await b.capture({anonymousId:p.anonymousId(),sessionId:p.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"]:u,...s==="sms"&&n.signedUp,consent_text:k?{id:k.id,version:k.version}:void 0,...f.length?{answers:f}:{},...m?{altcha:m}:{},context:Fe()}),j=A.body?.status,z=(A.status===202||A.status===200)&&Mt.includes(j);if(n.closed&&!z)return;z||G(!1);let P=A.status===400?A.body?.field:null;if(P==="email"||P==="phone")return N(S[P],i);if(!z)return N(A.status===429?S.busy:S.failed,i);i.value="";for(let[W,he]of Object.entries(n.answers))n.sent.add(`${W}=${he.join(",")}`);n.receipt=typeof A.body.receipt=="string"?A.body.receipt:null,s==="email"&&(n.signedUp={email:u,email_receipt:n.receipt}),n.submitted=!0,w.submitted(r.slot),V("submit",t.id),n.owed=s==="email"&&r.prizes.length>0;let q=n.owed?fe([]):null;q||o.emit?.("submitted",{coupon:null});let _t=q&&await Promise.race([q,new Promise(W=>setTimeout(W,Dt))]);if(n.closed)return;if(G(!1),_t?.held)return D(oe("held"));let $t=j!=="ok"&&a.steps.some(W=>W.id===j);D($t?j:ee(t,n.answers,e.next));let zt=n.step;q?.then(W=>{W?.held&&!n.closed&&n.step===zt&&!n.touched&&D(oe("held"))})}function oe(e){if(a.steps.some(s=>s.id===e))return e;let t={t:"button",label:S.shop,action:"close"},i=e==="unclaimed"?[{t:"heading",text:S.thanks},{t:"text",text:S.unclaimed},t]:e==="fallback"||n.claim?.code?[{t:"heading",text:e==="fallback"?S.thanks:S.yours},{t:"code"}]:[{t:"heading",text:S.held},{t:"text",text:r.code_relayed===!0?S.resent:S.inbox},t];return a.steps.push({id:e,blocks:i}),e}function Ye(e){n.owed&&(n.owed=!1,o.emit?.("submitted",{coupon:e?{code:e.code??null,prize:e.prize?.key}:null}))}function fe(e=Rt){let t=n.receipt;return n.claiming??(n.claiming=(async()=>{n.unclaimed=!1;let i;for(let g of[0,...e])if(g&&await new Promise(m=>setTimeout(m,g)),i=await b.claim({slot:l.slot,decision_id:l.decision_id??void 0,receipt:t}),i.status!==503)break;let s=i.body,c=s?.fallback===!0&&!s.code;if(i.status!==200||!(M(s?.prize)||c))return n.claiming=null,!e.length&&i.status===503?fe():(Ye(null),n.unclaimed=!0,n.closed||ne(),null);let u=s.held&&!s.code?w.code?.():null;return u&&(s={...s,code:u}),n.claim=s,typeof s.code=="string"&&w.code?.(s.code),Ye(s),n.closed||ne(),s})()),n.claiming}async function At(e){if(!n.receipt)return N(S.spin);G(!0);let t=await fe();if(n.closed)return;if(!t)return G(!1),n.misses+=1,n.misses<2?N(S.retry):D(oe("unclaimed"));let i=t.fallback===!0&&!t.code,s=t.held?-1:r.prizes.findIndex(g=>g.key===t.prize?.key&&g.label===t.prize?.label);if(n.wheel&&s>=0&&!i){if(await n.wheel.spinTo(s),n.closed)return;O.className="e won",O.textContent=`${S.won} ${t.prize.label}`,await new Promise(g=>setTimeout(g,Ut))}if(n.closed)return;G(!1);let c=i?"fallback":s<0?"held":null,u=c?oe(c):ee(n.step,n.answers,e.next);u?D(u):ne()}function re(e){if(e.action==="close")return U("close");let t=De();return h?ie(e.next):t?N(t.error,t.input):(ae&&n.step.blocks.some(i=>n.answers[i?.question])&&V("click"),e.action==="apply"?(o.emit?.("apply",{coupon:n.claim?.code?{code:n.claim.code}:null}),V("click"),ie(e.next)):e.action==="submit"?kt(e):e.action==="spin"?At(e):ie(e.next))}function St(e){if(e.preventDefault(),E.getAttribute("aria-busy")==="true")return;let t=n.step.blocks.find(i=>i?.t==="button"&&i.action==="submit");re(t??{action:"next"})}function me(e=!1){n.closed=!0;for(let i of n.timers.splice(0))it(i);document.removeEventListener("visibilitychange",le),Q?.removeEventListener?.("change",Me);let t=()=>{try{y.open&&y.close()}catch{}T.remove()};if(e||!R||Ae())return t();y.classList.add("out"),setTimeout(t,Nt)}function U(e){n.closed||h||(We(),!n.submitted&&e!=="done"&&V("dismiss"),w.closed(r.slot),w.tab?.(r.slot,!1),me(),o.onClose?.(e))}for(let e of["pointerdown","keydown","input"])y.addEventListener(e,()=>{n.touched=!0});y.addEventListener("cancel",e=>{e.preventDefault(),U("esc")}),y.addEventListener("keydown",e=>{e.key==="Escape"&&!n.modal&&_!=="inline"&&U("esc"),e.key==="Tab"&&n.modal&&Et(e)});function Et(e){let t=[...L.querySelectorAll("input[type=radio]:checked")],i=new Set,s=[...L.querySelectorAll("a[href],button,input,select,textarea")].filter(f=>{if(f.disabled||!f.getClientRects().length)return!1;if(f.type!=="radio")return!0;let k=t.find(A=>A.name===f.name);return(k?f!==k:i.has(f.name))?!1:(i.add(f.name),!0)});if(!s.length)return;let c=e.shiftKey,u=L.activeElement;u?.type==="radio"&&(u=s.find(f=>f.type==="radio"&&f.name===u.name)??u);let g=s.indexOf(u),m=null;if(g<0){let f=k=>u&&u.compareDocumentPosition(k)&4;m=c?s.findLast(k=>!f(k))??s.at(-1):s.find(f)??s[0]}else(c?g===0:g===s.length-1)&&(m=s.at(c?-1:0));m&&(e.preventDefault(),m.focus())}se.addEventListener("pointerdown",e=>{if(!n.mobile||n.mode!=="sheet")return;let t=e.clientY,i=0,s=u=>{i=Math.max(0,u.clientY-t),$.style.transform=`translateY(${i}px)`},c=()=>{document.removeEventListener("pointermove",s),document.removeEventListener("pointerup",c),$.style.transform="",i>80&&U("close")};document.addEventListener("pointermove",s),document.addEventListener("pointerup",c)});try{D(h?.step&&a.steps.some(e=>e.id===h.step)?h.step:a.steps[0].id),(o.container??document.body).append(T),Re()}catch(e){throw me(!0),e}return{close:U,root:L,host:T,show:D,step:()=>n.step?.id??null,modal:()=>!n.closed&&n.modal,destroy:()=>!n.closed&&me()}}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render")]={mountForm:ut,warm:ze};})();
@@ -0,0 +1 @@
1
+ (()=>{function v(n,r){try{return new Intl.NumberFormat(n||void 0,{style:"currency",currency:r})}catch{return null}}var A=(n,r=0)=>r<=6&&typeof n=="object"&&!!n&&(Array.isArray(n)?n.some(o=>A(o,r+1)):typeof n.v=="string"||A(n.b??n.i??n.a,r+1));var $=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.page-values"),F=60,I=new RegExp("[\\u0000-\\u001f\\u007f-\\u009f\\u200b-\\u200f\\u202a-\\u202e\\u2060-\\u206f\\ufeff]","g"),N={basket_value:{style:"money"},basket_items:{style:"number",plural:{one:"item",other:"items"}}},M="answer.",S=["first_name"],_=[["year",31536e6],["month",2592e6],["week",6048e5],["day",864e5],["hour",36e5],["minute",6e4]];function E(n){let r=[...String(n).replace(I,"").replace(/\s+/g," ").trim()];return r.length>F?`${r.slice(0,F-1).join("").trimEnd()}\u2026`:r.join("")}function P(n){try{return Intl.getCanonicalLocales(n||[])[0]}catch{return}}var T=new Map,y=(n,r)=>(T.has(n)||T.set(n,r()),T.get(n));function d(n,r,{lang:o,currency:c,plural:h,now:a}={}){if(n==null||n==="")return null;try{if(r==="date"||r==="relative"){let t=typeof n=="number"?n:Date.parse(n);if(!Number.isFinite(t))return null;if(r==="date")return y(`date ${o}`,()=>new Intl.DateTimeFormat(o,{dateStyle:"medium"})).format(t);let u=t-(a??Date.now()),[i,s]=_.find(([,l])=>Math.abs(u)>=l)??["minute",6e4];return y(`relative ${o}`,()=>new Intl.RelativeTimeFormat(o,{numeric:"auto"})).format(Math.round(u/s),i)}if(r!=="number"&&r!=="money")return E(n)||null;if(typeof n!="number"||!Number.isFinite(n))return null;let m=r==="money"?y(`money ${o} ${c}`,()=>v(o,c)):y(`number ${o}`,()=>new Intl.NumberFormat(o));if(!m)return null;let g=m.format(n);if(!h)return g;let w=y(`plural ${o}`,()=>new Intl.PluralRules(o)).select(n)==="one";return E(`${g} ${(w?h.one:h.other)??""}`)}catch{return null}}function j(n,r,o){let c=P(n.locale||globalThis.document?.documentElement.lang),h=new Map((Array.isArray(n.questions)?n.questions:[]).map(t=>[t?.key,t])),a=null,m=()=>{if(!a){let t=globalThis.window?.[$]??o??{};a={...r.values?.()};for(let u of S)typeof t[u]=="string"&&(a[u]=t[u]);queueMicrotask(()=>{a=null})}return a},g=(t,u)=>{let i=h.get(t),{answers:s}=m();if(!i||!s)return null;let l=u?.[t]??s[t],e=(Array.isArray(l)?l:[]).flatMap(b=>{let f=i.options?.find(p=>p?.value===b)?.label;return typeof f=="string"&&f?[E(f)]:[]});if(!e.length)return null;try{return y(`list ${c}`,()=>new Intl.ListFormat(c,{type:"conjunction"})).format(e)}catch{return e.join(", ")}},w=(t,u)=>{let i=t.v,s=t.format&&typeof t.format=="object"?t.format:N[i],l=i.startsWith(M)?g(i.slice(M.length),u):m()[i];return d(l,s?.style??"text",{lang:c,currency:m().currency,plural:s?.plural})};return(t,u)=>{if(t?.t!=="heading"&&t?.t!=="text"||!A(t.text))return t;let i=!1,s=(e,b)=>{if(typeof e=="string"||b>6)return e;if(Array.isArray(e))return e.map(p=>s(p,b+1));if(!e||typeof e!="object")return e;if(typeof e.v=="string"){let p=w(e,u);return p===null&&(i=!0),p??E(e.fallback??"")}let f="b"in e?"b":"i"in e?"i":"a"in e?"a":null;return f?{...e,[f]:s(e[f],b+1)}:e},l=s(t.text,0);return i&&t.missing==="hide"?!1:{...t,text:l}}}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.values")]={fillFor:j};})();
@@ -1 +1 @@
1
- (()=>{function E(e){let s=typeof document>"u"?null:document.currentScript?.src;return s?new URL(e,s).href:null}var G=new Map;function x(e,s){return window[s]?Promise.resolve(window[s]):e?(G.has(s)||G.set(s,new Promise((n,i)=>{let u=document.createElement("script");u.src=e,u.async=!0,u.onload=()=>window[s]?n(window[s]):i(new Error(`${e} did not register`)),u.onerror=()=>i(new Error(`${e} did not load`)),document.head.append(u)}).finally(()=>G.delete(s))),G.get(s)):Promise.reject(new Error("the CDN script\u2019s own URL is unknown"))}var nt=E("onsite-answers.min.js"),ge=()=>x(nt,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.answers"));var st="/v1/capture/challenge",ot=e=>typeof e=="string"&&/^\/v1\/[\w/-]+$/.test(e)?e:st;function we(e,s={}){let n=s.fetch??globalThis.fetch?.bind(globalThis),i=s.servingHost??e.servingHost,u=s.gatewayHost??e.gatewayHost;async function r(p,{method:f="GET",body:o,consent:a=!1,timeoutMs:c}={}){if(!n)return{status:0,body:null};try{let y=await n(p,{method:f,credentials:"omit",signal:c&&AbortSignal.timeout?.(c),headers:{accept:"application/json",authorization:`Bearer ${e.writeKey}`,...o?{"content-type":"application/json"}:{},...a?e.headers():{}},...o?{body:JSON.stringify(o)}:{}}),_=null;try{_=await y.json()}catch{}return{status:y.status,body:_}}catch{return{status:0,body:null}}}return{decide:(p,f,{visitAudiences:o,visitCampaign:a,visitContext:c,timeoutMs:y=3e3}={})=>r(`${i}/v1/decisions`,{method:"POST",consent:!0,timeoutMs:Math.max(1,y),body:{slots:[f?{key:p,pin:{experiment:f[0],arm:f[1],split:f[2]}}:p],library:e.library,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}:{},...a?{visit_campaign:a}:{},...c?{visit_context:c}:{}}}),datafile:()=>r(`${i}/v1/audiences/datafile`,{timeoutMs:1500}),challenge:()=>r(`${u}${ot(s.challenge)}`),capture:p=>r(`${u}/v1/capture`,{method:"POST",body:p}),answers:p=>r(`${u}/v1/capture/answers`,{method:"POST",body:p}),claim:p=>r(`${i}/v1/offers/claim`,{method:"POST",consent:!0,body:p,timeoutMs:8e3})}}var it=E("onsite-audiences.min.js"),ye=()=>x(it,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.audiences"));function be(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 p=i();r(p),n=p;try{e().setItem(s,JSON.stringify(p))}catch{}}}}function Se(e,s=()=>!0){let n=be(()=>sessionStorage,e),i=be(()=>localStorage,e),u=()=>s()?i:n,r=()=>{let o=i.read();(o.sub!==void 0||o.k!==void 0)&&i.write(a=>{delete a.sub,delete a.k})},p=()=>s()?[n.read(),i.read()]:(r(),[n.read()]),f=(o,a)=>{var c;return o.f??(o.f={}),(c=o.f)[a]??(c[a]={}),o.f[a]};return{seen(o){let a=i.read().f?.[o]??{};return{session:n.read().f?.[o]?.n??0,lifetime:a.n??0,closedAt:a.c??null,submitted:a.s===1}},subscribed:()=>p().some(o=>o.sub===1),shown(o){n.write(a=>{let c=f(a,o);c.n=(c.n??0)+1}),i.write(a=>{let c=f(a,o);c.n=(c.n??0)+1})},closed(o,a=Date.now()){i.write(c=>{f(c,o).c=a})},tab(o,a){n.write(c=>{let y=f(c,o);a?y.t=1:delete y.t})},tabOut:o=>n.read().f?.[o]?.t===1,pin(o,a){if(a===void 0)return n.read().f?.[o]?.p??null;n.write(c=>{f(c,o).p=a})},coveredAt:()=>n.read().o??null,covered(o=Date.now()){n.write(a=>{a.o=o})},code(o,a=Date.now()){if(o===void 0){let[c]=p().flatMap(y=>y.k?[y.k]:[]).sort((y,_)=>_.at-y.at);return c&&a-c.at<14*864e5?c.c:null}return u().write(c=>{c.k={c:o,at:a}}),o},submitted(o){i.write(a=>{f(a,o).s=1}),u().write(a=>{a.sub=1})}}}var rt=E("onsite-products.min.js"),V=()=>x(rt,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.products"));var lt=E("onsite-render.min.js"),_e=()=>x(lt,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render"));var at=["source","medium","campaign","content","term"];var Ae=e=>String(e).trim().toLowerCase();function ct(e,s,n){let i=Ae(e),u=Ae(n);return s==="is"?i===u:s==="contains"&&u!==""&&i.includes(u)}function ve(e,s){return(Array.isArray(e)?e:[]).every(n=>{let i=s?.[n?.field];return!at.includes(n?.field)||typeof i!="string"?!1:[].concat(n.values??[]).some(u=>ct(i,n.match,u))})}var Me=["popup","sheet","bar","teaser","inline","fullscreen"],ut=["entry","exit","scroll","time","idle","inline","manual"],oe=e=>e!=="inline",Ie=e=>e==="popup"||e==="sheet"||e==="fullscreen",v=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),j=e=>Array.isArray(e)?e.filter(s=>typeof s=="string"):[],Ee=e=>Number.isInteger(e)&&e>=0?e:null,dt={field:null,match:null,values:[]},pt=e=>e==null?[]:Array.isArray(e)&&e.every(v)?e:[dt];function Ce(e){if(!v(e)||typeof e.slot!="string"||e.slot==="")return null;let s=v(e.trigger)?e.trigger:{};if(!Me.includes(e.format)||!ut.includes(s.type))return null;let n=v(e.caps)?e.caps:{};return{...e,trigger:s,priority:Number.isFinite(e.priority)?e.priority:0,pages:v(e.pages)?e.pages:{},devices:j(e.devices),aliases:j(e.aliases),audiences:j(e.audiences),arrived_from:pt(e.arrived_from),caps:{per_session:Ee(n.per_session),lifetime:Ee(n.lifetime),after_close_days:Number.isFinite(n.after_close_days)?n.after_close_days:null},window:v(e.window)?e.window:{},questions:Array.isArray(e.questions)?e.questions.filter(v):[],prizes:Array.isArray(e.prizes)?e.prizes.filter(v):[]}}var ft=/^[a-z][a-z0-9_-]{0,31}$/;function Oe(e){if(!v(e)||e.v!==1||!Array.isArray(e.steps))return null;let s=e.steps.filter(n=>v(n)&&ft.test(n.id)&&Array.isArray(n.blocks));return s.length===0?null:{format:Me.includes(e.format)?e.format:null,theme:v(e.theme)?e.theme:{},steps:s}}function xe(e,s){let n=String(e).split("*").map(i=>i.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(s)}function ht(e,s){let n=j(e?.include);return(!n.length||n.some(i=>xe(i,s)))&&!j(e?.exclude).some(i=>xe(i,s))}function De(e){return e.matchMedia?.("(hover: none) and (pointer: coarse)")?.matches===!0||e.innerWidth<768?"mobile":"desktop"}var Te=e=>typeof e=="string"?Date.parse(e):Number.NaN,U=e=>e.trigger.type==="manual";function ie(e,s){let n=[];ht(e.pages,s.path)||n.push("page not included"),e.devices.length&&!e.devices.includes(s.device)&&n.push(`not on ${s.device}`),ve(e.arrived_from,s.campaign)||n.push("not from its campaign");let i=Te(e.window.starts_at),u=Te(e.window.ends_at);if((s.now<i||s.now>=u)&&n.push("outside its dates"),e.audiences.length&&!s.preview&&(s.personalisation?s.audiences&&!e.audiences.some(f=>s.audiences.includes(f))&&n.push("not in its audiences"):n.push("audiences need personalisation consent")),s.preview||s.asked||U(e))return n;let{seen:r}=s,{caps:p}=e;return r.submitted&&n.push("already submitted"),e.exclude_subscribed===!0&&s.subscribed&&n.push("already subscribed"),p.per_session!==null&&r.session>=p.per_session&&n.push("per_session cap"),p.lifetime!==null&&r.lifetime>=p.lifetime&&n.push("lifetime cap"),p.after_close_days!==null&&r.closedAt&&s.now-r.closedAt<p.after_close_days*864e5&&n.push("closed recently"),n}var $e=(e,s)=>s.priority-e.priority;var mt=["mousemove","pointerdown","keydown","scroll","touchstart","wheel"];function gt(){let e=[];return{on:(i,u,r,p={passive:!0})=>{i.addEventListener(u,r,p),e.push(()=>i.removeEventListener(u,r,p))},later:(i,u)=>{let r=setTimeout(i,u);e.push(()=>clearTimeout(r))},stop:()=>{for(let i of e.splice(0))i()}}}var Ne=(e,s)=>{let n=s.documentElement.scrollHeight||0;return n>0?(e.scrollY+e.innerHeight)/n:0},wt=e=>{let s=e.activeElement;return!!(s&&(/^(INPUT|TEXTAREA|SELECT)$/.test(s.tagName)||s.isContentEditable))};function yt({on:e,later:s},n,i,u,r){let p=!1,f=!1,o=null,a=0;s(()=>{p=!0},i.delay_ms??5e3),e(r,"mousemove",c=>{c.clientY>u.innerHeight*.1&&(f=!0),o!==null&&(a=c.clientY-o),o=c.clientY}),e(r,"mouseout",c=>{p&&f&&!c.relatedTarget&&c.clientY<=0&&a<0&&!wt(r)&&n("exit")})}function bt({on:e,later:s},n,i,u,r){let p=!1,f=0,o=u.scrollY,a=Date.now(),c=null,y=null;s(()=>{p=!0},i.delay_ms??5e3),e(u,"scroll",()=>{let _=u.scrollY,T=Date.now();if(f=Math.max(f,Ne(u,r)),_<o){(!c||T-c.t>300)&&(c={y:o,t:a});let M=c.y-_;p&&f>=.3&&M>=120&&M/Math.max(1,T-c.t)>=.5&&n("exit_scroll")}else c=null;o=_,a=T}),e(r,"visibilitychange",()=>{r.visibilityState==="hidden"?y=Date.now():y!==null&&Date.now()-y>=1e4&&n("return"),r.visibilityState!=="hidden"&&(y=null)})}function Pe(e,s,{device:n,win:i=window,doc:u=document}){let r=gt(),p=(e.seconds??30)*1e3;if(e.type==="entry"&&r.later(()=>s("entry"),e.delay_ms??0),e.type==="time"&&r.later(()=>s("time"),p),e.type==="exit"&&(n==="mobile"?bt:yt)(r,s,e,i,u),e.type==="scroll"){let f=e.depth??.5;r.on(i,"scroll",()=>Ne(i,u)>=f&&s("scroll"))}if(e.type==="idle"){let f=null,o=()=>{clearTimeout(f),f=setTimeout(()=>s("idle"),p)};o();for(let a of mt)r.on(a==="scroll"?i:u,a,o);return r.on(u,"visibilitychange",o),()=>{clearTimeout(f),r.stop()}}return r.stop}var St=E("onsite-wheel.min.js"),ke=()=>x(St,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.wheel"));var Le=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite-access"),W=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite"),_t=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.pending"),At=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.listeners"),Re=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.suppressed"),Fe={seen:()=>({session:0,lifetime:0,closedAt:null,submitted:!1}),subscribed:()=>!1,shown(){},closed(){},submitted(){},tab(){},tabOut:()=>!1,pin:()=>null,coveredAt:()=>null,covered(){},code:()=>null},vt=new Set(["decision-failed","no-creative","no-code","renderer-failed","products-failed","error"]),je=3e3,Ue={status:0,body:null},Et=1500,We=50,xt=300,Tt=()=>{try{return new URLSearchParams(location.search).get("hp_debug")==="onsite"}catch{return!1}},Mt=e=>Array.isArray(e?.steps)&&e.steps.some(s=>Array.isArray(s?.blocks)&&s.blocks.some(n=>n?.t==="products"));function Ke(e,s={}){if(typeof window>"u"||typeof document>"u")return null;if(window[W])return window[W];let n=typeof e?.[Le]=="function"?e[Le]():null;if(!n)return console.warn("[hp] onsite: startOnsite needs the client bootstrap or createAnalytics made"),null;let i=s.settings??n.settings??{},u=we(n,{...s,challenge:i.capture?.challenge}),r=n.preview?Fe:Se(n.storageKey,n.personalisation),p=()=>n.campaign?.()??null,f=new Map,o=()=>window[Re]?.size>0,a=(t,l)=>{for(let d of window[At]?.[t]??[])try{d(l)}catch(h){console.warn(`[hp] onsite ${t} listener failed:`,h)}},c=De(window),y=n.debug||s.debug===!0||Tt(),_=new Map,T=new Map,M=[];for(let t of Array.isArray(i.forms)?i.forms:[]){let l=Ce(t);l?M.push(l):_.set(String(t?.slot??`form ${_.size+1}`),{slot:String(t?.slot??""),state:"invalid",code:"invalid",reasons:["not a form this SDK can show"]})}let re=()=>ye().catch(t=>(console.warn("[hp] onsite audiences not loaded:",t?.message??t),null));n.personalisation()&&M.some(t=>t.audiences.length>0)&&re().then(t=>t?.prefetch(u));let N=new Map,K=new Map,I=null,le=!1,ae=new Set,He=t=>{for(let l of N.keys()){let d=f.get(l);if(!t||!d||d.modal?.())return l}return null},H=null,q=new Set,B=Number.isInteger(i.overlay_gap_minutes)?i.overlay_gap_minutes:0,Ye=()=>{let t=r.coveredAt();if(!(B>0)||typeof t!="number")return null;let l=Math.max(0,Math.floor((Date.now()-t)/6e4));return l<B?`a popup showed ${l} min ago; ${B} min between them`:null},P=new Set,Y=new Map,b=(t,l,d,h=[])=>(_.set(t.slot,{slot:t.slot,format:t.format,trigger:t.trigger.type,priority:t.priority,state:l,code:d,reasons:h}),y&&console.info(`[hp] onsite ${t.slot}: ${l}${h.length?` (${h.join("; ")})`:""}`),{state:l,code:d}),D=(t,l,d,h)=>(N.delete(t.slot),b(t,l,d,h)),k=(t,l,d)=>{let h;return Promise.race([t,new Promise(w=>{h=setTimeout(w,l-Date.now(),d)})]).then(w=>Date.now()>l?d:w).finally(()=>clearTimeout(h))},Xe=(t,l)=>{le||o()||(I??(I=t.slot),a("nothing",{slot:t.slot,format:t.format,code:l}))},ce=()=>{try{let t=s.audiences?.();return Array.isArray(t)?t:null}catch{return null}},ue=t=>({path:location.pathname,device:c,campaign:p(),now:Date.now(),seen:r.seen(t.slot),subscribed:r.subscribed()||s.subscribed?.()===!0,personalisation:n.personalisation(),preview:!!n.preview,audiences:ce()}),J=t=>{T.get(t.slot)?.(),T.delete(t.slot)};function L(t,l,d=!1,h=U(t),w=Date.now()+je){if(f.has(t.slot))return Promise.resolve({state:"shown",code:"shown",asked:h});let g=K.get(t.slot);return g?(g.asked||(g.asked=h),g.done):(g={asked:h},g.done=ze(t,l,d,h,w).catch(A=>f.has(t.slot)?{state:"shown",code:"shown"}:(console.warn("[hp] onsite form failed:",A?.message??A),D(t,"not shown","error",[`failed: ${A?.message??A}`]))).then(A=>(K.delete(t.slot),{...A,asked:g.asked||g.opened})),K.set(t.slot,g),g.done)}async function ze(t,l,d,h,w){if(o())return b(t,"not shown","suppressed",[`suppressed: ${[...window[Re]].join(", ")}`]);let g=ie(t,{...ue(t),...d?{seen:Fe.seen()}:{},asked:h});if(g.length)return b(t,"not eligible","not-eligible",g);let A=Ie(t.format)&&!d,C=A&&!h&&Ye();if(C)return b(t,"not shown","overlay-gap",[C]);if(A&&!n.preview&&n.consentAnswered?.()===!1)return Y.set(t,h),b(t,"not shown","awaiting-consent",["waiting for the consent banner"]);let O=oe(t.format),pe=O&&He(h);if(pe)return b(t,"not shown","another-showing",[`${pe} is showing`]);if(O&&I&&!h)return b(t,"not shown","allowance-spent",[`${I} already showed on this page view`]);let X=null;if(!O){try{X=document.querySelector(t.trigger.selector??"")}catch{X=null}if(!X)return b(t,"not shown","no-element",["no element matches its selector"])}O&&N.set(t.slot,t),J(t),b(t,"asking for a decision","deciding",[l]);let Be=_e().catch(m=>(console.warn("[hp] onsite renderer not loaded:",m?.message??m),null)),z=t.visit_context===!0?V().catch(()=>null):null,Q=ce()??[],fe=[...new Set([...t.audiences,...Q])].filter(m=>Q.includes(m)).slice(0,100),Je=t.audiences.length>0&&!n.preview&&n.personalisation()?await k(re().then(m=>m?m.visitAudiences(u,n.sessionSignals,t.audiences,Q):fe),Math.min(w,Date.now()+Et),fe):null,F=Date.now()<w?await k(u.decide(t.slot,r.pin(t.slot),{visitAudiences:Je,visitCampaign:t.arrived_from.length?p():null,visitContext:t.visit_context===!0?n.visitContext?.()??null:null,timeoutMs:w-Date.now()}),w,Ue):Ue,ee=F.status===200?F.body?.decisions:null,S=Array.isArray(ee)?ee.find(m=>m?.slot===t.slot):null;S?.experiment&&S.arm&&S.split&&r.pin(t.slot,[S.experiment,S.arm,S.split]);let $=S&&S.holdout!==!0?Oe(S.payload):null,he=$?.steps[0].blocks??[],me=S?.offer?.code??(n.preview?"PREVIEW":r.code()),Ze=n.basketValue?.()??null,te=he.some(m=>m?.t==="code")&&!me&&"no code to remind of"||he.some(m=>m?.t==="progress")&&!(Ze>0)&&"the basket is empty";if(te){let m=te==="the basket is empty";return m&&P.add(t),D(t,"not shown",m?"empty-basket":"no-code",[te])}if(P.delete(t),!$){let m=S?.holdout===!0;return m&&n.analytics()&&e.recordExposure(F.body),O&&m&&(I??(I=t.slot)),m&&!h&&a("held",{slot:t.slot,arm:S.arm??null,format:t.format}),m||Array.isArray(ee)?D(t,m?"held out":"no decision",m?"held-out":"no-creative",["no creative for this visitor"]):D(t,"no decision","decision-failed",[`decisions answered ${F.status}`])}let ne=await k(Be,w,null);if(!ne)return D(t,"not shown","renderer-failed",["the renderer did not load"]);if(Mt($)&&(z??(z=V().catch(()=>null)),!await k(z,w,null)))return D(t,"not shown","products-failed",["its products did not load"]);if(await k(ne.warm?.(t,$,$.steps[0].id,ae),Math.min(w,Date.now()+xt)),o())return D(t,"not shown","suppressed",["suppressed"]);let se=(m,tt={})=>a(m,{slot:t.slot,arm:S.arm??null,format:$.format??t.format,...tt}),Qe=ne.mountForm({form:t,creative:$,decision:S,access:n,client:e,api:u,counters:r,loadWheel:ke,loadAnswers:ge,loadProducts:()=>z??V(),container:X,warmed:ae,coupon:me,basket:()=>n.basketValue?.()??null,emit:se,onClose(m){f.delete(t.slot),N.delete(t.slot),b(t,"closed","closed",[m]),se("closed",{reason:m})}});f.set(t.slot,Qe),d||r.shown(t.slot),A&&r.covered(),O&&(I??(I=t.slot)),n.analytics()&&e.recordExposure(F.body);let et=b(t,"shown","shown",[l]);return se("shown"),et}function Z(t,l,d=U(t)){if(!oe(t.format))return L(t,l,!1,d);if(!H){let h={forms:[],taken:new Set,deadline:Date.now()+We+je};H=h,q.add(h),setTimeout(()=>{H=null,Ge(h)},We)}H.forms.push([t,l,d])}async function Ge(t){let l=t.forms.sort(([h],[w])=>$e(h,w)),d=null;for(let[h,[w,g,A]]of l.entries()){if(t.taken.has(w))continue;let C=await L(w,g,!1,A,t.deadline);if(!d&&vt.has(C.code)&&!C.asked&&(d=[w,C.code]),C.state==="shown"||C.state==="held out"){for(let[O]of l.slice(h+1))b(O,"not shown","lower-priority",[`${w.slot} has a higher priority`]);d=null;break}}q.delete(t),d&&Xe(...d)}for(let t of M){if(t.format==="teaser"&&r.tabOut(t.slot)){L(t,"tab kept from an earlier page",!0);continue}let l=ie(t,ue(t));if(l.length){b(t,"not eligible","not-eligible",l);continue}let d=t.trigger.type;d==="manual"?b(t,"waiting for hp.onsite.open","waiting-for-open"):d==="inline"||t.format==="inline"?L(t,"inline"):de(t)}function de(t){J(t),T.set(t.slot,Pe(t.trigger,l=>{J(t),Z(t,l)},{device:c})),b(t,"armed","armed",[`${t.trigger.type} on ${c}`])}let Ve=n.onConsentAnswered?.(()=>{let t=[...Y];Y.clear();for(let[l,d]of t)f.has(l.slot)||(d?Z(l,"manual",d):de(l))}),qe=n.onBasket?.(()=>{if(!((n.basketValue?.()??0)>0))return;let t=[...P];P.clear();for(let l of t)f.has(l.slot)||Z(l,"the basket changed")}),R=Object.freeze({open(t){let l=M.find(g=>g.slot===t),d=l??M.find(g=>g.aliases.includes(t));if(!d)return Promise.resolve(!1);if(f.has(d.slot))return Promise.resolve(!0);for(let g of q)g.taken.add(d);let h=L(d,"manual",!1,U(d)||!l),w=K.get(d.slot);return w&&(w.opened=!0),h.then(({state:g})=>g==="shown")},suppress(){for(let[t,l]of f){l.destroy(),f.delete(t),N.delete(t);let d=M.find(h=>h.slot===t);d&&b(d,"closed","suppressed",["suppressed"])}},debug:()=>[..._.values()].map(t=>({...t,reasons:[...t.reasons]})),stop(){le=!0;for(let t of T.values())t();T.clear(),qe?.(),Ve?.(),P.clear(),Y.clear(),window[W]===R&&delete window[W]}});window[W]=R;for(let{slot:t,resolve:l}of window[_t]?.splice(0)??[])l(R.open(t));return y&&console.table?.(R.debug()),R}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.module")]={startOnsite:Ke};})();
1
+ (()=>{function E(e){let s=typeof document>"u"?null:document.currentScript?.src;return s?new URL(e,s).href:null}var z=new Map;function T(e,s){return window[s]?Promise.resolve(window[s]):e?(z.has(s)||z.set(s,new Promise((n,i)=>{let p=document.createElement("script");p.src=e,p.async=!0,p.onload=()=>window[s]?n(window[s]):i(new Error(`${e} did not register`)),p.onerror=()=>i(new Error(`${e} did not load`)),document.head.append(p)}).finally(()=>z.delete(s))),z.get(s)):Promise.reject(new Error("the CDN script\u2019s own URL is unknown"))}var ct=E("onsite-answers.min.js"),be=()=>T(ct,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.answers"));var ut="/v1/capture/challenge",dt=e=>typeof e=="string"&&/^\/v1\/[\w/-]+$/.test(e)?e:ut;function _e(e,s={}){let n=s.fetch??globalThis.fetch?.bind(globalThis),i=s.servingHost??e.servingHost,p=s.gatewayHost??e.gatewayHost;async function l(c,{method:o="GET",body:r,consent:u=!1,timeoutMs:y}={}){if(!n)return{status:0,body:null};try{let _=await n(c,{method:o,credentials:"omit",signal:y&&AbortSignal.timeout?.(y),headers:{accept:"application/json",authorization:`Bearer ${e.writeKey}`,...r?{"content-type":"application/json"}:{},...u?e.headers():{}},...r?{body:JSON.stringify(r)}:{}}),A=null;try{A=await _.json()}catch{}return{status:_.status,body:A}}catch{return{status:0,body:null}}}let m=(c,o)=>l(`${p}/v1/capture${c}`,{method:"POST",body:o}).then(r=>(r.status>=200&&r.status<300&&e.answered?.(o.answers,o.slot),r));return{decide:(c,o,{visitAudiences:r,visitCampaign:u,visitContext:y,timeoutMs:_=3e3}={})=>l(`${i}/v1/decisions`,{method:"POST",consent:!0,timeoutMs:Math.max(1,_),body:{slots:[o?{key:c,pin:{experiment:o[0],arm:o[1],split:o[2]}}:c],library:e.library,identifier_value:e.anonymousId()??void 0,session_id:e.sessionId()??void 0,identity_token:e.identityToken?.()??void 0,...e.preview?{preview:e.preview}:{},...r&&{visit_audiences:r.claims,...r.answered?.length&&{answered_audiences:r.answered}},...u?{visit_campaign:u}:{},...y?{visit_context:y}:{}}}),datafile:()=>l(`${i}/v1/audiences/datafile`,{timeoutMs:1500}),challenge:()=>l(`${p}${dt(s.challenge)}`),capture:c=>m("",c),answers:c=>m("/answers",c),claim:c=>l(`${i}/v1/offers/claim`,{method:"POST",consent:!0,body:c,timeoutMs:8e3})}}var pt=E("onsite-audiences.min.js"),Se=()=>T(pt,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.audiences"));function Ae(e,s){let n={},i=()=>{try{let l=JSON.parse(e().getItem(s));l&&typeof l=="object"&&(n=l)}catch{}return n};return{read:i,write:l=>{let m=i();l(m),n=m;try{e().setItem(s,JSON.stringify(m))}catch{}}}}function ve(e,s=()=>!0){let n=Ae(()=>sessionStorage,e),i=Ae(()=>localStorage,e),p=()=>s()?i:n,l=()=>{let o=i.read();(o.sub!==void 0||o.k!==void 0)&&i.write(r=>{delete r.sub,delete r.k})},m=()=>s()?[n.read(),i.read()]:(l(),[n.read()]),c=(o,r)=>{var u;return o.f??(o.f={}),(u=o.f)[r]??(u[r]={}),o.f[r]};return{seen(o){let r=i.read().f?.[o]??{};return{session:n.read().f?.[o]?.n??0,lifetime:r.n??0,closedAt:r.c??null,submitted:r.s===1}},subscribed:()=>m().some(o=>o.sub===1),shown(o){n.write(r=>{let u=c(r,o);u.n=(u.n??0)+1}),i.write(r=>{let u=c(r,o);u.n=(u.n??0)+1})},closed(o,r=Date.now()){i.write(u=>{c(u,o).c=r})},tab(o,r){n.write(u=>{let y=c(u,o);r?y.t=1:delete y.t})},tabOut:o=>n.read().f?.[o]?.t===1,pin(o,r){if(r===void 0)return n.read().f?.[o]?.p??null;n.write(u=>{c(u,o).p=r})},coveredAt:()=>n.read().o??null,covered(o=Date.now()){n.write(r=>{r.o=o})},code(o,r=Date.now()){if(o===void 0){let[u]=m().flatMap(y=>y.k?[y.k]:[]).sort((y,_)=>_.at-y.at);return u&&r-u.at<14*864e5?u.c:null}return p().write(u=>{u.k={c:o,at:r}}),o},submitted(o){i.write(r=>{c(r,o).s=1}),p().write(r=>{r.sub=1})}}}var ft=E("onsite-products.min.js"),G=()=>T(ft,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.products"));var ht=E("onsite-render.min.js"),Ee=()=>T(ht,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render"));var q=(e,s=0)=>s<=6&&typeof e=="object"&&!!e&&(Array.isArray(e)?e.some(n=>q(n,s+1)):typeof e.v=="string"||q(e.b??e.i??e.a,s+1));var mt=["source","medium","campaign","content","term"];var Te=e=>String(e).trim().toLowerCase();function gt(e,s,n){let i=Te(e),p=Te(n);return s==="is"?i===p:s==="contains"&&p!==""&&i.includes(p)}function xe(e,s){return(Array.isArray(e)?e:[]).every(n=>{let i=s?.[n?.field];return!mt.includes(n?.field)||typeof i!="string"?!1:[].concat(n.values??[]).some(p=>gt(i,n.match,p))})}var De=["popup","sheet","bar","teaser","inline","fullscreen"],wt=["entry","exit","scroll","time","idle","inline","manual"],ie=e=>e!=="inline",Oe=e=>e==="popup"||e==="sheet"||e==="fullscreen",x=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),j=e=>Array.isArray(e)?e.filter(s=>typeof s=="string"):[],Me=e=>Number.isInteger(e)&&e>=0?e:null,yt={field:null,match:null,values:[]},bt=e=>e==null?[]:Array.isArray(e)&&e.every(x)?e:[yt];function Pe(e){if(!x(e)||typeof e.slot!="string"||e.slot==="")return null;let s=x(e.trigger)?e.trigger:{};if(!De.includes(e.format)||!wt.includes(s.type))return null;let n=x(e.caps)?e.caps:{};return{...e,trigger:s,priority:Number.isFinite(e.priority)?e.priority:0,pages:x(e.pages)?e.pages:{},devices:j(e.devices),aliases:j(e.aliases),audiences:j(e.audiences),arrived_from:bt(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:x(e.window)?e.window:{},questions:Array.isArray(e.questions)?e.questions.filter(x):[],prizes:Array.isArray(e.prizes)?e.prizes.filter(x):[]}}var _t=/^[a-z][a-z0-9_-]{0,31}$/;function Ne(e){if(!x(e)||e.v!==1||!Array.isArray(e.steps))return null;let s=e.steps.filter(n=>x(n)&&_t.test(n.id)&&Array.isArray(n.blocks));return s.length===0?null:{format:De.includes(e.format)?e.format:null,theme:x(e.theme)?e.theme:{},steps:s}}function Ie(e,s){let n=String(e).split("*").map(i=>i.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(s)}function St(e,s){let n=j(e?.include);return(!n.length||n.some(i=>Ie(i,s)))&&!j(e?.exclude).some(i=>Ie(i,s))}function $e(e){return e.matchMedia?.("(hover: none) and (pointer: coarse)")?.matches===!0||e.innerWidth<768?"mobile":"desktop"}var Ce=e=>typeof e=="string"?Date.parse(e):Number.NaN,U=e=>e.trigger.type==="manual";function le(e,s){let n=[];St(e.pages,s.path)||n.push("page not included"),e.devices.length&&!e.devices.includes(s.device)&&n.push(`not on ${s.device}`),xe(e.arrived_from,s.campaign)||n.push("not from its campaign");let i=Ce(e.window.starts_at),p=Ce(e.window.ends_at);if((s.now<i||s.now>=p)&&n.push("outside its dates"),e.audiences.length&&!s.preview&&(s.personalisation?s.audiences&&!e.audiences.some(c=>s.audiences.includes(c))&&n.push("not in its audiences"):n.push("audiences need personalisation consent")),s.preview||s.asked||U(e))return n;let{seen:l}=s,{caps:m}=e;return l.submitted&&n.push("already submitted"),e.exclude_subscribed===!0&&s.subscribed&&n.push("already subscribed"),m.per_session!==null&&l.session>=m.per_session&&n.push("per_session cap"),m.lifetime!==null&&l.lifetime>=m.lifetime&&n.push("lifetime cap"),m.after_close_days!==null&&l.closedAt&&s.now-l.closedAt<m.after_close_days*864e5&&n.push("closed recently"),n}var ke=(e,s)=>s.priority-e.priority;var At=["mousemove","pointerdown","keydown","scroll","touchstart","wheel"];function vt(){let e=[];return{on:(i,p,l,m={passive:!0})=>{i.addEventListener(p,l,m),e.push(()=>i.removeEventListener(p,l,m))},later:(i,p)=>{let l=setTimeout(i,p);e.push(()=>clearTimeout(l))},stop:()=>{for(let i of e.splice(0))i()}}}var Le=(e,s)=>{let n=s.documentElement.scrollHeight||0;return n>0?(e.scrollY+e.innerHeight)/n:0},Et=e=>{let s=e.activeElement;return!!(s&&(/^(INPUT|TEXTAREA|SELECT)$/.test(s.tagName)||s.isContentEditable))};function Tt({on:e,later:s},n,i,p,l){let m=!1,c=!1,o=null,r=0;s(()=>{m=!0},i.delay_ms??5e3),e(l,"mousemove",u=>{u.clientY>p.innerHeight*.1&&(c=!0),o!==null&&(r=u.clientY-o),o=u.clientY}),e(l,"mouseout",u=>{m&&c&&!u.relatedTarget&&u.clientY<=0&&r<0&&!Et(l)&&n("exit")})}function xt({on:e,later:s},n,i,p,l){let m=!1,c=0,o=p.scrollY,r=Date.now(),u=null,y=null;s(()=>{m=!0},i.delay_ms??5e3),e(p,"scroll",()=>{let _=p.scrollY,A=Date.now();if(c=Math.max(c,Le(p,l)),_<o){(!u||A-u.t>300)&&(u={y:o,t:r});let M=u.y-_;m&&c>=.3&&M>=120&&M/Math.max(1,A-u.t)>=.5&&n("exit_scroll")}else u=null;o=_,r=A}),e(l,"visibilitychange",()=>{l.visibilityState==="hidden"?y=Date.now():y!==null&&Date.now()-y>=1e4&&n("return"),l.visibilityState!=="hidden"&&(y=null)})}function Re(e,s,{device:n,win:i=window,doc:p=document}){let l=vt(),m=(e.seconds??30)*1e3;if(e.type==="entry"&&l.later(()=>s("entry"),e.delay_ms??0),e.type==="time"&&l.later(()=>s("time"),m),e.type==="exit"&&(n==="mobile"?xt:Tt)(l,s,e,i,p),e.type==="scroll"){let c=e.depth??.5;l.on(i,"scroll",()=>Le(i,p)>=c&&s("scroll"))}if(e.type==="idle"){let c=null,o=()=>{clearTimeout(c),c=setTimeout(()=>s("idle"),m)};o();for(let r of At)l.on(r==="scroll"?i:p,r,o);return l.on(p,"visibilitychange",o),()=>{clearTimeout(c),l.stop()}}return l.stop}var Mt=E("onsite-values.min.js"),Fe=()=>T(Mt,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.values"));var It=E("onsite-wheel.min.js"),je=()=>T(It,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.wheel"));var Ue=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite-access"),H=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite"),Ct=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.pending"),Dt=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.listeners"),He=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.suppressed"),We={seen:()=>({session:0,lifetime:0,closedAt:null,submitted:!1}),subscribed:()=>!1,shown(){},closed(){},submitted(){},tab(){},tabOut:()=>!1,pin:()=>null,coveredAt:()=>null,covered(){},code:()=>null},Ot=new Set(["decision-failed","no-creative","no-code","renderer-failed","products-failed","values-failed","error"]),Xe=3e3,Ke={status:0,body:null},Pt=1500,Ve=50,Nt=300,$t=()=>{try{return new URLSearchParams(location.search).get("hp_debug")==="onsite"}catch{return!1}},Ye=(e,s)=>e.steps.some(n=>n.blocks.some(s));function ze(e,s={}){if(typeof window>"u"||typeof document>"u")return null;if(window[H])return window[H];let n=typeof e?.[Ue]=="function"?e[Ue]():null;if(!n)return console.warn("[hp] onsite: startOnsite needs the client bootstrap or createAnalytics made"),null;let i=s.settings??n.settings??{};n.started?.(i);let p=_e(n,{...s,challenge:i.capture?.challenge}),l=n.preview?We:ve(n.storageKey,n.personalisation),m=()=>n.campaign?.()??null,c=new Map,o=()=>window[He]?.size>0,r=(t,a)=>{for(let d of window[Dt]?.[t]??[])try{d(a)}catch(f){console.warn(`[hp] onsite ${t} listener failed:`,f)}},u=$e(window),y=n.debug||s.debug===!0||$t(),_=new Map,A=new Map,M=[];for(let t of Array.isArray(i.forms)?i.forms:[]){let a=Pe(t);a?M.push(a):_.set(String(t?.slot??`form ${_.size+1}`),{slot:String(t?.slot??""),state:"invalid",code:"invalid",reasons:["not a form this SDK can show"]})}let ae=()=>Se().catch(t=>(console.warn("[hp] onsite audiences not loaded:",t?.message??t),null));n.personalisation()&&M.some(t=>t.audiences.length>0)&&ae().then(t=>t?.prefetch(p));let $=new Map,W=new Map,I=null,ce=!1,ue=new Set,Ge=t=>{for(let a of $.keys()){let d=c.get(a);if(!t||!d||d.modal?.())return a}return null},X=null,B=new Set,J=Number.isInteger(i.overlay_gap_minutes)?i.overlay_gap_minutes:0,qe=()=>{let t=l.coveredAt();if(!(J>0)||typeof t!="number")return null;let a=Math.max(0,Math.floor((Date.now()-t)/6e4));return a<J?`a popup showed ${a} min ago; ${J} min between them`:null},k=new Set,K=new Map,b=(t,a,d,f=[])=>(_.set(t.slot,{slot:t.slot,format:t.format,trigger:t.trigger.type,priority:t.priority,state:a,code:d,reasons:f}),y&&console.info(`[hp] onsite ${t.slot}: ${a}${f.length?` (${f.join("; ")})`:""}`),{state:a,code:d}),C=(t,a,d,f)=>($.delete(t.slot),b(t,a,d,f)),N=(t,a,d)=>{let f;return Promise.race([t,new Promise(g=>{f=setTimeout(g,a-Date.now(),d)})]).then(g=>Date.now()>a?d:g).finally(()=>clearTimeout(f))},Be=(t,a)=>{ce||o()||(I??(I=t.slot),r("nothing",{slot:t.slot,format:t.format,code:a}))},de=()=>{try{let t=s.audiences?.();return Array.isArray(t)?t:null}catch{return null}},pe=t=>({path:location.pathname,device:u,campaign:m(),now:Date.now(),seen:l.seen(t.slot),subscribed:l.subscribed()||s.subscribed?.()===!0,personalisation:n.personalisation(),preview:!!n.preview,audiences:de()}),Z=t=>{A.get(t.slot)?.(),A.delete(t.slot)};function L(t,a,d=!1,f=U(t),g=Date.now()+Xe){if(c.has(t.slot))return Promise.resolve({state:"shown",code:"shown",asked:f});let w=W.get(t.slot);return w?(w.asked||(w.asked=f),w.done):(w={asked:f},w.done=Je(t,a,d,f,g).catch(v=>c.has(t.slot)?{state:"shown",code:"shown"}:(console.warn("[hp] onsite form failed:",v?.message??v),C(t,"not shown","error",[`failed: ${v?.message??v}`]))).then(v=>(W.delete(t.slot),{...v,asked:w.asked||w.opened})),W.set(t.slot,w),w.done)}async function Je(t,a,d,f,g){if(o())return b(t,"not shown","suppressed",[`suppressed: ${[...window[He]].join(", ")}`]);let w=le(t,{...pe(t),...d?{seen:We.seen()}:{},asked:f});if(w.length)return b(t,"not eligible","not-eligible",w);let v=Oe(t.format)&&!d,D=v&&!f&&qe();if(D)return b(t,"not shown","overlay-gap",[D]);if(v&&!n.preview&&n.consentAnswered?.()===!1)return K.set(t,f),b(t,"not shown","awaiting-consent",["waiting for the consent banner"]);let O=ie(t.format),he=O&&Ge(f);if(he)return b(t,"not shown","another-showing",[`${he} is showing`]);if(O&&I&&!f)return b(t,"not shown","allowance-spent",[`${I} already showed on this page view`]);let V=null;if(!O){try{V=document.querySelector(t.trigger.selector??"")}catch{V=null}if(!V)return b(t,"not shown","no-element",["no element matches its selector"])}O&&$.set(t.slot,t),Z(t),b(t,"asking for a decision","deciding",[a]);let tt=Ee().catch(h=>(console.warn("[hp] onsite renderer not loaded:",h?.message??h),null)),Y=t.visit_context===!0?G().catch(()=>null):null,ee=de()??[],me={claims:[...new Set([...t.audiences,...ee])].filter(h=>ee.includes(h)).slice(0,100)},nt=t.audiences.length>0&&!n.preview&&n.personalisation()?await N(ae().then(h=>h?h.visitAudiences(p,n.sessionSignals,t.audiences,ee):me),Math.min(g,Date.now()+Pt),me):null,F=Date.now()<g?await N(p.decide(t.slot,l.pin(t.slot),{visitAudiences:nt,visitCampaign:t.arrived_from.length?m():null,visitContext:t.visit_context===!0?n.visitContext?.()??null:null,timeoutMs:g-Date.now()}),g,Ke):Ke,te=F.status===200?F.body?.decisions:null,S=Array.isArray(te)?te.find(h=>h?.slot===t.slot):null;S?.experiment&&S.arm&&S.split&&l.pin(t.slot,[S.experiment,S.arm,S.split]);let P=S&&S.holdout!==!0?Ne(S.payload):null,ge=P?.steps[0].blocks??[],we=S?.offer?.code??(n.preview?"PREVIEW":l.code()),st=n.basketValue?.()??null,ne=ge.some(h=>h?.t==="code")&&!we&&"no code to remind of"||ge.some(h=>h?.t==="progress")&&!(st>0)&&"the basket is empty";if(ne){let h=ne==="the basket is empty";return h&&k.add(t),C(t,"not shown",h?"empty-basket":"no-code",[ne])}if(k.delete(t),!P){let h=S?.holdout===!0;return h&&n.analytics()&&e.recordExposure(F.body),O&&h&&(I??(I=t.slot)),h&&!f&&r("held",{slot:t.slot,arm:S.arm??null,format:t.format}),h||Array.isArray(te)?C(t,h?"held out":"no decision",h?"held-out":"no-creative",["no creative for this visitor"]):C(t,"no decision","decision-failed",[`decisions answered ${F.status}`])}let se=await N(tt,g,null);if(!se)return C(t,"not shown","renderer-failed",["the renderer did not load"]);let ye=Ye(P,h=>h?.t==="products");ye&&(Y??(Y=G().catch(()=>null)));let ot=N(se.warm?.(t,P,P.steps[0].id,ue),Math.min(g,Date.now()+Nt)),[rt,oe]=await Promise.all([!ye||N(Y,g,null),Ye(P,h=>(h?.t==="heading"||h?.t==="text")&&q(h.text))&&N(Fe().catch(()=>null),g,null)]);if(!rt)return C(t,"not shown","products-failed",["its products did not load"]);if(oe===null)return C(t,"not shown","values-failed",["its values did not load"]);if(await ot,o())return C(t,"not shown","suppressed",["suppressed"]);let re=(h,at={})=>r(h,{slot:t.slot,arm:S.arm??null,format:P.format??t.format,...at}),it=se.mountForm({form:t,creative:P,decision:S,access:n,client:e,api:p,counters:l,loadWheel:je,loadAnswers:be,loadProducts:()=>Y??G(),container:V,warmed:ue,coupon:we,basket:()=>n.basketValue?.()??null,fill:oe?oe.fillFor(t,n,s.values):void 0,emit:re,onClose(h){c.delete(t.slot),$.delete(t.slot),b(t,"closed","closed",[h]),re("closed",{reason:h})}});c.set(t.slot,it),d||l.shown(t.slot),v&&l.covered(),O&&(I??(I=t.slot)),n.analytics()&&e.recordExposure(F.body);let lt=b(t,"shown","shown",[a]);return re("shown"),lt}function Q(t,a,d=U(t)){if(!ie(t.format))return L(t,a,!1,d);if(!X){let f={forms:[],taken:new Set,deadline:Date.now()+Ve+Xe};X=f,B.add(f),setTimeout(()=>{X=null,Ze(f)},Ve)}X.forms.push([t,a,d])}async function Ze(t){let a=t.forms.sort(([f],[g])=>ke(f,g)),d=null;for(let[f,[g,w,v]]of a.entries()){if(t.taken.has(g))continue;let D=await L(g,w,!1,v,t.deadline);if(!d&&Ot.has(D.code)&&!D.asked&&(d=[g,D.code]),D.state==="shown"||D.state==="held out"){for(let[O]of a.slice(f+1))b(O,"not shown","lower-priority",[`${g.slot} has a higher priority`]);d=null;break}}B.delete(t),d&&Be(...d)}for(let t of M){if(t.format==="teaser"&&l.tabOut(t.slot)){L(t,"tab kept from an earlier page",!0);continue}let a=le(t,pe(t));if(a.length){b(t,"not eligible","not-eligible",a);continue}let d=t.trigger.type;d==="manual"?b(t,"waiting for hp.onsite.open","waiting-for-open"):d==="inline"||t.format==="inline"?L(t,"inline"):fe(t)}function fe(t){Z(t),A.set(t.slot,Re(t.trigger,a=>{Z(t),Q(t,a)},{device:u})),b(t,"armed","armed",[`${t.trigger.type} on ${u}`])}let Qe=n.onConsentAnswered?.(()=>{let t=[...K];K.clear();for(let[a,d]of t)c.has(a.slot)||(d?Q(a,"manual",d):fe(a))}),et=n.onBasket?.(()=>{if(!((n.basketValue?.()??0)>0))return;let t=[...k];k.clear();for(let a of t)c.has(a.slot)||Q(a,"the basket changed")}),R=Object.freeze({open(t){let a=M.find(w=>w.slot===t),d=a??M.find(w=>w.aliases.includes(t));if(!d)return Promise.resolve(!1);if(c.has(d.slot))return Promise.resolve(!0);for(let w of B)w.taken.add(d);let f=L(d,"manual",!1,U(d)||!a),g=W.get(d.slot);return g&&(g.opened=!0),f.then(({state:w})=>w==="shown")},suppress(){for(let[t,a]of c){a.destroy(),c.delete(t),$.delete(t);let d=M.find(f=>f.slot===t);d&&b(d,"closed","suppressed",["suppressed"])}},debug:()=>[..._.values()].map(t=>({...t,reasons:[...t.reasons]})),stop(){ce=!0;for(let t of A.values())t();A.clear(),et?.(),Qe?.(),k.clear(),K.clear(),window[H]===R&&delete window[H]}});window[H]=R;for(let{slot:t,resolve:a}of window[Ct]?.splice(0)??[])a(R.open(t));return y&&console.table?.(R.debug()),R}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.module")]={startOnsite:ze};})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thg-agentic/hyper-personalisation-web",
3
- "version": "3.30.0",
3
+ "version": "3.32.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",
@@ -62,7 +62,8 @@
62
62
  "dist/onsite-wheel.min.js",
63
63
  "dist/onsite-products.min.js",
64
64
  "dist/onsite-answers.min.js",
65
- "dist/onsite-audiences.min.js"
65
+ "dist/onsite-audiences.min.js",
66
+ "dist/onsite-values.min.js"
66
67
  ],
67
68
  "sideEffects": false,
68
69
  "license": "MIT",
@@ -0,0 +1,101 @@
1
+ /**
2
+ * The answers this shopper gave a property's onsite forms, kept on the device under personalisation
3
+ * consent only, so an early audience (ADR 0064) is decided as they answer, before the warehouse has
4
+ * the answer. The latest answer to each question counts, as in the warehouse, for 90 days from
5
+ * when it was given. Cleared with the visit: a refusal or withdrawal, a sign-out, another user
6
+ * signing in. Never contact data: a question's key and the option values chosen.
7
+ */
8
+
9
+ import { forgetEveryScope, storageKey, storageName } from './storage-scope.js';
10
+
11
+ const KEEP_MS = 90 * 24 * 60 * 60 * 1000;
12
+ const MAX_QUESTIONS = 50;
13
+ const MAX_VALUES = 20;
14
+ const MAX_TEXT = 128;
15
+
16
+ const keyOf = (propertyId) => storageKey(storageName('answers'), propertyId);
17
+ const text = (v) => typeof v === 'string' && v !== '' && v.length <= MAX_TEXT;
18
+
19
+ /** `[{ q, v, at }]`, newest last, without the lapsed or malformed. */
20
+ function kept(propertyId, now) {
21
+ try {
22
+ const list = JSON.parse(localStorage.getItem(keyOf(propertyId)));
23
+ return Array.isArray(list)
24
+ ? list.filter(
25
+ (a) =>
26
+ text(a?.q) &&
27
+ Array.isArray(a.v) &&
28
+ a.v.every(text) &&
29
+ now - a.at < KEEP_MS,
30
+ )
31
+ : [];
32
+ } catch {
33
+ return [];
34
+ }
35
+ }
36
+
37
+ /** The answers kept for this property, by question: `{ shopping_for: ['womens'] }`. */
38
+ export function readAnswers(propertyId, now = Date.now()) {
39
+ return Object.fromEntries(kept(propertyId, now).map((a) => [a.q, a.v]));
40
+ }
41
+
42
+ /**
43
+ * Only answers to a choice question of the form (`one` or `many`, from its settings' `questions`),
44
+ * and of those only its option values: never a date, a number or anything typed.
45
+ */
46
+ export function choiceAnswers(answers, questions) {
47
+ const asked = Array.isArray(questions) ? questions : [];
48
+ return (Array.isArray(answers) ? answers : []).flatMap((a) => {
49
+ const q = asked.find((x) => x?.key === a?.question);
50
+ if (!q || (q.type !== 'one' && q.type !== 'many')) return [];
51
+ const options = new Set((q.options ?? []).map((o) => o?.value));
52
+ const values = (Array.isArray(a.values) ? a.values : []).filter((v) =>
53
+ options.has(v),
54
+ );
55
+ return values.length ? [{ question: a.question, values }] : [];
56
+ });
57
+ }
58
+
59
+ /** Keep `answers` (`[{ question, values }]`), each replacing that question's earlier answer. */
60
+ export function rememberAnswers(propertyId, answers, now = Date.now()) {
61
+ const given = (Array.isArray(answers) ? answers : []).filter(
62
+ (a) => text(a?.question) && Array.isArray(a.values),
63
+ );
64
+ if (!given.length) return;
65
+ const asked = new Set(given.map((a) => a.question));
66
+ const next = [
67
+ ...kept(propertyId, now).filter((a) => !asked.has(a.q)),
68
+ ...given.map((a) => ({
69
+ q: a.question,
70
+ v: a.values.filter(text).slice(0, MAX_VALUES),
71
+ at: now,
72
+ })),
73
+ ].slice(-MAX_QUESTIONS);
74
+ try {
75
+ forgotten.delete(propertyId);
76
+ localStorage.setItem(keyOf(propertyId), JSON.stringify(next));
77
+ } catch {
78
+ // Quota or a disabled store: an early audience then waits for the warehouse.
79
+ }
80
+ }
81
+
82
+ /** The properties whose answers this page has removed, and written none since. */
83
+ const forgotten = new Set();
84
+
85
+ /**
86
+ * Forget the answers: `propertyId`'s, once a page while nothing new is kept (an event from a visitor
87
+ * without the grant); with none, every property's on the device (a consent change, a sign-out).
88
+ */
89
+ export function forgetAnswers(propertyId) {
90
+ if (propertyId === undefined) {
91
+ forgetEveryScope('answers');
92
+ forgotten.clear();
93
+ } else if (!forgotten.has(propertyId)) {
94
+ try {
95
+ localStorage.removeItem(keyOf(propertyId));
96
+ } catch {
97
+ // Nothing was stored.
98
+ }
99
+ forgotten.add(propertyId);
100
+ }
101
+ }
package/src/index.js CHANGED
@@ -42,11 +42,18 @@
42
42
  * trackRecommendationRails(analytics);
43
43
  */
44
44
 
45
+ import {
46
+ choiceAnswers,
47
+ forgetAnswers,
48
+ readAnswers,
49
+ rememberAnswers,
50
+ } from './answer-memory.js';
45
51
  import { assignmentSession, surfaceExposureToken } from './assignment.js';
46
52
  import { hostConsent, servingHeaders } from './consent.js';
47
53
  import { createConsentGate } from './consent-gate.js';
48
54
  import {
49
55
  buildContext,
56
+ currencyCode,
50
57
  getCookie,
51
58
  localeTag,
52
59
  perRequest,
@@ -70,7 +77,7 @@ import {
70
77
  recommendationContextFrom,
71
78
  } from './recommendation-context.js';
72
79
  import { sampledIn } from './sampling.js';
73
- import { recordSessionEvent } from './session/record.js';
80
+ import { basketItemsOf, recordSessionEvent } from './session/record.js';
74
81
  import {
75
82
  clearSessionSignals,
76
83
  getSessionSignals,
@@ -535,6 +542,9 @@ export function createAnalytics(options) {
535
542
  * Noted before the plan, the sample or beforeSend can drop the event.
536
543
  */
537
544
  let pageBasket = null;
545
+ /** How many items it holds, when its lines say, and its currency, when it names one. */
546
+ let pageItems = null;
547
+ let pageCurrency = null;
538
548
  /** The product this page is about: the last Product Viewed it sent, for an onsite form's products. */
539
549
  let pageProduct = null;
540
550
  const basketListeners = new Set();
@@ -549,6 +559,9 @@ export function createAnalytics(options) {
549
559
  }
550
560
  if (partial.type !== 'track' || partial.event !== 'Cart Updated') return;
551
561
  const value = partial.properties?.value;
562
+ const lines = partial.properties?.products;
563
+ pageItems = Array.isArray(lines) ? basketItemsOf(lines) : null;
564
+ pageCurrency = currencyCode(partial.properties?.currency);
552
565
  pageBasket =
553
566
  typeof value === 'number' && Number.isFinite(value) && value >= 0
554
567
  ? value
@@ -669,6 +682,8 @@ export function createAnalytics(options) {
669
682
  setSessionScope(perRequest(cfg.getSessionId, null), cfg.propertyId);
670
683
 
671
684
  let visitKept = false;
685
+ /** The settings the onsite runtime started on, once it has (`started`). */
686
+ let onsiteSettings = null;
672
687
 
673
688
  /** What `recommendationContext()` reads: the products and searches of the events sent. */
674
689
  function recordVisit(event) {
@@ -684,10 +699,17 @@ export function createAnalytics(options) {
684
699
  // A page view changes nothing a rail reads, so it does not extend what is kept for one.
685
700
  if (event.type === 'track')
686
701
  keepVisit(recommendationContextFrom(signals));
702
+ // What the shopper answered a form, for an early audience on the next page (ADR 0064). Kept as
703
+ // it is reported, as every other part of the visit is, not when the batch is delivered.
704
+ if (
705
+ event.event === 'Preferences Stated' &&
706
+ event.properties?.source === 'onsite'
707
+ )
708
+ keepAnswers([event.properties], event.properties.slot);
687
709
  visitKept = true;
688
710
  } else {
689
711
  // Not allowed, or withdrawn: what was kept under the permission goes with it.
690
- forgetKeptVisit();
712
+ forgetKeptVisit(false, cfg.propertyId ?? null);
691
713
  }
692
714
  } catch (err) {
693
715
  if (cfg.debug) console.warn('[hp] the visit was not recorded', err);
@@ -695,11 +717,25 @@ export function createAnalytics(options) {
695
717
  }
696
718
 
697
719
  /**
698
- * What the visit built up for recommendations, kept only under personalisation consent. The
699
- * session signals are cleared only when this SDK built them, unless `all`: a refusal or a sign-out.
720
+ * A form's choice answers, kept under personalisation consent, its questions read from the settings
721
+ * the onsite runtime started on (refreshed since the page's own), or the page's before it starts.
700
722
  */
701
- function forgetKeptVisit(all = false) {
723
+ function keepAnswers(answers, slot) {
724
+ const form = (onsiteSettings ?? cfg.onsite)?.forms?.find?.(
725
+ (f) => f?.slot === slot,
726
+ );
727
+ rememberAnswers(cfg.propertyId, choiceAnswers(answers, form?.questions));
728
+ }
729
+
730
+ /**
731
+ * What the visit built up for recommendations, and the answers given to forms, kept only under
732
+ * personalisation consent. The session signals are cleared only when this SDK built them, unless
733
+ * `all`: a refusal or a sign-out. The answers are every property's, except on an event's path,
734
+ * which names its own (`answersOf`) so no event sweeps the device.
735
+ */
736
+ function forgetKeptVisit(all = false, answersOf = undefined) {
702
737
  forgetVisit();
738
+ forgetAnswers(answersOf);
703
739
  if (all || visitKept) clearSessionSignals();
704
740
  visitKept = false;
705
741
  }
@@ -1197,6 +1233,14 @@ export function createAnalytics(options) {
1197
1233
  identityToken: () => (personalisationGranted() ? identityToken : null),
1198
1234
  analytics: granted,
1199
1235
  personalisation: personalisationGranted,
1236
+ /** A sign-up form's answers, once the gateway took them (`POST /v1/capture`, `/v1/capture/answers`). */
1237
+ answered: (answers, slot) => {
1238
+ if (personalisationGranted()) keepAnswers(answers, slot);
1239
+ },
1240
+ /** The settings the runtime started on, for the questions of the answers it reports. */
1241
+ started: (settings) => {
1242
+ onsiteSettings = settings;
1243
+ },
1200
1244
  consent: () => cfg.getConsent(),
1201
1245
  headers: () => servingHeaders(gate?.state ?? null),
1202
1246
  pageUrl: () =>
@@ -1217,6 +1261,32 @@ export function createAnalytics(options) {
1217
1261
  const value = getSessionSignals().basketValue;
1218
1262
  return pageBasket ?? (Number.isFinite(value) ? value : null);
1219
1263
  },
1264
+ /**
1265
+ * What a form's text may show (ADR 0064, shopper values): the basket's value and items,
1266
+ * as for a basket bar, in the currency of the basket the value came from (else the
1267
+ * client's), and only under personalisation consent the answers kept (else null).
1268
+ * Drawn as text on this page by the values chunk, never sent.
1269
+ */
1270
+ values: () => {
1271
+ const { basketValue, basketItems, basketCurrency } =
1272
+ getSessionSignals();
1273
+ const onPage = pageBasket !== null;
1274
+ return {
1275
+ basket_value: onPage
1276
+ ? pageBasket
1277
+ : Number.isFinite(basketValue)
1278
+ ? basketValue
1279
+ : null,
1280
+ basket_items:
1281
+ pageItems ?? (Number.isInteger(basketItems) ? basketItems : null),
1282
+ currency:
1283
+ (onPage ? pageCurrency : currencyCode(basketCurrency)) ??
1284
+ currencyCode(perRequest(cfg.getCurrency, cfg.currency)),
1285
+ answers: personalisationGranted()
1286
+ ? readAnswers(cfg.propertyId)
1287
+ : null,
1288
+ };
1289
+ },
1220
1290
  /**
1221
1291
  * This visit's session signals, kept only under personalisation consent; else null. The
1222
1292
  * campaign is the store's as it stands, so one that has lapsed since the last event is gone.
@@ -1229,6 +1299,7 @@ export function createAnalytics(options) {
1229
1299
  campaign: readVisitCampaign(cfg.propertyId, {
1230
1300
  sessionId: keptSession(),
1231
1301
  }),
1302
+ answers: readAnswers(cfg.propertyId),
1232
1303
  };
1233
1304
  },
1234
1305
  /**