@rtstic.dev/pulse 0.0.85 → 0.0.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/form/book-a-demo/main.js +12 -0
- package/dist/form/book-a-demo/main.js.map +7 -0
- package/dist/form/book-a-demo/styles.css +1 -0
- package/dist/form/book-a-demo/styles.css.map +7 -0
- package/dist/form/utm-propagation.js +1 -1
- package/dist/form/utm-propagation.js.map +2 -2
- package/dist/promptbar/style.css +1 -1
- package/dist/promptbar/style.css.map +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.w-form-formradioinput--inputType-custom.w--redirected-focus{box-shadow:none}.radio-checked{display:none}.w-form-formradioinput.w--redirected-checked~.radio-checked{display:flex}.w-checkbox-input--inputType-custom.w--redirected-focus{box-shadow:none}.w-input:focus,.w-select:focus{border-color:transparent;outline:0}.radio-inner-label{color:var(--text-colors--subtext)}input[type=radio]:checked+.radio-inner-label{color:var(--text-colors--title)}.checkbox-label{color:var(--text-colors--subtext)}.w-checkbox-input--inputType-custom.w--redirected-checked{background-color:#f66025;border-color:#f66025}input[type=checkbox]:checked+.checkbox-label{color:var(--text-colors--title)}.checkbox-field:has(input[type=checkbox]:checked){border-color:#f66025}.radio-inner-label,.checkbox-label{transition:color .3s ease}.checkbox-field{transition:border-color .3s ease}.w-checkbox-input--inputType-custom{transition:background-color .3s ease,border-color .3s ease}span.pulse-form-error{color:#e55757;font-size:var(--_text-size---body--s);line-height:var(--_line-height---line-height-body--s);font-weight:var(--_font-weight---font-weight-body--s);letter-spacing:var(--_letter-spacing---letter-spacing-body--s)}.field-error{color:#e55757;font-size:12px;line-height:var(--_line-height---line-height-body--s);font-weight:var(--_font-weight---font-weight-body--s);letter-spacing:var(--_letter-spacing---letter-spacing-body--s);position:absolute;bottom:-22px}[data-error-code=legal_required]{bottom:-8px;left:28px}[data-error-code=ERR_LEGAL_REQUIRED]{padding-left:18px}[form-flow-active=false]{display:none}[form-flow-active=true]{display:flex}[fullwidth]{width:100%}[hs-calender-active=true]{display:block;width:100%}[hs-calender-active=false]{display:none}div#iti-0__dropdown-content{background-color:#121212;border-color:#242424}#iti-0__search-input{background:#242424}.iti__search-input-wrapper{border-color:#242424}iframe{border:1px solid transparent!important}.w-form-done{border:1px solid transparent}[hs-calender-block][hs-calender-block-active=false],.step-2,[data-action=back]{display:none}.is-iti-input-wrapper{position:relative;z-index:2}[hs-thankyou-block-active=true]{display:flex}[hs-thankyou-block-active=false]{display:none}[data-step-1-terms]{display:block}select{appearance:none;-webkit-appearance:none;-moz-appearance:none;background:none}select::-ms-expand{display:none}[error-block=terms]{bottom:-6px;left:28px}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/form/book-a-demo/styles.css"],
|
|
4
|
+
"sourcesContent": [".w-form-formradioinput--inputType-custom.w--redirected-focus {\n box-shadow: none;\n}\n\n/* Hide by default */\n.radio-checked {\n display: none;\n}\n\n/* Show when the custom radio is checked */\n.w-form-formradioinput.w--redirected-checked~.radio-checked {\n display: flex;\n}\n\n.w-checkbox-input--inputType-custom.w--redirected-focus {\n box-shadow: none;\n}\n\n.w-input:focus,\n.w-select:focus {\n border-color: transparent;\n outline: 0;\n}\n\n/* Default state */\n.radio-inner-label {\n color: var(--text-colors--subtext);\n}\n\n/* When radio is checked */\ninput[type=\"radio\"]:checked+.radio-inner-label {\n color: var(--text-colors--title);\n}\n\n/* Default (unchecked) */\n.checkbox-label {\n color: var(--text-colors--subtext);\n}\n\n/* When checked */\ninput[type=\"checkbox\"]:checked+.checkbox-label {\n color: var(--text-colors--title);\n}\n\n.w-checkbox-input--inputType-custom.w--redirected-checked {\n background-color: #F66025;\n border-color: #F66025;\n}\n\n/* Change label color when checked */\ninput[type=\"checkbox\"]:checked+.checkbox-label {\n color: var(--text-colors--title);\n}\n\n/* Change parent border when checked */\n.checkbox-field:has(input[type=\"checkbox\"]:checked) {\n border-color: #F66025;\n}\n\n/* Smooth color transition for labels */\n.radio-inner-label,\n.checkbox-label {\n transition: color 300ms ease;\n}\n\n/* Smooth border transition for parent checkbox field */\n.checkbox-field {\n transition: border-color 300ms ease;\n}\n\n/* Smooth background + border transition for custom checkbox input */\n.w-checkbox-input--inputType-custom {\n transition: background-color 300ms ease, border-color 300ms ease;\n}\n\nspan.pulse-form-error {\n color: #e55757;\n font-size: var(--_text-size---body--s);\n line-height: var(--_line-height---line-height-body--s);\n font-weight: var(--_font-weight---font-weight-body--s);\n letter-spacing: var(--_letter-spacing---letter-spacing-body--s);\n}\n\n.field-error {\n color: #e55757;\n font-size: 12px;\n line-height: var(--_line-height---line-height-body--s);\n font-weight: var(--_font-weight---font-weight-body--s);\n letter-spacing: var(--_letter-spacing---letter-spacing-body--s);\n position: absolute;\n bottom: -22px;\n}\n\n[data-error-code=\"legal_required\"] {\n bottom: -8px;\n left: 28px;\n}\n\n[data-error-code=\"ERR_LEGAL_REQUIRED\"] {\n padding-left: 18px;\n}\n\n[form-flow-active=\"false\"] {\n display: none;\n}\n\n[form-flow-active=\"true\"] {\n display: flex;\n}\n\n[fullwidth] {\n width: 100%;\n}\n\n[hs-calender-active=\"true\"] {\n display: block;\n width: 100%;\n}\n\n[hs-calender-active=\"false\"] {\n display: none;\n}\n\ndiv#iti-0__dropdown-content {\n background-color: #121212;\n border-color: #242424;\n}\n\n#iti-0__search-input {\n background: #242424;\n}\n\n.iti__search-input-wrapper {\n border-color: #242424;\n}\n\niframe {\n border: 1px solid transparent !important;\n}\n\n.w-form-done {\n border: 1px solid transparent;\n}\n\n[hs-calender-block][hs-calender-block-active=\"false\"] {\n display: none;\n}\n\n.step-2 {\n display: none;\n}\n\n[data-action=\"back\"] {\n display: none;\n}\n\n.is-iti-input-wrapper {\n position: relative;\n z-index: 2;\n}\n\n[hs-thankyou-block-active=\"true\"] {\n display: flex;\n}\n\n[hs-thankyou-block-active=\"false\"] {\n display: none;\n}\n\n[data-step-1-terms] {\n display: block;\n}\n\nselect {\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n background: none;\n}\n\nselect::-ms-expand {\n display: none;\n}\n\n[error-block=\"terms\"] {\n bottom: -6px;\n left: 28px;\n}"],
|
|
5
|
+
"mappings": ";AAAA,CAAC,uCAAuC,CAAC;AACrC,cAAY;AAChB;AAGA,CAAC;AACG,WAAS;AACb;AAGA,CAAC,qBAAqB,CAAC,sBAAqB,EAAC,CAL5C;AAMG,WAAS;AACb;AAEA,CAAC,kCAAkC,CAdM;AAerC,cAAY;AAChB;AAEA,CAAC,OAAO;AACR,CAAC,QAAQ;AACL,gBAAc;AACd,WAAS;AACb;AAGA,CAAC;AACG,SAAO,IAAI;AACf;AAGA,KAAK,CAAC,WAAa,SAAQ,EAAC,CAL3B;AAMG,SAAO,IAAI;AACf;AAGA,CAAC;AACG,SAAO,IAAI;AACf;AAGA,KAAK,CAAC,cAAgB,SAAQ,EAAC,CAL9B;AAMG,SAAO,IAAI;AACf;AAEA,CA9BC,kCA8BkC,CAlCZ;AAmCnB,oBAAkB;AAClB,gBAAc;AAClB;AAGA,KAAK,CAAC,cAAgB,SAAQ,EAAC,CAf9B;AAgBG,SAAO,IAAI;AACf;AAGA,CAAC,cAAc,KAAK,KAAK,CAAC,cAAgB;AACtC,gBAAc;AAClB;AAGA,CAnCC;AAoCD,CA1BC;AA2BG,cAAY,MAAM,MAAM;AAC5B;AAGA,CAXC;AAYG,cAAY,aAAa,MAAM;AACnC;AAGA,CAzDC;AA0DG,cAAY,iBAAiB,MAAM,IAAI,EAAE,aAAa,MAAM;AAChE;AAEA,IAAI,CAAC;AACD,SAAO;AACP,aAAW,IAAI;AACf,eAAa,IAAI;AACjB,eAAa,IAAI;AACjB,kBAAgB,IAAI;AACxB;AAEA,CAAC;AACG,SAAO;AACP,aAAW;AACX,eAAa,IAAI;AACjB,eAAa,IAAI;AACjB,kBAAgB,IAAI;AACpB,YAAU;AACV,UAAQ;AACZ;AAEA,CAAC;AACG,UAAQ;AACR,QAAM;AACV;AAEA,CAAC;AACG,gBAAc;AAClB;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,SAAO;AACX;AAEA,CAAC;AACG,WAAS;AACT,SAAO;AACX;AAEA,CAAC;AACG,WAAS;AACb;AAEA,GAAG,CAAC;AACA,oBAAkB;AAClB,gBAAc;AAClB;AAEA,CAAC;AACG,cAAY;AAChB;AAEA,CAAC;AACG,gBAAc;AAClB;AAEA;AACI,UAAQ,IAAI,MAAM;AACtB;AAEA,CAAC;AACG,UAAQ,IAAI,MAAM;AACtB;AAEA,CAAC,kBAAkB,CAAC;AAChB,WAAS;AACb;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,YAAU;AACV,WAAS;AACb;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,WAAS;AACb;AAEA;AACI,cAAY;AACZ,sBAAoB;AACpB,mBAAiB;AACjB,cAAY;AAChB;AAEA,MAAM;AACF,WAAS;AACb;AAEA,CAAC;AACG,UAAQ;AACR,QAAM;AACV;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(()=>{var A=["google.","bing.com","yahoo.","duckduckgo.com","baidu.com","yandex.","ask.com","ecosia.org","aol.com","startpage.com","qwant.com","brave.com","search.brave.com","naver.com","daum.net","sogou.com","so.com","seznam.cz","onesearch.com","swisscows.com","mojeek.com","presearch.com","search.yahoo.com","googlesyndication.com","googleadservices.com"],C=["facebook.com","fb.com","fb.me","l.facebook.com","lm.facebook.com","m.facebook.com","instagram.com","l.instagram.com","twitter.com","t.co","x.com","linkedin.com","lnkd.in","pinterest.com","pin.it","reddit.com","tiktok.com","youtube.com","youtu.be","snapchat.com","tumblr.com","threads.net","mastodon.social","bsky.app","whatsapp.com","wechat.com","weibo.com","vk.com","quora.com","medium.com","discord.com","discord.gg","telegram.org","t.me","slack.com"],R={"facebook.com":"Facebook","fb.com":"Facebook","fb.me":"Facebook","l.facebook.com":"Facebook","lm.facebook.com":"Facebook","m.facebook.com":"Facebook","instagram.com":"Instagram","l.instagram.com":"Instagram","twitter.com":"Twitter","t.co":"Twitter","x.com":"Twitter","linkedin.com":"LinkedIn","lnkd.in":"LinkedIn","pinterest.com":"Pinterest","pin.it":"Pinterest","reddit.com":"Reddit","tiktok.com":"TikTok","youtube.com":"YouTube","youtu.be":"YouTube","snapchat.com":"Snapchat","tumblr.com":"Tumblr","threads.net":"Threads","mastodon.social":"Mastodon","bsky.app":"Bluesky","whatsapp.com":"WhatsApp","wechat.com":"WeChat","weibo.com":"Weibo","vk.com":"VK","quora.com":"Quora","medium.com":"Medium","discord.com":"Discord","discord.gg":"Discord","telegram.org":"Telegram","t.me":"Telegram","slack.com":"Slack"},N={"google.":"Google","bing.com":"Bing","yahoo.":"Yahoo","duckduckgo.com":"DuckDuckGo","baidu.com":"Baidu","yandex.":"Yandex","ask.com":"Ask","ecosia.org":"Ecosia","aol.com":"AOL","startpage.com":"Startpage","qwant.com":"Qwant","brave.com":"Brave","search.brave.com":"Brave","naver.com":"Naver","daum.net":"Daum","sogou.com":"Sogou","so.com":"360 Search","seznam.cz":"Seznam","googlesyndication.com":"Google","googleadservices.com":"Google"};(function(){"use strict";let c={utmKeys:["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id"],clickIdKeys:["gclid","msclkid","fbclid"],linkSelectors:["a[href]","button[onclick*='location']","button[onclick*='window.open']","button[onclick*='href']","[data-href]"],inputSelector:"[data-utm-input]",cookieName:"_attrib_data",cookieDays:30,storageKey:"utm_attribution",inputKeyMap:{source:"utm_source",medium:"utm_medium",campaign:"utm_campaign",term:"utm_term",content:"utm_content",id:"utm_id",utm_source:"utm_source",utm_medium:"utm_medium",utm_campaign:"utm_campaign",utm_term:"utm_term",utm_content:"utm_content",utm_id:"utm_id",gclid:"gclid",msclkid:"msclkid",fbclid:"fbclid",channel:"_channel",channeldrilldown1:"_channelDrilldown1",channeldrilldown2:"_channelDrilldown2",channeldrilldown3:"_channelDrilldown3",landingpage:"_landingPage",landingpagegroup:"_landingPageGroup"}};function h(n,t){let o=n.toLowerCase(),e=t.toLowerCase();return e.endsWith(".")?o===e.slice(0,-1)||o.includes("."+e.slice(0,-1)+".")||o.startsWith(e):o===e||o.endsWith("."+e)}function w(n){return A.some(t=>h(n,t))}function f(n){return C.some(t=>h(n,t))}function L(n){for(let[t,o]of Object.entries(N))if(h(n,t))return o;return k(n)}function b(n){for(let[t,o]of Object.entries(R))if(h(n,t))return o;return k(n)}function k(n){return n.replace(/^www\./,"")}function p(n){let t=n.toLowerCase().trim();return Object.values(R).map(e=>e.toLowerCase()).includes(t)?!0:C.some(e=>t===e||t===e.replace(".com",""))}function I(n){let t=n.toLowerCase().trim();return Object.values(N).map(e=>e.toLowerCase()).includes(t)?!0:A.some(e=>{let i=e.replace(/\.$/,"");return t===i||t===i.replace(".com","")})}function l(n,...t){if(!n)return!1;let o=n.toLowerCase();return t.some(e=>o.includes(e.toLowerCase()))}function D(n,...t){if(!n)return!1;let o=n.toLowerCase().trim();return t.some(e=>o===e.toLowerCase())}function O(n,t,o){let e=new Date(Date.now()+o*864e5).toUTCString();document.cookie=`${n}=${encodeURIComponent(t)};expires=${e};path=/;SameSite=Lax`}function K(n){let t=document.cookie.match(new RegExp("(?:^|; )"+n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"=([^;]*)"));return t?decodeURIComponent(t[1]):null}function _(n){let t=JSON.stringify(n);try{O(c.cookieName,t,c.cookieDays)}catch(o){console.warn("UTM: Could not set cookie",o)}try{sessionStorage.setItem(c.storageKey,t)}catch(o){console.warn("UTM: Could not write to sessionStorage",o)}}function M(){try{let n=K(c.cookieName);if(n)return JSON.parse(n)}catch(n){console.warn("UTM: Could not parse cookie",n)}try{let n=sessionStorage.getItem(c.storageKey);if(n)return JSON.parse(n)}catch(n){console.warn("UTM: Could not read sessionStorage",n)}return null}function G(){let n=new URLSearchParams(window.location.search),t={};c.utmKeys.forEach(e=>{let i=n.get(e);i&&(t[e]=i)}),c.clickIdKeys.forEach(e=>{let i=n.get(e);i&&(t[e]=i)});let o=n.get("source");return o&&!t.utm_source&&(t.source=o),t}function P(n){return!!n.utm_source||!!n.utm_medium||!!n.utm_campaign||!!n.source||!!n.gclid||!!n.msclkid||!!n.fbclid}function W(n){return!!n.utm_source||!!n.utm_medium||!!n.utm_campaign}function j(){try{if(!document.referrer)return"";let n=new URL(document.referrer);return n.hostname===window.location.hostname?"":n.hostname.toLowerCase()}catch{return""}}function x(){return window.location.pathname+window.location.search}function q(){let t=window.location.pathname.split("/").filter(Boolean);return t.length>0?"/"+t[0]:"/"}function S(n,t){let o=n.utm_source||"",e=n.utm_medium||"",i=n.utm_campaign||"",g=n.utm_term||"",a=n.utm_content||"",m=n.source||"",r=n.gclid||"",d=n.msclkid||"",X=n.fbclid||"",v=x(),V=q(),s={landingPage:v,landingPageGroup:V};if(D(e,"social")&&(p(o)||f(t))){let u=p(o)?T(o):b(t);return{...s,channel:"Organic Social",channelDrilldown1:u,channelDrilldown2:i||"",channelDrilldown3:a||""}}if(D(e,"email"))return{...s,channel:"Email Marketing",channelDrilldown1:o||"Email",channelDrilldown2:i||"",channelDrilldown3:a||""};if(l(o,"paidsocial")||l(e,"paidsocial")||l(e,"paid","ppc","cpc")&&p(o)||l(e,"paid","ppc","cpc")&&f(t)){let u=p(o)?T(o):f(t)?b(t):o||"Paid Social";return{...s,channel:"Paid Social",channelDrilldown1:u,channelDrilldown2:i||"",channelDrilldown3:g||a||""}}if(l(o,"paidsearch")||l(e,"paidsearch")||l(o,"adwords","ppc","cpc")||l(e,"adwords","ppc","cpc")||l(i,"adwords","ppc","cpc")||r||d||W(n)&&w(t)){let u="Paid Search";return r?u="Google":d?u="Bing":I(o)?u=T(o):w(t)?u=L(t):o&&(u=o),{...s,channel:"Paid Search",channelDrilldown1:u,channelDrilldown2:i||"",channelDrilldown3:g||""}}return D(e,"display")?{...s,channel:"Display",channelDrilldown1:o||"Display",channelDrilldown2:i||"",channelDrilldown3:a||""}:l(e,"affiliate")?{...s,channel:"Affiliates",channelDrilldown1:o||"Affiliate",channelDrilldown2:i||"",channelDrilldown3:a||""}:P(n)?{...s,channel:"Other Campaigns",channelDrilldown1:o||m||"",channelDrilldown2:e||"",channelDrilldown3:i||""}:t&&f(t)?{...s,channel:"Organic Social",channelDrilldown1:b(t),channelDrilldown2:"",channelDrilldown3:""}:t&&w(t)?{...s,channel:"Organic Search",channelDrilldown1:L(t),channelDrilldown2:"",channelDrilldown3:""}:t?{...s,channel:"Referral",channelDrilldown1:k(t),channelDrilldown2:v,channelDrilldown3:""}:{...s,channel:"Direct",channelDrilldown1:"Direct",channelDrilldown2:v,channelDrilldown3:""}}function T(n){return n&&n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()}function B(n,t){try{return n.startsWith("/")||n.startsWith("./")||n.startsWith("../")?!0:/^[a-z]+:/i.test(n)&&!n.startsWith("http")?!1:n.startsWith("http")?new URL(n).hostname===t:n.startsWith("//")?new URL("https:"+n).hostname===t:!n.includes("://")}catch(o){return console.warn("UTM: Error parsing URL:",n,o),!1}}function F(n,t){try{let o=new URL(n,window.location.origin);return Object.entries(t).forEach(([e,i])=>{c.utmKeys.includes(e)&&(o.searchParams.has(e)||o.searchParams.set(e,i))}),o.toString()}catch(o){return console.warn("UTM: Error processing URL:",n,o),n}}function U(n){return n.getAttribute("data-utm-exception")==="true"}function y(n,t){if(U(n))return;let o=window.location.hostname,e=null;if(n instanceof HTMLAnchorElement&&n.href?e=n.href:n instanceof HTMLElement&&n.dataset.href&&(e=n.dataset.href),e&&B(e,o)){let i=F(e,t);n instanceof HTMLAnchorElement?n.href=i:n instanceof HTMLElement&&n.dataset.href&&(n.dataset.href=i)}}function $(n){document.querySelectorAll(c.linkSelectors.join(", ")).forEach(o=>y(o,n))}function E(n,t){if(U(n))return;let o=n.getAttribute("data-utm-input")?.trim().toLowerCase();if(!o)return;let e=c.inputKeyMap[o];if(!e){console.warn(`UTM: Unknown data-utm-input value "${o}"`);return}let i=t[e];if(i&&(n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement||n instanceof HTMLSelectElement)){if(n.value&&n.value.trim()!=="")return;n.value=i,n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0}))}}function z(n){document.querySelectorAll(c.inputSelector).forEach(o=>E(o,n))}function Y(n){let t={};return Object.entries(n.params).forEach(([o,e])=>{t[o]=e}),t._channel=n.attribution.channel,t._channelDrilldown1=n.attribution.channelDrilldown1,t._channelDrilldown2=n.attribution.channelDrilldown2,t._channelDrilldown3=n.attribution.channelDrilldown3,t._landingPage=n.attribution.landingPage,t._landingPageGroup=n.attribution.landingPageGroup,t}function J(n,t){let o=[...c.linkSelectors,c.inputSelector].join(", "),e=null,i=[];function g(){let m=i.slice();i=[],e=null,m.forEach(r=>{r.matches&&r.matches(c.inputSelector)?E(r,t):r.matches&&r.matches(c.linkSelectors.join(", "))&&y(r,n),r.querySelectorAll?.(o).forEach(d=>{d.matches(c.inputSelector)?E(d,t):y(d,n)})})}new MutationObserver(m=>{m.forEach(r=>{r.addedNodes.forEach(d=>{d.nodeType===Node.ELEMENT_NODE&&i.push(d)})}),i.length>0&&!e&&(e=setTimeout(g,50))}).observe(document.body,{childList:!0,subtree:!0})}function Q(){let n=G(),t=j(),o=P(n),e;if(o){let a=S(n,t);e={params:n,attribution:a},_(e)}else if(t){let a=M();if(a)e=a;else{let m=S(n,t);e={params:n,attribution:m},_(e)}}else{let a=M();if(a)e=a;else{let m=S(n,t);e={params:{},attribution:m},_(e)}}let i=Y(e),g=()=>{$(e.params),z(i),J(e.params,i),console.log("UTM Attribution:",e.attribution),console.log("UTM Params:",e.params)};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",g):g()}Q()})();})();
|
|
1
|
+
"use strict";(()=>{var U=["google.","bing.com","yahoo.","duckduckgo.com","baidu.com","yandex.","ask.com","ecosia.org","aol.com","startpage.com","qwant.com","brave.com","search.brave.com","naver.com","daum.net","sogou.com","so.com","seznam.cz","onesearch.com","swisscows.com","mojeek.com","presearch.com","search.yahoo.com","googlesyndication.com","googleadservices.com"],C=["facebook.com","fb.com","fb.me","l.facebook.com","lm.facebook.com","m.facebook.com","instagram.com","l.instagram.com","twitter.com","t.co","x.com","linkedin.com","lnkd.in","pinterest.com","pin.it","reddit.com","tiktok.com","youtube.com","youtu.be","snapchat.com","tumblr.com","threads.net","mastodon.social","bsky.app","whatsapp.com","wechat.com","weibo.com","vk.com","quora.com","medium.com","discord.com","discord.gg","telegram.org","t.me","slack.com"],R={"facebook.com":"Facebook","fb.com":"Facebook","fb.me":"Facebook","l.facebook.com":"Facebook","lm.facebook.com":"Facebook","m.facebook.com":"Facebook","instagram.com":"Instagram","l.instagram.com":"Instagram","twitter.com":"Twitter","t.co":"Twitter","x.com":"Twitter","linkedin.com":"LinkedIn","lnkd.in":"LinkedIn","pinterest.com":"Pinterest","pin.it":"Pinterest","reddit.com":"Reddit","tiktok.com":"TikTok","youtube.com":"YouTube","youtu.be":"YouTube","snapchat.com":"Snapchat","tumblr.com":"Tumblr","threads.net":"Threads","mastodon.social":"Mastodon","bsky.app":"Bluesky","whatsapp.com":"WhatsApp","wechat.com":"WeChat","weibo.com":"Weibo","vk.com":"VK","quora.com":"Quora","medium.com":"Medium","discord.com":"Discord","discord.gg":"Discord","telegram.org":"Telegram","t.me":"Telegram","slack.com":"Slack"},N={"google.":"Google","bing.com":"Bing","yahoo.":"Yahoo","duckduckgo.com":"DuckDuckGo","baidu.com":"Baidu","yandex.":"Yandex","ask.com":"Ask","ecosia.org":"Ecosia","aol.com":"AOL","startpage.com":"Startpage","qwant.com":"Qwant","brave.com":"Brave","search.brave.com":"Brave","naver.com":"Naver","daum.net":"Daum","sogou.com":"Sogou","so.com":"360 Search","seznam.cz":"Seznam","googlesyndication.com":"Google","googleadservices.com":"Google"};(function(){"use strict";let c={utmKeys:["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id"],clickIdKeys:["gclid","msclkid","fbclid"],linkSelectors:["a[href]","button[onclick*='location']","button[onclick*='window.open']","button[onclick*='href']","[data-href]"],inputSelector:"[data-utm-input]",cookieName:"_attrib_data",cookieDays:30,storageKey:"utm_attribution",inputKeyMap:{source:"utm_source",medium:"utm_medium",campaign:"utm_campaign",term:"utm_term",content:"utm_content",id:"utm_id",utm_source:"utm_source",utm_medium:"utm_medium",utm_campaign:"utm_campaign",utm_term:"utm_term",utm_content:"utm_content",utm_id:"utm_id",gclid:"gclid",msclkid:"msclkid",fbclid:"fbclid",channel:"_channel",channeldrilldown1:"_channelDrilldown1",channeldrilldown2:"_channelDrilldown2",channeldrilldown3:"_channelDrilldown3",landingpage:"_landingPage",landingpagegroup:"_landingPageGroup"}};function h(n,t){let o=n.toLowerCase(),e=t.toLowerCase();return e.endsWith(".")?o===e.slice(0,-1)||o.includes("."+e.slice(0,-1)+".")||o.startsWith(e):o===e||o.endsWith("."+e)}function w(n){return U.some(t=>h(n,t))}function f(n){return C.some(t=>h(n,t))}function L(n){for(let[t,o]of Object.entries(N))if(h(n,t))return o;return k(n)}function b(n){for(let[t,o]of Object.entries(R))if(h(n,t))return o;return k(n)}function k(n){return n.replace(/^www\./,"")}function p(n){let t=n.toLowerCase().trim();return Object.values(R).map(e=>e.toLowerCase()).includes(t)?!0:C.some(e=>t===e||t===e.replace(".com",""))}function I(n){let t=n.toLowerCase().trim();return Object.values(N).map(e=>e.toLowerCase()).includes(t)?!0:U.some(e=>{let i=e.replace(/\.$/,"");return t===i||t===i.replace(".com","")})}function l(n,...t){if(!n)return!1;let o=n.toLowerCase();return t.some(e=>o.includes(e.toLowerCase()))}function D(n,...t){if(!n)return!1;let o=n.toLowerCase().trim();return t.some(e=>o===e.toLowerCase())}function O(n,t,o){let e=new Date(Date.now()+o*864e5).toUTCString();document.cookie=`${n}=${encodeURIComponent(t)};expires=${e};path=/;SameSite=Lax`}function K(n){let t=document.cookie.match(new RegExp("(?:^|; )"+n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"=([^;]*)"));return t?decodeURIComponent(t[1]):null}function _(n){let t=JSON.stringify(n);try{O(c.cookieName,t,c.cookieDays)}catch(o){console.warn("UTM: Could not set cookie",o)}try{sessionStorage.setItem(c.storageKey,t)}catch(o){console.warn("UTM: Could not write to sessionStorage",o)}}function M(){try{let n=K(c.cookieName);if(n)return JSON.parse(n)}catch(n){console.warn("UTM: Could not parse cookie",n)}try{let n=sessionStorage.getItem(c.storageKey);if(n)return JSON.parse(n)}catch(n){console.warn("UTM: Could not read sessionStorage",n)}return null}function G(){let n=new URLSearchParams(window.location.search),t={};c.utmKeys.forEach(e=>{let i=n.get(e);i&&(t[e]=i)}),c.clickIdKeys.forEach(e=>{let i=n.get(e);i&&(t[e]=i)});let o=n.get("source");return o&&!t.utm_source&&(t.source=o),t}function P(n){return!!n.utm_source||!!n.utm_medium||!!n.utm_campaign||!!n.source||!!n.gclid||!!n.msclkid||!!n.fbclid}function W(n){return!!n.utm_source||!!n.utm_medium||!!n.utm_campaign}function j(){try{if(!document.referrer)return"";let n=new URL(document.referrer);return n.hostname===window.location.hostname?"":n.hostname.toLowerCase()}catch{return""}}function x(){return window.location.pathname+window.location.search}function q(){let t=window.location.pathname.split("/").filter(Boolean);return t.length>0?"/"+t[0]:"/"}function S(n,t){let o=n.utm_source||"",e=n.utm_medium||"",i=n.utm_campaign||"",g=n.utm_term||"",a=n.utm_content||"",m=n.source||"",r=n.gclid||"",d=n.msclkid||"",X=n.fbclid||"",v=x(),V=q(),s={landingPage:v,landingPageGroup:V};if(D(e,"social")&&(p(o)||f(t))){let u=p(o)?T(o):b(t);return{...s,channel:"Organic Social",channelDrilldown1:u,channelDrilldown2:i||"",channelDrilldown3:a||""}}if(D(e,"email"))return{...s,channel:"Email Marketing",channelDrilldown1:o||"Email",channelDrilldown2:i||"",channelDrilldown3:a||""};if(l(o,"paidsocial")||l(e,"paidsocial")||l(e,"paid","ppc","cpc")&&p(o)||l(e,"paid","ppc","cpc")&&f(t)){let u=p(o)?T(o):f(t)?b(t):o||"Paid Social";return{...s,channel:"Paid Social",channelDrilldown1:u,channelDrilldown2:i||"",channelDrilldown3:g||a||""}}if(l(o,"paidsearch")||l(e,"paidsearch")||l(o,"adwords","ppc","cpc")||l(e,"adwords","ppc","cpc")||l(i,"adwords","ppc","cpc")||r||d||W(n)&&w(t)){let u="Paid Search";return r?u="Google":d?u="Bing":I(o)?u=T(o):w(t)?u=L(t):o&&(u=o),{...s,channel:"Paid Search",channelDrilldown1:u,channelDrilldown2:i||"",channelDrilldown3:g||""}}return D(e,"display")?{...s,channel:"Display",channelDrilldown1:o||"Display",channelDrilldown2:i||"",channelDrilldown3:a||""}:l(e,"affiliate")?{...s,channel:"Affiliates",channelDrilldown1:o||"Affiliate",channelDrilldown2:i||"",channelDrilldown3:a||""}:P(n)?{...s,channel:"Other Campaigns",channelDrilldown1:o||m||"",channelDrilldown2:e||"",channelDrilldown3:i||""}:t&&f(t)?{...s,channel:"Organic Social",channelDrilldown1:b(t),channelDrilldown2:"",channelDrilldown3:""}:t&&w(t)?{...s,channel:"Organic Search",channelDrilldown1:L(t),channelDrilldown2:"",channelDrilldown3:""}:t?{...s,channel:"Referral",channelDrilldown1:k(t),channelDrilldown2:v,channelDrilldown3:""}:{...s,channel:"Direct",channelDrilldown1:"Direct",channelDrilldown2:v,channelDrilldown3:""}}function T(n){return n&&n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()}function B(n,t){try{return n.startsWith("/")||n.startsWith("./")||n.startsWith("../")?!0:/^[a-z]+:/i.test(n)&&!n.startsWith("http")?!1:n.startsWith("http")?new URL(n).hostname===t:n.startsWith("//")?new URL("https:"+n).hostname===t:!n.includes("://")}catch(o){return console.warn("UTM: Error parsing URL:",n,o),!1}}function F(n,t){try{let o=new URL(n,window.location.origin);return Object.entries(t).forEach(([e,i])=>{c.utmKeys.includes(e)&&(o.searchParams.has(e)||o.searchParams.set(e,i))}),o.toString()}catch(o){return console.warn("UTM: Error processing URL:",n,o),n}}function A(n){return n.getAttribute("data-utm-exception")==="true"}function y(n,t){if(A(n))return;let o=window.location.hostname,e=null;if(n instanceof HTMLAnchorElement&&n.href?e=n.href:n instanceof HTMLElement&&n.dataset.href&&(e=n.dataset.href),e&&B(e,o)){let i=F(e,t);n instanceof HTMLAnchorElement?n.href=i:n instanceof HTMLElement&&n.dataset.href&&(n.dataset.href=i)}}function $(n){document.querySelectorAll(c.linkSelectors.join(", ")).forEach(o=>y(o,n))}function E(n,t){if(A(n))return;let o=n.getAttribute("data-utm-input")?.trim().toLowerCase();if(!o)return;let e=c.inputKeyMap[o];if(!e){console.warn(`UTM: Unknown data-utm-input value "${o}"`);return}let i=t[e];if(i&&(n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement||n instanceof HTMLSelectElement)){if(n.value&&n.value.trim()!=="")return;n.value=i,n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0}))}}function z(n){document.querySelectorAll(c.inputSelector).forEach(o=>E(o,n))}function Y(n){let t={};return Object.entries(n.params).forEach(([o,e])=>{t[o]=e}),t._channel=n.attribution.channel,t._channelDrilldown1=n.attribution.channelDrilldown1,t._channelDrilldown2=n.attribution.channelDrilldown2,t._channelDrilldown3=n.attribution.channelDrilldown3,t._landingPage=n.attribution.landingPage,t._landingPageGroup=n.attribution.landingPageGroup,t}function J(n,t){let o=[...c.linkSelectors,c.inputSelector].join(", "),e=null,i=[];function g(){let m=i.slice();i=[],e=null,m.forEach(r=>{r.matches&&r.matches(c.inputSelector)?E(r,t):r.matches&&r.matches(c.linkSelectors.join(", "))&&y(r,n),r.querySelectorAll?.(o).forEach(d=>{d.matches(c.inputSelector)?E(d,t):y(d,n)})})}new MutationObserver(m=>{m.forEach(r=>{r.addedNodes.forEach(d=>{d.nodeType===Node.ELEMENT_NODE&&i.push(d)})}),i.length>0&&!e&&(e=setTimeout(g,50))}).observe(document.body,{childList:!0,subtree:!0})}function Q(){let n=G(),t=j(),o=P(n),e;if(o){let a=S(n,t);e={params:n,attribution:a},_(e)}else if(t){let a=M();if(a)e=a;else{let m=S(n,t);e={params:n,attribution:m},_(e)}}else{let a=M();if(a)e=a;else{let m=S(n,t);e={params:{},attribution:m},_(e)}}let i=Y(e),g=()=>{$(e.params),z(i),J(e.params,i)};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",g):g()}Q()})();})();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/form/utm-propagation.ts"],
|
|
4
|
-
"sourcesContent": ["// UTM Attribution & Propagation Script (TypeScript)\n// \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n// 1. Captures UTM params, gclid, msclkid, fbclid from URL\n// 2. Falls back to referrer analysis when no UTMs are present\n// 3. Categorises visitors into channels using an 11-rule priority cascade\n// (mirrors Attributer's logic)\n// 4. Propagates UTM params to internal links (without overriding existing params)\n// 5. Fills form fields marked with data-utm-input (without overriding existing values)\n// 6. Persists attribution data in a first-party cookie (with sessionStorage fallback)\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// Types\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\ninterface UTMParams {\n [key: string]: string;\n}\n\ninterface AttributionResult {\n channel: string;\n channelDrilldown1: string;\n channelDrilldown2: string;\n channelDrilldown3: string;\n landingPage: string;\n landingPageGroup: string;\n}\n\ninterface AttributionData {\n params: UTMParams;\n attribution: AttributionResult;\n}\n\ninterface UTMConfig {\n /** Standard UTM keys to capture from the URL */\n utmKeys: string[];\n /** Non-UTM click ID keys to capture */\n clickIdKeys: string[];\n /** CSS selectors for elements whose href should receive UTM params */\n linkSelectors: string[];\n /** CSS selector for form fields that should receive attribution values */\n inputSelector: string;\n /** Cookie name for persisting attribution */\n cookieName: string;\n /** Cookie lifespan in days */\n cookieDays: number;\n /** sessionStorage key (fallback) */\n storageKey: string;\n /** Maps data-utm-input shorthand names \u2192 internal keys */\n inputKeyMap: Record<string, string>;\n}\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// Recognised Domain Lists\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nconst SEARCH_ENGINES: string[] = [\n \"google.\",\n \"bing.com\",\n \"yahoo.\",\n \"duckduckgo.com\",\n \"baidu.com\",\n \"yandex.\",\n \"ask.com\",\n \"ecosia.org\",\n \"aol.com\",\n \"startpage.com\",\n \"qwant.com\",\n \"brave.com\",\n \"search.brave.com\",\n \"naver.com\",\n \"daum.net\",\n \"sogou.com\",\n \"so.com\",\n \"seznam.cz\",\n \"onesearch.com\",\n \"swisscows.com\",\n \"mojeek.com\",\n \"presearch.com\",\n \"search.yahoo.com\",\n \"googlesyndication.com\",\n \"googleadservices.com\",\n];\n\nconst SOCIAL_NETWORKS: string[] = [\n \"facebook.com\",\n \"fb.com\",\n \"fb.me\",\n \"l.facebook.com\",\n \"lm.facebook.com\",\n \"m.facebook.com\",\n \"instagram.com\",\n \"l.instagram.com\",\n \"twitter.com\",\n \"t.co\",\n \"x.com\",\n \"linkedin.com\",\n \"lnkd.in\",\n \"pinterest.com\",\n \"pin.it\",\n \"reddit.com\",\n \"tiktok.com\",\n \"youtube.com\",\n \"youtu.be\",\n \"snapchat.com\",\n \"tumblr.com\",\n \"threads.net\",\n \"mastodon.social\",\n \"bsky.app\",\n \"whatsapp.com\",\n \"wechat.com\",\n \"weibo.com\",\n \"vk.com\",\n \"quora.com\",\n \"medium.com\",\n \"discord.com\",\n \"discord.gg\",\n \"telegram.org\",\n \"t.me\",\n \"slack.com\",\n];\n\n// Friendly display names for recognised sources\nconst SOCIAL_DISPLAY_NAMES: Record<string, string> = {\n \"facebook.com\": \"Facebook\",\n \"fb.com\": \"Facebook\",\n \"fb.me\": \"Facebook\",\n \"l.facebook.com\": \"Facebook\",\n \"lm.facebook.com\": \"Facebook\",\n \"m.facebook.com\": \"Facebook\",\n \"instagram.com\": \"Instagram\",\n \"l.instagram.com\": \"Instagram\",\n \"twitter.com\": \"Twitter\",\n \"t.co\": \"Twitter\",\n \"x.com\": \"Twitter\",\n \"linkedin.com\": \"LinkedIn\",\n \"lnkd.in\": \"LinkedIn\",\n \"pinterest.com\": \"Pinterest\",\n \"pin.it\": \"Pinterest\",\n \"reddit.com\": \"Reddit\",\n \"tiktok.com\": \"TikTok\",\n \"youtube.com\": \"YouTube\",\n \"youtu.be\": \"YouTube\",\n \"snapchat.com\": \"Snapchat\",\n \"tumblr.com\": \"Tumblr\",\n \"threads.net\": \"Threads\",\n \"mastodon.social\": \"Mastodon\",\n \"bsky.app\": \"Bluesky\",\n \"whatsapp.com\": \"WhatsApp\",\n \"wechat.com\": \"WeChat\",\n \"weibo.com\": \"Weibo\",\n \"vk.com\": \"VK\",\n \"quora.com\": \"Quora\",\n \"medium.com\": \"Medium\",\n \"discord.com\": \"Discord\",\n \"discord.gg\": \"Discord\",\n \"telegram.org\": \"Telegram\",\n \"t.me\": \"Telegram\",\n \"slack.com\": \"Slack\",\n};\n\nconst SEARCH_DISPLAY_NAMES: Record<string, string> = {\n \"google.\": \"Google\",\n \"bing.com\": \"Bing\",\n \"yahoo.\": \"Yahoo\",\n \"duckduckgo.com\": \"DuckDuckGo\",\n \"baidu.com\": \"Baidu\",\n \"yandex.\": \"Yandex\",\n \"ask.com\": \"Ask\",\n \"ecosia.org\": \"Ecosia\",\n \"aol.com\": \"AOL\",\n \"startpage.com\": \"Startpage\",\n \"qwant.com\": \"Qwant\",\n \"brave.com\": \"Brave\",\n \"search.brave.com\": \"Brave\",\n \"naver.com\": \"Naver\",\n \"daum.net\": \"Daum\",\n \"sogou.com\": \"Sogou\",\n \"so.com\": \"360 Search\",\n \"seznam.cz\": \"Seznam\",\n \"googlesyndication.com\": \"Google\",\n \"googleadservices.com\": \"Google\",\n};\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// Main IIFE\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n(function (): void {\n \"use strict\";\n\n const config: UTMConfig = {\n utmKeys: [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n \"utm_id\",\n ],\n clickIdKeys: [\"gclid\", \"msclkid\", \"fbclid\"],\n linkSelectors: [\n \"a[href]\",\n \"button[onclick*='location']\",\n \"button[onclick*='window.open']\",\n \"button[onclick*='href']\",\n \"[data-href]\",\n ],\n inputSelector: \"[data-utm-input]\",\n cookieName: \"_attrib_data\",\n cookieDays: 30,\n storageKey: \"utm_attribution\",\n inputKeyMap: {\n // UTM shorthand \u2192 param key\n source: \"utm_source\",\n medium: \"utm_medium\",\n campaign: \"utm_campaign\",\n term: \"utm_term\",\n content: \"utm_content\",\n id: \"utm_id\",\n // Full UTM names\n utm_source: \"utm_source\",\n utm_medium: \"utm_medium\",\n utm_campaign: \"utm_campaign\",\n utm_term: \"utm_term\",\n utm_content: \"utm_content\",\n utm_id: \"utm_id\",\n // Click IDs\n gclid: \"gclid\",\n msclkid: \"msclkid\",\n fbclid: \"fbclid\",\n // Attribution outputs\n channel: \"_channel\",\n channeldrilldown1: \"_channelDrilldown1\",\n channeldrilldown2: \"_channelDrilldown2\",\n channeldrilldown3: \"_channelDrilldown3\",\n landingpage: \"_landingPage\",\n landingpagegroup: \"_landingPageGroup\",\n },\n };\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Helper: Domain Matching\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function domainMatches(hostname: string, pattern: string): boolean {\n const h = hostname.toLowerCase();\n const p = pattern.toLowerCase();\n // Patterns ending with \".\" are prefix matches (e.g., \"google.\" matches \"google.com\", \"google.co.uk\")\n if (p.endsWith(\".\")) {\n return h === p.slice(0, -1) || h.includes(\".\" + p.slice(0, -1) + \".\") || h.startsWith(p);\n }\n return h === p || h.endsWith(\".\" + p);\n }\n\n function isRecognisedSearchEngine(hostname: string): boolean {\n return SEARCH_ENGINES.some((pattern) => domainMatches(hostname, pattern));\n }\n\n function isRecognisedSocialNetwork(hostname: string): boolean {\n return SOCIAL_NETWORKS.some((domain) => domainMatches(hostname, domain));\n }\n\n function getSearchEngineName(hostname: string): string {\n for (const [pattern, name] of Object.entries(SEARCH_DISPLAY_NAMES)) {\n if (domainMatches(hostname, pattern)) return name;\n }\n return cleanDomain(hostname);\n }\n\n function getSocialNetworkName(hostname: string): string {\n for (const [domain, name] of Object.entries(SOCIAL_DISPLAY_NAMES)) {\n if (domainMatches(hostname, domain)) return name;\n }\n return cleanDomain(hostname);\n }\n\n /** Strips \"www.\" and returns the domain */\n function cleanDomain(hostname: string): string {\n return hostname.replace(/^www\\./, \"\");\n }\n\n /** Check if a value is the name of a recognised social network */\n function valueIsSocialNetwork(value: string): boolean {\n const v = value.toLowerCase().trim();\n // Check against display names (case-insensitive)\n const allNames = Object.values(SOCIAL_DISPLAY_NAMES).map((n) =>\n n.toLowerCase()\n );\n if (allNames.includes(v)) return true;\n // Check against domain patterns\n return SOCIAL_NETWORKS.some(\n (domain) => v === domain || v === domain.replace(\".com\", \"\")\n );\n }\n\n /** Check if a value is the name of a recognised search engine */\n function valueIsSearchEngine(value: string): boolean {\n const v = value.toLowerCase().trim();\n const allNames = Object.values(SEARCH_DISPLAY_NAMES).map((n) =>\n n.toLowerCase()\n );\n if (allNames.includes(v)) return true;\n return SEARCH_ENGINES.some((pattern) => {\n const clean = pattern.replace(/\\.$/, \"\");\n return v === clean || v === clean.replace(\".com\", \"\");\n });\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Helper: String checks\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function containsAny(value: string | undefined, ...terms: string[]): boolean {\n if (!value) return false;\n const v = value.toLowerCase();\n return terms.some((t) => v.includes(t.toLowerCase()));\n }\n\n function equalsAny(value: string | undefined, ...terms: string[]): boolean {\n if (!value) return false;\n const v = value.toLowerCase().trim();\n return terms.some((t) => v === t.toLowerCase());\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Cookie Persistence\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function setCookie(name: string, value: string, days: number): void {\n const expires = new Date(Date.now() + days * 864e5).toUTCString();\n document.cookie = `${name}=${encodeURIComponent(value)};expires=${expires};path=/;SameSite=Lax`;\n }\n\n function getCookie(name: string): string | null {\n const match = document.cookie.match(\n new RegExp(\"(?:^|; )\" + name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\") + \"=([^;]*)\")\n );\n return match ? decodeURIComponent(match[1]) : null;\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Persistence Layer (Cookie \u2192 sessionStorage fallback)\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function storeAttribution(data: AttributionData): void {\n const json = JSON.stringify(data);\n try {\n setCookie(config.cookieName, json, config.cookieDays);\n } catch (e) {\n console.warn(\"UTM: Could not set cookie\", e);\n }\n try {\n sessionStorage.setItem(config.storageKey, json);\n } catch (e) {\n console.warn(\"UTM: Could not write to sessionStorage\", e);\n }\n }\n\n function getStoredAttribution(): AttributionData | null {\n try {\n const fromCookie = getCookie(config.cookieName);\n if (fromCookie) return JSON.parse(fromCookie);\n } catch (e) {\n console.warn(\"UTM: Could not parse cookie\", e);\n }\n try {\n const fromStorage = sessionStorage.getItem(config.storageKey);\n if (fromStorage) return JSON.parse(fromStorage);\n } catch (e) {\n console.warn(\"UTM: Could not read sessionStorage\", e);\n }\n return null;\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Param Capture from URL\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function getCapturedParams(): UTMParams {\n const urlParams = new URLSearchParams(window.location.search);\n const captured: UTMParams = {};\n\n // Standard UTM keys\n config.utmKeys.forEach((key) => {\n const value = urlParams.get(key);\n if (value) captured[key] = value;\n });\n\n // Click IDs (gclid, msclkid, fbclid)\n config.clickIdKeys.forEach((key) => {\n const value = urlParams.get(key);\n if (value) captured[key] = value;\n });\n\n // Bare \"source\" parameter (non-standard, but used by some tools)\n const bareSource = urlParams.get(\"source\");\n if (bareSource && !captured[\"utm_source\"]) {\n captured[\"source\"] = bareSource;\n }\n\n return captured;\n }\n\n function hasTrackingParams(params: UTMParams): boolean {\n return (\n !!params.utm_source ||\n !!params.utm_medium ||\n !!params.utm_campaign ||\n !!params.source ||\n !!params.gclid ||\n !!params.msclkid ||\n !!params.fbclid\n );\n }\n\n function hasUTMParams(params: UTMParams): boolean {\n return (\n !!params.utm_source || !!params.utm_medium || !!params.utm_campaign\n );\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Referrer Analysis\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function getReferrerHostname(): string {\n try {\n if (!document.referrer) return \"\";\n const url = new URL(document.referrer);\n // Ignore self-referrals\n if (url.hostname === window.location.hostname) return \"\";\n return url.hostname.toLowerCase();\n } catch {\n return \"\";\n }\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Landing Page Info\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function getLandingPage(): string {\n return window.location.pathname + window.location.search;\n }\n\n function getLandingPageGroup(): string {\n const path = window.location.pathname;\n // Return the first directory segment, or \"/\" for root\n const segments = path.split(\"/\").filter(Boolean);\n return segments.length > 0 ? \"/\" + segments[0] : \"/\";\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Channel Categorisation Engine (11-rule cascade)\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function categorise(params: UTMParams, referrerHost: string): AttributionResult {\n const utm_source = params.utm_source || \"\";\n const utm_medium = params.utm_medium || \"\";\n const utm_campaign = params.utm_campaign || \"\";\n const utm_term = params.utm_term || \"\";\n const utm_content = params.utm_content || \"\";\n const bare_source = params.source || \"\";\n const gclid = params.gclid || \"\";\n const msclkid = params.msclkid || \"\";\n const fbclid = params.fbclid || \"\";\n\n const landingPage = getLandingPage();\n const landingPageGroup = getLandingPageGroup();\n\n const base: Pick<AttributionResult, \"landingPage\" | \"landingPageGroup\"> = {\n landingPage,\n landingPageGroup,\n };\n\n // \u2500\u2500 Rule 1: Organic Social \u2500\u2500\n // utm_medium = \"social\" AND (utm_source is a recognised social network\n // OR referrer is a recognised social network)\n if (equalsAny(utm_medium, \"social\")) {\n if (valueIsSocialNetwork(utm_source) || isRecognisedSocialNetwork(referrerHost)) {\n const sourceName =\n valueIsSocialNetwork(utm_source)\n ? capitalise(utm_source)\n : getSocialNetworkName(referrerHost);\n return {\n ...base,\n channel: \"Organic Social\",\n channelDrilldown1: sourceName,\n channelDrilldown2: utm_campaign || \"\",\n channelDrilldown3: utm_content || \"\",\n };\n }\n }\n\n // \u2500\u2500 Rule 2: Email Marketing \u2500\u2500\n // utm_medium = \"email\"\n if (equalsAny(utm_medium, \"email\")) {\n return {\n ...base,\n channel: \"Email Marketing\",\n channelDrilldown1: utm_source || \"Email\",\n channelDrilldown2: utm_campaign || \"\",\n channelDrilldown3: utm_content || \"\",\n };\n }\n\n // \u2500\u2500 Rule 3: Paid Social \u2500\u2500\n // utm_source or utm_medium contains \"paidsocial\"\n // OR utm_medium contains \"paid\"/\"ppc\"/\"cpc\" AND utm_source is a recognised social network\n // OR utm_medium contains \"paid\"/\"ppc\"/\"cpc\" AND referrer is a recognised social network\n if (\n containsAny(utm_source, \"paidsocial\") ||\n containsAny(utm_medium, \"paidsocial\") ||\n (containsAny(utm_medium, \"paid\", \"ppc\", \"cpc\") &&\n valueIsSocialNetwork(utm_source)) ||\n (containsAny(utm_medium, \"paid\", \"ppc\", \"cpc\") &&\n isRecognisedSocialNetwork(referrerHost))\n ) {\n const sourceName = valueIsSocialNetwork(utm_source)\n ? capitalise(utm_source)\n : isRecognisedSocialNetwork(referrerHost)\n ? getSocialNetworkName(referrerHost)\n : utm_source || \"Paid Social\";\n return {\n ...base,\n channel: \"Paid Social\",\n channelDrilldown1: sourceName,\n channelDrilldown2: utm_campaign || \"\",\n channelDrilldown3: utm_term || utm_content || \"\",\n };\n }\n\n // \u2500\u2500 Rule 4: Paid Search \u2500\u2500\n // utm_source or utm_medium contains \"paidsearch\"\n // OR utm_source / utm_medium / utm_campaign contains \"adwords\" / \"ppc\" / \"cpc\"\n // OR gclid or msclkid is present\n // OR any utm param is present AND referrer is a recognised search engine\n if (\n containsAny(utm_source, \"paidsearch\") ||\n containsAny(utm_medium, \"paidsearch\") ||\n containsAny(utm_source, \"adwords\", \"ppc\", \"cpc\") ||\n containsAny(utm_medium, \"adwords\", \"ppc\", \"cpc\") ||\n containsAny(utm_campaign, \"adwords\", \"ppc\", \"cpc\") ||\n gclid ||\n msclkid ||\n (hasUTMParams(params) && isRecognisedSearchEngine(referrerHost))\n ) {\n let sourceName = \"Paid Search\";\n if (gclid) {\n sourceName = \"Google\";\n } else if (msclkid) {\n sourceName = \"Bing\";\n } else if (valueIsSearchEngine(utm_source)) {\n sourceName = capitalise(utm_source);\n } else if (isRecognisedSearchEngine(referrerHost)) {\n sourceName = getSearchEngineName(referrerHost);\n } else if (utm_source) {\n sourceName = utm_source;\n }\n return {\n ...base,\n channel: \"Paid Search\",\n channelDrilldown1: sourceName,\n channelDrilldown2: utm_campaign || \"\",\n channelDrilldown3: utm_term || \"\",\n };\n }\n\n // \u2500\u2500 Rule 5: Display \u2500\u2500\n // utm_medium = \"display\"\n if (equalsAny(utm_medium, \"display\")) {\n return {\n ...base,\n channel: \"Display\",\n channelDrilldown1: utm_source || \"Display\",\n channelDrilldown2: utm_campaign || \"\",\n channelDrilldown3: utm_content || \"\",\n };\n }\n\n // \u2500\u2500 Rule 6: Affiliates \u2500\u2500\n // utm_medium contains \"affiliate\" or \"affiliates\"\n if (containsAny(utm_medium, \"affiliate\")) {\n return {\n ...base,\n channel: \"Affiliates\",\n channelDrilldown1: utm_source || \"Affiliate\",\n channelDrilldown2: utm_campaign || \"\",\n channelDrilldown3: utm_content || \"\",\n };\n }\n\n // \u2500\u2500 Rule 7: Other Campaigns \u2500\u2500\n // Any tracking param is present (utm_source, utm_medium, utm_campaign, source)\n // but none of the above rules matched\n if (hasTrackingParams(params)) {\n return {\n ...base,\n channel: \"Other Campaigns\",\n channelDrilldown1: utm_source || bare_source || \"\",\n channelDrilldown2: utm_medium || \"\",\n channelDrilldown3: utm_campaign || \"\",\n };\n }\n\n // \u2500\u2500 Rules 8\u201311: No tracking params \u2192 fall back to referrer \u2500\u2500\n\n // \u2500\u2500 Rule 8: Organic Social (by referrer) \u2500\u2500\n if (referrerHost && isRecognisedSocialNetwork(referrerHost)) {\n return {\n ...base,\n channel: \"Organic Social\",\n channelDrilldown1: getSocialNetworkName(referrerHost),\n channelDrilldown2: \"\",\n channelDrilldown3: \"\",\n };\n }\n\n // \u2500\u2500 Rule 9: Organic Search (by referrer) \u2500\u2500\n if (referrerHost && isRecognisedSearchEngine(referrerHost)) {\n return {\n ...base,\n channel: \"Organic Search\",\n channelDrilldown1: getSearchEngineName(referrerHost),\n channelDrilldown2: \"\",\n channelDrilldown3: \"\",\n };\n }\n\n // \u2500\u2500 Rule 10: Referral \u2500\u2500\n if (referrerHost) {\n return {\n ...base,\n channel: \"Referral\",\n channelDrilldown1: cleanDomain(referrerHost),\n channelDrilldown2: landingPage,\n channelDrilldown3: \"\",\n };\n }\n\n // \u2500\u2500 Rule 11: Direct \u2500\u2500\n return {\n ...base,\n channel: \"Direct\",\n channelDrilldown1: \"Direct\",\n channelDrilldown2: landingPage,\n channelDrilldown3: \"\",\n };\n }\n\n function capitalise(str: string): string {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Link Processing (propagate UTM params only)\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function isInternalLink(url: string, currentHost: string): boolean {\n try {\n if (\n url.startsWith(\"/\") ||\n url.startsWith(\"./\") ||\n url.startsWith(\"../\")\n ) {\n return true;\n }\n if (/^[a-z]+:/i.test(url) && !url.startsWith(\"http\")) {\n return false;\n }\n if (url.startsWith(\"http\")) {\n return new URL(url).hostname === currentHost;\n }\n if (url.startsWith(\"//\")) {\n return new URL(\"https:\" + url).hostname === currentHost;\n }\n if (!url.includes(\"://\")) {\n return true;\n }\n return false;\n } catch (e) {\n console.warn(\"UTM: Error parsing URL:\", url, e);\n return false;\n }\n }\n\n function addUTMToURL(url: string, utmParams: UTMParams): string {\n try {\n const urlObj = new URL(url, window.location.origin);\n\n Object.entries(utmParams).forEach(([key, value]) => {\n // Only propagate standard UTM keys (not click IDs or internal keys)\n if (!config.utmKeys.includes(key)) return;\n // NEVER override existing params in the URL\n if (urlObj.searchParams.has(key)) return;\n urlObj.searchParams.set(key, value);\n });\n\n return urlObj.toString();\n } catch (e) {\n console.warn(\"UTM: Error processing URL:\", url, e);\n return url;\n }\n }\n\n function hasUTMException(element: Element): boolean {\n return element.getAttribute(\"data-utm-exception\") === \"true\";\n }\n\n function processLink(element: Element, utmParams: UTMParams): void {\n if (hasUTMException(element)) return;\n\n const currentHost = window.location.hostname;\n let url: string | null = null;\n\n if (element instanceof HTMLAnchorElement && element.href) {\n url = element.href;\n } else if (element instanceof HTMLElement && element.dataset.href) {\n url = element.dataset.href;\n }\n\n if (url && isInternalLink(url, currentHost)) {\n const updatedURL = addUTMToURL(url, utmParams);\n\n if (element instanceof HTMLAnchorElement) {\n element.href = updatedURL;\n } else if (element instanceof HTMLElement && element.dataset.href) {\n element.dataset.href = updatedURL;\n }\n }\n }\n\n function processAllLinks(utmParams: UTMParams): void {\n const links = document.querySelectorAll(config.linkSelectors.join(\", \"));\n links.forEach((el) => processLink(el, utmParams));\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Input Field Processing\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // Usage:\n // <input type=\"hidden\" data-utm-input=\"source\" />\n // <input type=\"hidden\" data-utm-input=\"medium\" />\n // <input type=\"hidden\" data-utm-input=\"campaign\" />\n // <input type=\"hidden\" data-utm-input=\"term\" />\n // <input type=\"hidden\" data-utm-input=\"content\" />\n // <input type=\"hidden\" data-utm-input=\"id\" />\n // <input type=\"hidden\" data-utm-input=\"gclid\" />\n // <input type=\"hidden\" data-utm-input=\"msclkid\" />\n // <input type=\"hidden\" data-utm-input=\"channel\" />\n // <input type=\"hidden\" data-utm-input=\"channelDrilldown1\" />\n // <input type=\"hidden\" data-utm-input=\"channelDrilldown2\" />\n // <input type=\"hidden\" data-utm-input=\"channelDrilldown3\" />\n // <input type=\"hidden\" data-utm-input=\"landingPage\" />\n // <input type=\"hidden\" data-utm-input=\"landingPageGroup\" />\n\n function processInput(\n element: Element,\n allValues: Record<string, string>\n ): void {\n if (hasUTMException(element)) return;\n\n const shortKey = element\n .getAttribute(\"data-utm-input\")\n ?.trim()\n .toLowerCase();\n if (!shortKey) return;\n\n // Resolve shorthand \u2192 internal key\n const internalKey = config.inputKeyMap[shortKey];\n if (!internalKey) {\n console.warn(`UTM: Unknown data-utm-input value \"${shortKey}\"`);\n return;\n }\n\n const value = allValues[internalKey];\n if (!value) return;\n\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ) {\n // NEVER override a field that already has a value\n if (element.value && element.value.trim() !== \"\") return;\n\n element.value = value;\n\n // Dispatch events so frameworks (React, Vue, etc.) pick up the change\n element.dispatchEvent(new Event(\"input\", { bubbles: true }));\n element.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n }\n\n function processAllInputs(allValues: Record<string, string>): void {\n const inputs = document.querySelectorAll(config.inputSelector);\n inputs.forEach((el) => processInput(el, allValues));\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Build a flat key\u2192value map for form fields\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function buildValueMap(data: AttributionData): Record<string, string> {\n const map: Record<string, string> = {};\n\n // Raw UTM params and click IDs\n Object.entries(data.params).forEach(([key, value]) => {\n map[key] = value;\n });\n\n // Attribution results (prefixed with _ to avoid collision with raw params)\n map[\"_channel\"] = data.attribution.channel;\n map[\"_channelDrilldown1\"] = data.attribution.channelDrilldown1;\n map[\"_channelDrilldown2\"] = data.attribution.channelDrilldown2;\n map[\"_channelDrilldown3\"] = data.attribution.channelDrilldown3;\n map[\"_landingPage\"] = data.attribution.landingPage;\n map[\"_landingPageGroup\"] = data.attribution.landingPageGroup;\n\n return map;\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // MutationObserver (handles dynamically added content)\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function observeNewContent(\n utmParams: UTMParams,\n allValues: Record<string, string>\n ): void {\n const allSelectors = [...config.linkSelectors, config.inputSelector].join(\n \", \"\n );\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let pendingNodes: Element[] = [];\n\n function flushPending(): void {\n const nodes = pendingNodes.slice();\n pendingNodes = [];\n debounceTimer = null;\n\n nodes.forEach((element) => {\n if (element.matches && element.matches(config.inputSelector)) {\n processInput(element, allValues);\n } else if (\n element.matches &&\n element.matches(config.linkSelectors.join(\", \"))\n ) {\n processLink(element, utmParams);\n }\n\n // Also check children of added nodes\n element.querySelectorAll?.(allSelectors).forEach((child) => {\n if (child.matches(config.inputSelector)) {\n processInput(child, allValues);\n } else {\n processLink(child, utmParams);\n }\n });\n });\n }\n\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n pendingNodes.push(node as Element);\n }\n });\n });\n\n if (pendingNodes.length > 0 && !debounceTimer) {\n debounceTimer = setTimeout(flushPending, 50);\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Init\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function init(): void {\n const freshParams = getCapturedParams();\n const referrerHost = getReferrerHostname();\n const hasFreshTracking = hasTrackingParams(freshParams);\n\n let data: AttributionData;\n\n if (hasFreshTracking) {\n // Fresh URL params always win \u2014 categorise from scratch\n const attribution = categorise(freshParams, referrerHost);\n data = { params: freshParams, attribution };\n storeAttribution(data);\n } else if (referrerHost) {\n // No URL params but we have a referrer \u2014 categorise based on referrer\n // Only do this if there's no existing stored attribution\n // (to avoid overwriting a previous paid click with a later organic visit)\n const stored = getStoredAttribution();\n if (stored) {\n data = stored;\n } else {\n const attribution = categorise(freshParams, referrerHost);\n data = { params: freshParams, attribution };\n storeAttribution(data);\n }\n } else {\n // No URL params and no referrer \u2014 use stored data or fall back to Direct\n const stored = getStoredAttribution();\n if (stored) {\n data = stored;\n } else {\n const attribution = categorise(freshParams, referrerHost);\n data = { params: {}, attribution };\n storeAttribution(data);\n }\n }\n\n const allValues = buildValueMap(data);\n\n const run = (): void => {\n processAllLinks(data.params);\n processAllInputs(allValues);\n observeNewContent(data.params, allValues);\n console.log(\"UTM Attribution:\", data.attribution);\n console.log(\"UTM Params:\", data.params);\n };\n\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", run);\n } else {\n run();\n }\n }\n\n init();\n})();"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// UTM Attribution & Propagation Script (TypeScript)\n// \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n// 1. Captures UTM params, gclid, msclkid, fbclid from URL\n// 2. Falls back to referrer analysis when no UTMs are present\n// 3. Categorises visitors into channels using an 11-rule priority cascade\n// (mirrors Attributer's logic)\n// 4. Propagates UTM params to internal links (without overriding existing params)\n// 5. Fills form fields marked with data-utm-input (without overriding existing values)\n// 6. Persists attribution data in a first-party cookie (with sessionStorage fallback)\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// Types\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\ninterface UTMParams {\n [key: string]: string;\n}\n\ninterface AttributionResult {\n channel: string;\n channelDrilldown1: string;\n channelDrilldown2: string;\n channelDrilldown3: string;\n landingPage: string;\n landingPageGroup: string;\n}\n\ninterface AttributionData {\n params: UTMParams;\n attribution: AttributionResult;\n}\n\ninterface UTMConfig {\n /** Standard UTM keys to capture from the URL */\n utmKeys: string[];\n /** Non-UTM click ID keys to capture */\n clickIdKeys: string[];\n /** CSS selectors for elements whose href should receive UTM params */\n linkSelectors: string[];\n /** CSS selector for form fields that should receive attribution values */\n inputSelector: string;\n /** Cookie name for persisting attribution */\n cookieName: string;\n /** Cookie lifespan in days */\n cookieDays: number;\n /** sessionStorage key (fallback) */\n storageKey: string;\n /** Maps data-utm-input shorthand names \u2192 internal keys */\n inputKeyMap: Record<string, string>;\n}\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// Recognised Domain Lists\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nconst SEARCH_ENGINES: string[] = [\n \"google.\",\n \"bing.com\",\n \"yahoo.\",\n \"duckduckgo.com\",\n \"baidu.com\",\n \"yandex.\",\n \"ask.com\",\n \"ecosia.org\",\n \"aol.com\",\n \"startpage.com\",\n \"qwant.com\",\n \"brave.com\",\n \"search.brave.com\",\n \"naver.com\",\n \"daum.net\",\n \"sogou.com\",\n \"so.com\",\n \"seznam.cz\",\n \"onesearch.com\",\n \"swisscows.com\",\n \"mojeek.com\",\n \"presearch.com\",\n \"search.yahoo.com\",\n \"googlesyndication.com\",\n \"googleadservices.com\",\n];\n\nconst SOCIAL_NETWORKS: string[] = [\n \"facebook.com\",\n \"fb.com\",\n \"fb.me\",\n \"l.facebook.com\",\n \"lm.facebook.com\",\n \"m.facebook.com\",\n \"instagram.com\",\n \"l.instagram.com\",\n \"twitter.com\",\n \"t.co\",\n \"x.com\",\n \"linkedin.com\",\n \"lnkd.in\",\n \"pinterest.com\",\n \"pin.it\",\n \"reddit.com\",\n \"tiktok.com\",\n \"youtube.com\",\n \"youtu.be\",\n \"snapchat.com\",\n \"tumblr.com\",\n \"threads.net\",\n \"mastodon.social\",\n \"bsky.app\",\n \"whatsapp.com\",\n \"wechat.com\",\n \"weibo.com\",\n \"vk.com\",\n \"quora.com\",\n \"medium.com\",\n \"discord.com\",\n \"discord.gg\",\n \"telegram.org\",\n \"t.me\",\n \"slack.com\",\n];\n\n// Friendly display names for recognised sources\nconst SOCIAL_DISPLAY_NAMES: Record<string, string> = {\n \"facebook.com\": \"Facebook\",\n \"fb.com\": \"Facebook\",\n \"fb.me\": \"Facebook\",\n \"l.facebook.com\": \"Facebook\",\n \"lm.facebook.com\": \"Facebook\",\n \"m.facebook.com\": \"Facebook\",\n \"instagram.com\": \"Instagram\",\n \"l.instagram.com\": \"Instagram\",\n \"twitter.com\": \"Twitter\",\n \"t.co\": \"Twitter\",\n \"x.com\": \"Twitter\",\n \"linkedin.com\": \"LinkedIn\",\n \"lnkd.in\": \"LinkedIn\",\n \"pinterest.com\": \"Pinterest\",\n \"pin.it\": \"Pinterest\",\n \"reddit.com\": \"Reddit\",\n \"tiktok.com\": \"TikTok\",\n \"youtube.com\": \"YouTube\",\n \"youtu.be\": \"YouTube\",\n \"snapchat.com\": \"Snapchat\",\n \"tumblr.com\": \"Tumblr\",\n \"threads.net\": \"Threads\",\n \"mastodon.social\": \"Mastodon\",\n \"bsky.app\": \"Bluesky\",\n \"whatsapp.com\": \"WhatsApp\",\n \"wechat.com\": \"WeChat\",\n \"weibo.com\": \"Weibo\",\n \"vk.com\": \"VK\",\n \"quora.com\": \"Quora\",\n \"medium.com\": \"Medium\",\n \"discord.com\": \"Discord\",\n \"discord.gg\": \"Discord\",\n \"telegram.org\": \"Telegram\",\n \"t.me\": \"Telegram\",\n \"slack.com\": \"Slack\",\n};\n\nconst SEARCH_DISPLAY_NAMES: Record<string, string> = {\n \"google.\": \"Google\",\n \"bing.com\": \"Bing\",\n \"yahoo.\": \"Yahoo\",\n \"duckduckgo.com\": \"DuckDuckGo\",\n \"baidu.com\": \"Baidu\",\n \"yandex.\": \"Yandex\",\n \"ask.com\": \"Ask\",\n \"ecosia.org\": \"Ecosia\",\n \"aol.com\": \"AOL\",\n \"startpage.com\": \"Startpage\",\n \"qwant.com\": \"Qwant\",\n \"brave.com\": \"Brave\",\n \"search.brave.com\": \"Brave\",\n \"naver.com\": \"Naver\",\n \"daum.net\": \"Daum\",\n \"sogou.com\": \"Sogou\",\n \"so.com\": \"360 Search\",\n \"seznam.cz\": \"Seznam\",\n \"googlesyndication.com\": \"Google\",\n \"googleadservices.com\": \"Google\",\n};\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// Main IIFE\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n(function (): void {\n \"use strict\";\n\n const config: UTMConfig = {\n utmKeys: [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n \"utm_id\",\n ],\n clickIdKeys: [\"gclid\", \"msclkid\", \"fbclid\"],\n linkSelectors: [\n \"a[href]\",\n \"button[onclick*='location']\",\n \"button[onclick*='window.open']\",\n \"button[onclick*='href']\",\n \"[data-href]\",\n ],\n inputSelector: \"[data-utm-input]\",\n cookieName: \"_attrib_data\",\n cookieDays: 30,\n storageKey: \"utm_attribution\",\n inputKeyMap: {\n // UTM shorthand \u2192 param key\n source: \"utm_source\",\n medium: \"utm_medium\",\n campaign: \"utm_campaign\",\n term: \"utm_term\",\n content: \"utm_content\",\n id: \"utm_id\",\n // Full UTM names\n utm_source: \"utm_source\",\n utm_medium: \"utm_medium\",\n utm_campaign: \"utm_campaign\",\n utm_term: \"utm_term\",\n utm_content: \"utm_content\",\n utm_id: \"utm_id\",\n // Click IDs\n gclid: \"gclid\",\n msclkid: \"msclkid\",\n fbclid: \"fbclid\",\n // Attribution outputs\n channel: \"_channel\",\n channeldrilldown1: \"_channelDrilldown1\",\n channeldrilldown2: \"_channelDrilldown2\",\n channeldrilldown3: \"_channelDrilldown3\",\n landingpage: \"_landingPage\",\n landingpagegroup: \"_landingPageGroup\",\n },\n };\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Helper: Domain Matching\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function domainMatches(hostname: string, pattern: string): boolean {\n const h = hostname.toLowerCase();\n const p = pattern.toLowerCase();\n // Patterns ending with \".\" are prefix matches (e.g., \"google.\" matches \"google.com\", \"google.co.uk\")\n if (p.endsWith(\".\")) {\n return h === p.slice(0, -1) || h.includes(\".\" + p.slice(0, -1) + \".\") || h.startsWith(p);\n }\n return h === p || h.endsWith(\".\" + p);\n }\n\n function isRecognisedSearchEngine(hostname: string): boolean {\n return SEARCH_ENGINES.some((pattern) => domainMatches(hostname, pattern));\n }\n\n function isRecognisedSocialNetwork(hostname: string): boolean {\n return SOCIAL_NETWORKS.some((domain) => domainMatches(hostname, domain));\n }\n\n function getSearchEngineName(hostname: string): string {\n for (const [pattern, name] of Object.entries(SEARCH_DISPLAY_NAMES)) {\n if (domainMatches(hostname, pattern)) return name;\n }\n return cleanDomain(hostname);\n }\n\n function getSocialNetworkName(hostname: string): string {\n for (const [domain, name] of Object.entries(SOCIAL_DISPLAY_NAMES)) {\n if (domainMatches(hostname, domain)) return name;\n }\n return cleanDomain(hostname);\n }\n\n /** Strips \"www.\" and returns the domain */\n function cleanDomain(hostname: string): string {\n return hostname.replace(/^www\\./, \"\");\n }\n\n /** Check if a value is the name of a recognised social network */\n function valueIsSocialNetwork(value: string): boolean {\n const v = value.toLowerCase().trim();\n // Check against display names (case-insensitive)\n const allNames = Object.values(SOCIAL_DISPLAY_NAMES).map((n) =>\n n.toLowerCase()\n );\n if (allNames.includes(v)) return true;\n // Check against domain patterns\n return SOCIAL_NETWORKS.some(\n (domain) => v === domain || v === domain.replace(\".com\", \"\")\n );\n }\n\n /** Check if a value is the name of a recognised search engine */\n function valueIsSearchEngine(value: string): boolean {\n const v = value.toLowerCase().trim();\n const allNames = Object.values(SEARCH_DISPLAY_NAMES).map((n) =>\n n.toLowerCase()\n );\n if (allNames.includes(v)) return true;\n return SEARCH_ENGINES.some((pattern) => {\n const clean = pattern.replace(/\\.$/, \"\");\n return v === clean || v === clean.replace(\".com\", \"\");\n });\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Helper: String checks\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function containsAny(value: string | undefined, ...terms: string[]): boolean {\n if (!value) return false;\n const v = value.toLowerCase();\n return terms.some((t) => v.includes(t.toLowerCase()));\n }\n\n function equalsAny(value: string | undefined, ...terms: string[]): boolean {\n if (!value) return false;\n const v = value.toLowerCase().trim();\n return terms.some((t) => v === t.toLowerCase());\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Cookie Persistence\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function setCookie(name: string, value: string, days: number): void {\n const expires = new Date(Date.now() + days * 864e5).toUTCString();\n document.cookie = `${name}=${encodeURIComponent(value)};expires=${expires};path=/;SameSite=Lax`;\n }\n\n function getCookie(name: string): string | null {\n const match = document.cookie.match(\n new RegExp(\"(?:^|; )\" + name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\") + \"=([^;]*)\")\n );\n return match ? decodeURIComponent(match[1]) : null;\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Persistence Layer (Cookie \u2192 sessionStorage fallback)\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function storeAttribution(data: AttributionData): void {\n const json = JSON.stringify(data);\n try {\n setCookie(config.cookieName, json, config.cookieDays);\n } catch (e) {\n console.warn(\"UTM: Could not set cookie\", e);\n }\n try {\n sessionStorage.setItem(config.storageKey, json);\n } catch (e) {\n console.warn(\"UTM: Could not write to sessionStorage\", e);\n }\n }\n\n function getStoredAttribution(): AttributionData | null {\n try {\n const fromCookie = getCookie(config.cookieName);\n if (fromCookie) return JSON.parse(fromCookie);\n } catch (e) {\n console.warn(\"UTM: Could not parse cookie\", e);\n }\n try {\n const fromStorage = sessionStorage.getItem(config.storageKey);\n if (fromStorage) return JSON.parse(fromStorage);\n } catch (e) {\n console.warn(\"UTM: Could not read sessionStorage\", e);\n }\n return null;\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Param Capture from URL\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function getCapturedParams(): UTMParams {\n const urlParams = new URLSearchParams(window.location.search);\n const captured: UTMParams = {};\n\n // Standard UTM keys\n config.utmKeys.forEach((key) => {\n const value = urlParams.get(key);\n if (value) captured[key] = value;\n });\n\n // Click IDs (gclid, msclkid, fbclid)\n config.clickIdKeys.forEach((key) => {\n const value = urlParams.get(key);\n if (value) captured[key] = value;\n });\n\n // Bare \"source\" parameter (non-standard, but used by some tools)\n const bareSource = urlParams.get(\"source\");\n if (bareSource && !captured[\"utm_source\"]) {\n captured[\"source\"] = bareSource;\n }\n\n return captured;\n }\n\n function hasTrackingParams(params: UTMParams): boolean {\n return (\n !!params.utm_source ||\n !!params.utm_medium ||\n !!params.utm_campaign ||\n !!params.source ||\n !!params.gclid ||\n !!params.msclkid ||\n !!params.fbclid\n );\n }\n\n function hasUTMParams(params: UTMParams): boolean {\n return (\n !!params.utm_source || !!params.utm_medium || !!params.utm_campaign\n );\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Referrer Analysis\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function getReferrerHostname(): string {\n try {\n if (!document.referrer) return \"\";\n const url = new URL(document.referrer);\n // Ignore self-referrals\n if (url.hostname === window.location.hostname) return \"\";\n return url.hostname.toLowerCase();\n } catch {\n return \"\";\n }\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Landing Page Info\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function getLandingPage(): string {\n return window.location.pathname + window.location.search;\n }\n\n function getLandingPageGroup(): string {\n const path = window.location.pathname;\n // Return the first directory segment, or \"/\" for root\n const segments = path.split(\"/\").filter(Boolean);\n return segments.length > 0 ? \"/\" + segments[0] : \"/\";\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Channel Categorisation Engine (11-rule cascade)\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function categorise(params: UTMParams, referrerHost: string): AttributionResult {\n const utm_source = params.utm_source || \"\";\n const utm_medium = params.utm_medium || \"\";\n const utm_campaign = params.utm_campaign || \"\";\n const utm_term = params.utm_term || \"\";\n const utm_content = params.utm_content || \"\";\n const bare_source = params.source || \"\";\n const gclid = params.gclid || \"\";\n const msclkid = params.msclkid || \"\";\n const fbclid = params.fbclid || \"\";\n\n const landingPage = getLandingPage();\n const landingPageGroup = getLandingPageGroup();\n\n const base: Pick<AttributionResult, \"landingPage\" | \"landingPageGroup\"> = {\n landingPage,\n landingPageGroup,\n };\n\n // \u2500\u2500 Rule 1: Organic Social \u2500\u2500\n // utm_medium = \"social\" AND (utm_source is a recognised social network\n // OR referrer is a recognised social network)\n if (equalsAny(utm_medium, \"social\")) {\n if (valueIsSocialNetwork(utm_source) || isRecognisedSocialNetwork(referrerHost)) {\n const sourceName =\n valueIsSocialNetwork(utm_source)\n ? capitalise(utm_source)\n : getSocialNetworkName(referrerHost);\n return {\n ...base,\n channel: \"Organic Social\",\n channelDrilldown1: sourceName,\n channelDrilldown2: utm_campaign || \"\",\n channelDrilldown3: utm_content || \"\",\n };\n }\n }\n\n // \u2500\u2500 Rule 2: Email Marketing \u2500\u2500\n // utm_medium = \"email\"\n if (equalsAny(utm_medium, \"email\")) {\n return {\n ...base,\n channel: \"Email Marketing\",\n channelDrilldown1: utm_source || \"Email\",\n channelDrilldown2: utm_campaign || \"\",\n channelDrilldown3: utm_content || \"\",\n };\n }\n\n // \u2500\u2500 Rule 3: Paid Social \u2500\u2500\n // utm_source or utm_medium contains \"paidsocial\"\n // OR utm_medium contains \"paid\"/\"ppc\"/\"cpc\" AND utm_source is a recognised social network\n // OR utm_medium contains \"paid\"/\"ppc\"/\"cpc\" AND referrer is a recognised social network\n if (\n containsAny(utm_source, \"paidsocial\") ||\n containsAny(utm_medium, \"paidsocial\") ||\n (containsAny(utm_medium, \"paid\", \"ppc\", \"cpc\") &&\n valueIsSocialNetwork(utm_source)) ||\n (containsAny(utm_medium, \"paid\", \"ppc\", \"cpc\") &&\n isRecognisedSocialNetwork(referrerHost))\n ) {\n const sourceName = valueIsSocialNetwork(utm_source)\n ? capitalise(utm_source)\n : isRecognisedSocialNetwork(referrerHost)\n ? getSocialNetworkName(referrerHost)\n : utm_source || \"Paid Social\";\n return {\n ...base,\n channel: \"Paid Social\",\n channelDrilldown1: sourceName,\n channelDrilldown2: utm_campaign || \"\",\n channelDrilldown3: utm_term || utm_content || \"\",\n };\n }\n\n // \u2500\u2500 Rule 4: Paid Search \u2500\u2500\n // utm_source or utm_medium contains \"paidsearch\"\n // OR utm_source / utm_medium / utm_campaign contains \"adwords\" / \"ppc\" / \"cpc\"\n // OR gclid or msclkid is present\n // OR any utm param is present AND referrer is a recognised search engine\n if (\n containsAny(utm_source, \"paidsearch\") ||\n containsAny(utm_medium, \"paidsearch\") ||\n containsAny(utm_source, \"adwords\", \"ppc\", \"cpc\") ||\n containsAny(utm_medium, \"adwords\", \"ppc\", \"cpc\") ||\n containsAny(utm_campaign, \"adwords\", \"ppc\", \"cpc\") ||\n gclid ||\n msclkid ||\n (hasUTMParams(params) && isRecognisedSearchEngine(referrerHost))\n ) {\n let sourceName = \"Paid Search\";\n if (gclid) {\n sourceName = \"Google\";\n } else if (msclkid) {\n sourceName = \"Bing\";\n } else if (valueIsSearchEngine(utm_source)) {\n sourceName = capitalise(utm_source);\n } else if (isRecognisedSearchEngine(referrerHost)) {\n sourceName = getSearchEngineName(referrerHost);\n } else if (utm_source) {\n sourceName = utm_source;\n }\n return {\n ...base,\n channel: \"Paid Search\",\n channelDrilldown1: sourceName,\n channelDrilldown2: utm_campaign || \"\",\n channelDrilldown3: utm_term || \"\",\n };\n }\n\n // \u2500\u2500 Rule 5: Display \u2500\u2500\n // utm_medium = \"display\"\n if (equalsAny(utm_medium, \"display\")) {\n return {\n ...base,\n channel: \"Display\",\n channelDrilldown1: utm_source || \"Display\",\n channelDrilldown2: utm_campaign || \"\",\n channelDrilldown3: utm_content || \"\",\n };\n }\n\n // \u2500\u2500 Rule 6: Affiliates \u2500\u2500\n // utm_medium contains \"affiliate\" or \"affiliates\"\n if (containsAny(utm_medium, \"affiliate\")) {\n return {\n ...base,\n channel: \"Affiliates\",\n channelDrilldown1: utm_source || \"Affiliate\",\n channelDrilldown2: utm_campaign || \"\",\n channelDrilldown3: utm_content || \"\",\n };\n }\n\n // \u2500\u2500 Rule 7: Other Campaigns \u2500\u2500\n // Any tracking param is present (utm_source, utm_medium, utm_campaign, source)\n // but none of the above rules matched\n if (hasTrackingParams(params)) {\n return {\n ...base,\n channel: \"Other Campaigns\",\n channelDrilldown1: utm_source || bare_source || \"\",\n channelDrilldown2: utm_medium || \"\",\n channelDrilldown3: utm_campaign || \"\",\n };\n }\n\n // \u2500\u2500 Rules 8\u201311: No tracking params \u2192 fall back to referrer \u2500\u2500\n\n // \u2500\u2500 Rule 8: Organic Social (by referrer) \u2500\u2500\n if (referrerHost && isRecognisedSocialNetwork(referrerHost)) {\n return {\n ...base,\n channel: \"Organic Social\",\n channelDrilldown1: getSocialNetworkName(referrerHost),\n channelDrilldown2: \"\",\n channelDrilldown3: \"\",\n };\n }\n\n // \u2500\u2500 Rule 9: Organic Search (by referrer) \u2500\u2500\n if (referrerHost && isRecognisedSearchEngine(referrerHost)) {\n return {\n ...base,\n channel: \"Organic Search\",\n channelDrilldown1: getSearchEngineName(referrerHost),\n channelDrilldown2: \"\",\n channelDrilldown3: \"\",\n };\n }\n\n // \u2500\u2500 Rule 10: Referral \u2500\u2500\n if (referrerHost) {\n return {\n ...base,\n channel: \"Referral\",\n channelDrilldown1: cleanDomain(referrerHost),\n channelDrilldown2: landingPage,\n channelDrilldown3: \"\",\n };\n }\n\n // \u2500\u2500 Rule 11: Direct \u2500\u2500\n return {\n ...base,\n channel: \"Direct\",\n channelDrilldown1: \"Direct\",\n channelDrilldown2: landingPage,\n channelDrilldown3: \"\",\n };\n }\n\n function capitalise(str: string): string {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Link Processing (propagate UTM params only)\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function isInternalLink(url: string, currentHost: string): boolean {\n try {\n if (\n url.startsWith(\"/\") ||\n url.startsWith(\"./\") ||\n url.startsWith(\"../\")\n ) {\n return true;\n }\n if (/^[a-z]+:/i.test(url) && !url.startsWith(\"http\")) {\n return false;\n }\n if (url.startsWith(\"http\")) {\n return new URL(url).hostname === currentHost;\n }\n if (url.startsWith(\"//\")) {\n return new URL(\"https:\" + url).hostname === currentHost;\n }\n if (!url.includes(\"://\")) {\n return true;\n }\n return false;\n } catch (e) {\n console.warn(\"UTM: Error parsing URL:\", url, e);\n return false;\n }\n }\n\n function addUTMToURL(url: string, utmParams: UTMParams): string {\n try {\n const urlObj = new URL(url, window.location.origin);\n\n Object.entries(utmParams).forEach(([key, value]) => {\n // Only propagate standard UTM keys (not click IDs or internal keys)\n if (!config.utmKeys.includes(key)) return;\n // NEVER override existing params in the URL\n if (urlObj.searchParams.has(key)) return;\n urlObj.searchParams.set(key, value);\n });\n\n return urlObj.toString();\n } catch (e) {\n console.warn(\"UTM: Error processing URL:\", url, e);\n return url;\n }\n }\n\n function hasUTMException(element: Element): boolean {\n return element.getAttribute(\"data-utm-exception\") === \"true\";\n }\n\n function processLink(element: Element, utmParams: UTMParams): void {\n if (hasUTMException(element)) return;\n\n const currentHost = window.location.hostname;\n let url: string | null = null;\n\n if (element instanceof HTMLAnchorElement && element.href) {\n url = element.href;\n } else if (element instanceof HTMLElement && element.dataset.href) {\n url = element.dataset.href;\n }\n\n if (url && isInternalLink(url, currentHost)) {\n const updatedURL = addUTMToURL(url, utmParams);\n\n if (element instanceof HTMLAnchorElement) {\n element.href = updatedURL;\n } else if (element instanceof HTMLElement && element.dataset.href) {\n element.dataset.href = updatedURL;\n }\n }\n }\n\n function processAllLinks(utmParams: UTMParams): void {\n const links = document.querySelectorAll(config.linkSelectors.join(\", \"));\n links.forEach((el) => processLink(el, utmParams));\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Input Field Processing\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // Usage:\n // <input type=\"hidden\" data-utm-input=\"source\" />\n // <input type=\"hidden\" data-utm-input=\"medium\" />\n // <input type=\"hidden\" data-utm-input=\"campaign\" />\n // <input type=\"hidden\" data-utm-input=\"term\" />\n // <input type=\"hidden\" data-utm-input=\"content\" />\n // <input type=\"hidden\" data-utm-input=\"id\" />\n // <input type=\"hidden\" data-utm-input=\"gclid\" />\n // <input type=\"hidden\" data-utm-input=\"msclkid\" />\n // <input type=\"hidden\" data-utm-input=\"channel\" />\n // <input type=\"hidden\" data-utm-input=\"channelDrilldown1\" />\n // <input type=\"hidden\" data-utm-input=\"channelDrilldown2\" />\n // <input type=\"hidden\" data-utm-input=\"channelDrilldown3\" />\n // <input type=\"hidden\" data-utm-input=\"landingPage\" />\n // <input type=\"hidden\" data-utm-input=\"landingPageGroup\" />\n\n function processInput(\n element: Element,\n allValues: Record<string, string>\n ): void {\n if (hasUTMException(element)) return;\n\n const shortKey = element\n .getAttribute(\"data-utm-input\")\n ?.trim()\n .toLowerCase();\n if (!shortKey) return;\n\n // Resolve shorthand \u2192 internal key\n const internalKey = config.inputKeyMap[shortKey];\n if (!internalKey) {\n console.warn(`UTM: Unknown data-utm-input value \"${shortKey}\"`);\n return;\n }\n\n const value = allValues[internalKey];\n if (!value) return;\n\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ) {\n // NEVER override a field that already has a value\n if (element.value && element.value.trim() !== \"\") return;\n\n element.value = value;\n\n // Dispatch events so frameworks (React, Vue, etc.) pick up the change\n element.dispatchEvent(new Event(\"input\", { bubbles: true }));\n element.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n }\n\n function processAllInputs(allValues: Record<string, string>): void {\n const inputs = document.querySelectorAll(config.inputSelector);\n inputs.forEach((el) => processInput(el, allValues));\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Build a flat key\u2192value map for form fields\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function buildValueMap(data: AttributionData): Record<string, string> {\n const map: Record<string, string> = {};\n\n // Raw UTM params and click IDs\n Object.entries(data.params).forEach(([key, value]) => {\n map[key] = value;\n });\n\n // Attribution results (prefixed with _ to avoid collision with raw params)\n map[\"_channel\"] = data.attribution.channel;\n map[\"_channelDrilldown1\"] = data.attribution.channelDrilldown1;\n map[\"_channelDrilldown2\"] = data.attribution.channelDrilldown2;\n map[\"_channelDrilldown3\"] = data.attribution.channelDrilldown3;\n map[\"_landingPage\"] = data.attribution.landingPage;\n map[\"_landingPageGroup\"] = data.attribution.landingPageGroup;\n\n return map;\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // MutationObserver (handles dynamically added content)\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function observeNewContent(\n utmParams: UTMParams,\n allValues: Record<string, string>\n ): void {\n const allSelectors = [...config.linkSelectors, config.inputSelector].join(\n \", \"\n );\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let pendingNodes: Element[] = [];\n\n function flushPending(): void {\n const nodes = pendingNodes.slice();\n pendingNodes = [];\n debounceTimer = null;\n\n nodes.forEach((element) => {\n if (element.matches && element.matches(config.inputSelector)) {\n processInput(element, allValues);\n } else if (\n element.matches &&\n element.matches(config.linkSelectors.join(\", \"))\n ) {\n processLink(element, utmParams);\n }\n\n // Also check children of added nodes\n element.querySelectorAll?.(allSelectors).forEach((child) => {\n if (child.matches(config.inputSelector)) {\n processInput(child, allValues);\n } else {\n processLink(child, utmParams);\n }\n });\n });\n }\n\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n pendingNodes.push(node as Element);\n }\n });\n });\n\n if (pendingNodes.length > 0 && !debounceTimer) {\n debounceTimer = setTimeout(flushPending, 50);\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Init\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function init(): void {\n const freshParams = getCapturedParams();\n const referrerHost = getReferrerHostname();\n const hasFreshTracking = hasTrackingParams(freshParams);\n\n let data: AttributionData;\n\n if (hasFreshTracking) {\n // Fresh URL params always win \u2014 categorise from scratch\n const attribution = categorise(freshParams, referrerHost);\n data = { params: freshParams, attribution };\n storeAttribution(data);\n } else if (referrerHost) {\n // No URL params but we have a referrer \u2014 categorise based on referrer\n // Only do this if there's no existing stored attribution\n // (to avoid overwriting a previous paid click with a later organic visit)\n const stored = getStoredAttribution();\n if (stored) {\n data = stored;\n } else {\n const attribution = categorise(freshParams, referrerHost);\n data = { params: freshParams, attribution };\n storeAttribution(data);\n }\n } else {\n // No URL params and no referrer \u2014 use stored data or fall back to Direct\n const stored = getStoredAttribution();\n if (stored) {\n data = stored;\n } else {\n const attribution = categorise(freshParams, referrerHost);\n data = { params: {}, attribution };\n storeAttribution(data);\n }\n }\n\n const allValues = buildValueMap(data);\n\n const run = (): void => {\n processAllLinks(data.params);\n processAllInputs(allValues);\n observeNewContent(data.params, allValues);\n // console.log(\"UTM Attribution:\", data.attribution);\n // console.log(\"UTM Params:\", data.params);\n };\n\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", run);\n } else {\n run();\n }\n }\n\n init();\n})();"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/promptbar/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[promptbar=border]{position:absolute;inset:0;border-radius:18px;padding:2px;-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none;background:conic-gradient(from var(--angle, 0deg),transparent 0%,transparent 40%,#e8603c 50%,#f0a070 55%,transparent 65%,transparent 100%);opacity:0;transition:opacity .3s ease}[promptbar=border][is-animating=true]{animation:spin 3.5s linear forwards;opacity:1}@keyframes spin{0%{--angle: 0deg;opacity:1}85%{--angle: 360deg;opacity:1}to{--angle: 360deg;opacity:0}}[promptbar=submit][is-clicked=true]{transform:scale(.8);transition:transform .12s cubic-bezier(.34,1.56,.64,1),background-color .15s ease}[promptbar=submit][is-clicked=false]{transform:scale(1);transition:transform .4s cubic-bezier(.34,1.56,.64,1),background-color .5s ease}.chroma-text{background-image:linear-gradient(90deg,#ffffff 0,#ffffff 33.33%,#e8603c 40%,#f0845a 45%,#ffc4a8 50%,#f07050 55%,#c94020 60%,transparent 66.67%,transparent);background-size:300% 100%;background-position:100% 0;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;text-fill-color:transparent;color:transparent;font-size:var(--_text-size---body--l);line-height:var(--_line-height---line-height-body--l);font-weight:var(--_font-weight---font-weight-body--l)}.chroma-text[data-animate=true]{animation:chroma-sweep 1.5s ease-in-out forwards;filter:blur(1px)}@keyframes chroma-sweep{0%{background-position:100% 0;filter:blur(1px)}to{background-position:0 0;filter:blur(0)}}.promptbar-text-item{display:none;opacity:0!important}[prompt-slide-image]{position:absolute;border-radius:18px;opacity:0;transform:scale(0);filter:blur(16px);transition:none}[prompt-slide-image="1"]{--i: 1}[prompt-slide-image="2"]{--i: 2}[prompt-slide-image="3"]{--i: 3}[prompt-slide-image="4"]{--i: 4}[prompt-slide-image="5"]{--i: 5}[prompt-slide-image="6"]{--i: 6}[prompt-slide-image="7"]{--i: 7}[prompt-slide-image="8"]{--i: 8}[prompt-slide-image="1"]{top:52vh;left:1vw;width:10vw;aspect-ratio:3/4}[prompt-slide-image="2"]{bottom:-5vh;left:16vw;width:18vw;aspect-ratio:3/4}[prompt-slide-image="3"]{top:28vh;right:-4vw;width:16vw;aspect-ratio:4/5}[prompt-slide-image="4"]{top:-20vh;right:40vw;width:20vw;aspect-ratio:4/5}[prompt-slide-image="5"]{top:-18vh;left:4vw;width:18vw;aspect-ratio:2/3}[prompt-slide-image="6"]{top:6vh;right:14vw;width:12vw;aspect-ratio:3/4}[prompt-slide-image="7"]{bottom:-24vh;left:42vw;width:18vw;aspect-ratio:4/5}[prompt-slide-image="8"]{bottom:-20vh;right:10vw;width:20vw;aspect-ratio:2/3}@media (max-width: 800px){[prompt-slide-image="
|
|
1
|
+
[promptbar=border]{position:absolute;inset:0;border-radius:18px;padding:2px;-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none;background:conic-gradient(from var(--angle, 0deg),transparent 0%,transparent 40%,#e8603c 50%,#f0a070 55%,transparent 65%,transparent 100%);opacity:0;transition:opacity .3s ease}[promptbar=border][is-animating=true]{animation:spin 3.5s linear forwards;opacity:1}@keyframes spin{0%{--angle: 0deg;opacity:1}85%{--angle: 360deg;opacity:1}to{--angle: 360deg;opacity:0}}[promptbar=submit][is-clicked=true]{transform:scale(.8);transition:transform .12s cubic-bezier(.34,1.56,.64,1),background-color .15s ease}[promptbar=submit][is-clicked=false]{transform:scale(1);transition:transform .4s cubic-bezier(.34,1.56,.64,1),background-color .5s ease}.chroma-text{background-image:linear-gradient(90deg,#ffffff 0,#ffffff 33.33%,#e8603c 40%,#f0845a 45%,#ffc4a8 50%,#f07050 55%,#c94020 60%,transparent 66.67%,transparent);background-size:300% 100%;background-position:100% 0;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;text-fill-color:transparent;color:transparent;font-size:var(--_text-size---body--l);line-height:var(--_line-height---line-height-body--l);font-weight:var(--_font-weight---font-weight-body--l)}.chroma-text[data-animate=true]{animation:chroma-sweep 1.5s ease-in-out forwards;filter:blur(1px)}@keyframes chroma-sweep{0%{background-position:100% 0;filter:blur(1px)}to{background-position:0 0;filter:blur(0)}}.promptbar-text-item{display:none;opacity:0!important}[prompt-slide-image]{position:absolute;border-radius:18px;opacity:0;transform:scale(0);filter:blur(16px);transition:none}[prompt-slide-image="1"]{--i: 1}[prompt-slide-image="2"]{--i: 2}[prompt-slide-image="3"]{--i: 3}[prompt-slide-image="4"]{--i: 4}[prompt-slide-image="5"]{--i: 5}[prompt-slide-image="6"]{--i: 6}[prompt-slide-image="7"]{--i: 7}[prompt-slide-image="8"]{--i: 8}[prompt-slide-image="1"]{top:52vh;left:1vw;width:10vw;aspect-ratio:3/4}[prompt-slide-image="2"]{bottom:-5vh;left:16vw;width:18vw;aspect-ratio:3/4}[prompt-slide-image="3"]{top:28vh;right:-4vw;width:16vw;aspect-ratio:4/5}[prompt-slide-image="4"]{top:-20vh;right:40vw;width:20vw;aspect-ratio:4/5}[prompt-slide-image="5"]{top:-18vh;left:4vw;width:18vw;aspect-ratio:2/3}[prompt-slide-image="6"]{top:6vh;right:14vw;width:12vw;aspect-ratio:3/4}[prompt-slide-image="7"]{bottom:-24vh;left:42vw;width:18vw;aspect-ratio:4/5}[prompt-slide-image="8"]{bottom:-20vh;right:10vw;width:20vw;aspect-ratio:2/3}@media (max-width: 800px){[prompt-slide-image="4"],[prompt-slide-image="6"],[prompt-slide-image="7"],[prompt-slide-image="8"]{display:none}[prompt-slide-image="1"]{top:6vh;left:6vw;width:calc(10vw + 100px);aspect-ratio:3/4}[prompt-slide-image="2"]{bottom:12vh;left:8vw;width:calc(6vw + 100px);aspect-ratio:2/3}[prompt-slide-image="3"]{top:4vh;right:8vw;width:calc(10vw + 100px);aspect-ratio:4/5}[prompt-slide-image="5"]{top:auto;bottom:10vh;right:4vw;left:auto;width:40vw;aspect-ratio:3/4}}@media (min-width: 768px) and (max-width: 1024px) and (orientation: portrait){[prompt-slide-image="1"]{top:-1vh;left:2vw;width:20vw}[prompt-slide-image="6"]{top:3vh;right:2vw;width:20vw}[prompt-slide-image="2"]{bottom:10vh;left:1vw;width:18vw}[prompt-slide-image="3"]{top:40vh;right:3vw;width:16vw}[prompt-slide-image="8"]{bottom:-2vh;right:40vw;width:24vw;aspect-ratio:1/1.2}.prompt-hero_wrapper{max-height:600px}}@media (min-width: 1025px) and (max-width: 1366px) and (orientation: portrait){.prompt-hero_wrapper{max-height:800px}[prompt-slide-image="5"]{top:-100vh}}.swiper-pagination-bullet{background:#ffffff59;opacity:1;transition:background .3s,transform .3s}.swiper-pagination-bullet-active{background:#fff;transform:scale(1.4)}[prompt-skeleton]{position:absolute;inset:0;border-radius:18px;background:#1a1a1a;animation:skeleton-pulse 1.6s ease-in-out infinite;opacity:1;transition:opacity .4s ease;z-index:2}@keyframes skeleton-pulse{0%{background:#1a1a1a}50%{background:#2e2e2e}to{background:#1a1a1a}}@property --angle{syntax: "<angle>"; initial-value: 0deg; inherits: false;}.submit_button_loading{position:absolute;inset:0;background:#fff;border-radius:8px;display:flex;align-items:center;justify-content:center}.submit_button_loading:before{content:"";position:absolute;inset:-6px;background:conic-gradient(from var(--angle),#e8603c,#f0a070,#ffd27a,#ff8fa3,#e8603c);animation:spin 2s linear infinite;z-index:-2;border-radius:12px;filter:blur(10px);opacity:.85}.submit_button_loading:after{content:"";position:absolute;inset:0;background:#fff;border-radius:8px;z-index:-1}@keyframes spin{to{--angle: 360deg}}[prompt-skeleton]{display:none}[prompt-slide-image-inner]{border-radius:10px;overflow:hidden}@media screen and (max-width: 479px){[custom-style-identifier=prompt-title]{font-size:40px;max-width:264px;margin:auto;text-align:center}}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/promptbar/style.css"],
|
|
4
|
-
"sourcesContent": [" [promptbar=\"border\"] {\n position: absolute;\n inset: 0;\n border-radius: 18px;\n padding: 2px;\n -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);\n mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n pointer-events: none;\n background: conic-gradient(from var(--angle, 0deg),\n transparent 0%,\n transparent 40%,\n #e8603c 50%,\n #f0a070 55%,\n transparent 65%,\n transparent 100%);\n opacity: 0;\n transition: opacity 0.3s ease;\n }\n\n @property --angle {\n syntax: '<angle>';\n initial-value: 0deg;\n inherits: false;\n }\n\n [promptbar=\"border\"][is-animating=\"true\"] {\n animation: spin 3.5s linear forwards;\n opacity: 1;\n }\n\n @keyframes spin {\n from {\n --angle: 0deg;\n opacity: 1;\n }\n\n 85% {\n --angle: 360deg;\n opacity: 1;\n }\n\n 100% {\n --angle: 360deg;\n opacity: 0;\n }\n }\n\n [promptbar=\"submit\"][is-clicked=\"true\"] {\n transform: scale(0.80);\n transition: transform 0.12s cubic-bezier(0.34, 1.56, 0.64, 1),\n background-color 0.15s ease;\n }\n\n [promptbar=\"submit\"][is-clicked=\"false\"] {\n transform: scale(1);\n transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1),\n background-color 0.5s ease;\n }\n\n\n /* .chroma-text {\n background-image: linear-gradient(90deg,\n #000000 0,\n #000000 33.33%,\n #4E52F2 40%,\n #DD9DFF 45%,\n #E3A4A8 50%,\n #50C0FE 55%,\n #1E31FC 60%,\n transparent 66.67%,\n transparent);\n background-size: 300% 100%;\n background-position: 100% 0;\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n text-fill-color: transparent;\n color: transparent;\n\n\n font-size: var(--_text-size---body--l);\n line-height: var(--_line-height---line-height-body--l);\n font-weight: var(--_font-weight---font-weight-body--l);\n} */\n .chroma-text {\n background-image: linear-gradient(90deg,\n #ffffff 0,\n #ffffff 33.33%,\n #e8603c 40%,\n #f0845a 45%,\n #ffc4a8 50%,\n #f07050 55%,\n #c94020 60%,\n transparent 66.67%,\n transparent);\n background-size: 300% 100%;\n background-position: 100% 0;\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n text-fill-color: transparent;\n color: transparent;\n\n font-size: var(--_text-size---body--l);\n line-height: var(--_line-height---line-height-body--l);\n font-weight: var(--_font-weight---font-weight-body--l);\n }\n\n /* Only animate when explicitly true */\n .chroma-text[data-animate=\"true\"] {\n animation: chroma-sweep 1.5s ease-in-out forwards;\n filter: blur(1px);\n }\n\n @keyframes chroma-sweep {\n 0% {\n background-position: 100% 0;\n filter: blur(1px);\n }\n\n to {\n background-position: 0 0;\n filter: blur(0);\n }\n }\n\n .promptbar-text-item {\n display: none;\n opacity: 0 !important;\n }\n\n\n\n [prompt-slide-image] {\n position: absolute;\n border-radius: 18px;\n opacity: 0;\n transform: scale(0);\n filter: blur(16px);\n transition: none;\n /* let GSAP handle it */\n }\n\n\n\n /* stagger delays\n .block:nth-child(1) { transition-delay: 0.00s; }\n .block:nth-child(2) { transition-delay: 0.07s; }\n .block:nth-child(3) { transition-delay: 0.14s; }\n .block:nth-child(4) { transition-delay: 0.21s; }\n .block:nth-child(5) { transition-delay: 0.28s; }\n .block:nth-child(6) { transition-delay: 0.35s; }\n .block:nth-child(7) { transition-delay: 0.42s; }\n .block:nth-child(8) { transition-delay: 0.49s; } */\n\n [prompt-slide-image=\"1\"] {\n --i: 1;\n }\n\n [prompt-slide-image=\"2\"] {\n --i: 2;\n }\n\n [prompt-slide-image=\"3\"] {\n --i: 3;\n }\n\n [prompt-slide-image=\"4\"] {\n --i: 4;\n }\n\n [prompt-slide-image=\"5\"] {\n --i: 5;\n }\n\n [prompt-slide-image=\"6\"] {\n --i: 6;\n }\n\n [prompt-slide-image=\"7\"] {\n --i: 7;\n }\n\n [prompt-slide-image=\"8\"] {\n --i: 8;\n }\n\n /*\n 8 ZONES (never touch center keep-out ~26%\u201374% x, 28%\u201372% y):\n 1 \u2192 far-left-top\n 2 \u2192 far-left-bottom\n 3 \u2192 far-right-top\n 4 \u2192 far-right-bottom\n 5 \u2192 top-inner-left (above center, left half)\n 6 \u2192 top-inner-right (above center, right half)\n 7 \u2192 bottom-inner-left\n 8 \u2192 bottom-inner-right\n\n Each [prompt-slide-image=\"N\"] maps to zone N.\n Each slide has different sizes + slight position variation per zone.\n */\n\n /* ===================== ZONE POSITIONS (shared across slides, overridden per slide for size variety) ===================== */\n /* Zone 1 \u2013 far left top */\n [prompt-slide-image=\"1\"] {\n top: 52vh;\n left: 1vw;\n width: 10vw;\n aspect-ratio: 3/4;\n }\n\n /* Zone 2 \u2013 far left bottom */\n [prompt-slide-image=\"2\"] {\n bottom: -5vh;\n left: 16vw;\n width: 18vw;\n aspect-ratio: 3/4;\n }\n\n /* Zone 3 \u2013 far right top */\n [prompt-slide-image=\"3\"] {\n top: 28vh;\n right: -4vw;\n width: 16vw;\n aspect-ratio: 4/5;\n }\n\n /* Zone 4 \u2013 far right bottom */\n [prompt-slide-image=\"4\"] {\n top: -20vh;\n right: 40vw;\n width: 20vw;\n aspect-ratio: 4/5;\n }\n\n /* Zone 5 \u2013 top inner left */\n [prompt-slide-image=\"5\"] {\n top: -18vh;\n left: 4vw;\n width: 18vw;\n aspect-ratio: 2/3;\n }\n\n /* Zone 6 \u2013 top inner right */\n [prompt-slide-image=\"6\"] {\n top: 6vh;\n right: 14vw;\n width: 12vw;\n aspect-ratio: 3/4;\n }\n\n /* Zone 7 \u2013 bottom inner left */\n [prompt-slide-image=\"7\"] {\n bottom: -24vh;\n left: 42vw;\n width: 18vw;\n aspect-ratio: 4/5;\n }\n\n /* Zone 8 \u2013 bottom inner right */\n [prompt-slide-image=\"8\"] {\n bottom: -20vh;\n right: 10vw;\n width: 20vw;\n aspect-ratio: 2/3;\n }\n\n /* \n @media (min-width: 990px) and (min-height: 801px) {\n [prompt-slide-image=\"5\"] {\n top: -2vh;\n }\n\n [prompt-slide-image=\"1\"] {\n top: 52vh;\n }\n\n [prompt-slide-image=\"7\"] {\n bottom: -10vh;\n }\n } */\n\n /*mobile styles */\n @media (max-width: 800px) {\n\n [prompt-slide-image=\"5\"],\n [prompt-slide-image=\"6\"],\n [prompt-slide-image=\"7\"],\n [prompt-slide-image=\"8\"] {\n display: none;\n }\n\n /* Zone 1 \u2013 far left top */\n [prompt-slide-image=\"1\"] {\n top: 6vh;\n left: 6vw;\n width: calc(10vw + 100px);\n aspect-ratio: 3/4;\n }\n\n /* Zone 2 \u2013 far left bottom */\n [prompt-slide-image=\"2\"] {\n bottom: 12vh;\n left: 8vw;\n width: calc(6vw + 100px);\n aspect-ratio: 2/3;\n }\n\n /* Zone 3 \u2013 far right top */\n [prompt-slide-image=\"3\"] {\n top: 4vh;\n right: 8vw;\n width: calc(10vw + 100px);\n aspect-ratio: 4/5;\n }\n\n /* Zone 4 \u2013 far right bottom */\n [prompt-slide-image=\"4\"] {\n bottom: 10vh;\n right: 6vw;\n width: calc(6vw + 100px);\n aspect-ratio: 12/16;\n }\n\n [prompt-slide-image=\"4\"] {\n display: block;\n }\n }\n\n /*Tablet styles */\n @media (min-width: 768px) and (max-width: 1024px) and (orientation: portrait) {\n\n [prompt-slide-image=\"1\"] {\n top: -1vh;\n left: 2vw;\n width: 20vw;\n }\n\n [prompt-slide-image=\"6\"] {\n top: 3vh;\n right: 2vw;\n width: 20vw;\n }\n\n [prompt-slide-image=\"2\"] {\n bottom: 10vh;\n left: 1vw;\n width: 18vw;\n }\n\n [prompt-slide-image=\"3\"] {\n top: 40vh;\n right: 3vw;\n width: 16vw;\n }\n\n [prompt-slide-image=\"8\"] {\n bottom: -2vh;\n right: 40vw;\n width: 24vw;\n aspect-ratio: 1/1.2;\n }\n\n .prompt-hero_wrapper {\n max-height: 600px;\n }\n }\n\n @media (min-width: 1025px) and (max-width: 1366px) and (orientation: portrait) {\n .prompt-hero_wrapper {\n max-height: 800px;\n }\n\n [prompt-slide-image=\"5\"] {\n top: -100vh;\n }\n }\n\n /* pagination */\n .swiper-pagination-bullet {\n background: rgba(255, 255, 255, 0.35);\n opacity: 1;\n transition: background 0.3s, transform 0.3s;\n }\n\n .swiper-pagination-bullet-active {\n background: #fff;\n transform: scale(1.4);\n }\n\n [prompt-skeleton] {\n position: absolute;\n inset: 0;\n border-radius: 18px;\n background: #1a1a1a;\n animation: skeleton-pulse 1.6s ease-in-out infinite;\n opacity: 1;\n transition: opacity 0.4s ease;\n z-index: 2;\n }\n\n @keyframes skeleton-pulse {\n 0% {\n background: #1a1a1a;\n }\n\n 50% {\n background: #2e2e2e;\n }\n\n 100% {\n background: #1a1a1a;\n }\n }\n\n\n /* [promptbar-slider] {\n opacity: 0;\n transition: opacity 1s ease;\n} */\n\n @property --angle {\n syntax: \"<angle>\";\n initial-value: 0deg;\n inherits: false;\n }\n\n @keyframes spin {\n to {\n --angle: 360deg;\n }\n }\n\n .submit_button_loading {\n position: absolute;\n inset: 0;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Glowing shadow behind */\n .submit_button_loading::before {\n content: \"\";\n position: absolute;\n inset: -6px;\n background: conic-gradient(from var(--angle),\n #e8603c,\n #f0a070,\n #ffd27a,\n #ff8fa3,\n #e8603c);\n animation: spin 2s linear infinite;\n z-index: -2;\n border-radius: 12px;\n filter: blur(10px);\n opacity: 0.85;\n }\n\n /* White mask covers center, lets glow peek out at edges */\n .submit_button_loading::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: white;\n border-radius: 8px;\n z-index: -1;\n }\n\n /* Remove the ::after \u2014 no more white mask needed */\n\n @keyframes spin {\n to {\n --angle: 360deg;\n }\n }\n\n\n [prompt-skeleton] {\n display: none;\n }\n\n [prompt-slide-image-inner] {\n border-radius: 10px;\n overflow: hidden;\n }\n\n\n @media screen and (max-width: 479px) {\n [custom-style-identifier=\"prompt-title\"] {\n font-size: 40px;\n max-width: 264px;\n margin: auto;\n text-align: center;\n }\n }\n\n\n /* .prompt-wrapper {\n pointer-events: none;\n } */"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": [" [promptbar=\"border\"] {\n position: absolute;\n inset: 0;\n border-radius: 18px;\n padding: 2px;\n -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);\n mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n pointer-events: none;\n background: conic-gradient(from var(--angle, 0deg),\n transparent 0%,\n transparent 40%,\n #e8603c 50%,\n #f0a070 55%,\n transparent 65%,\n transparent 100%);\n opacity: 0;\n transition: opacity 0.3s ease;\n }\n\n @property --angle {\n syntax: '<angle>';\n initial-value: 0deg;\n inherits: false;\n }\n\n [promptbar=\"border\"][is-animating=\"true\"] {\n animation: spin 3.5s linear forwards;\n opacity: 1;\n }\n\n @keyframes spin {\n from {\n --angle: 0deg;\n opacity: 1;\n }\n\n 85% {\n --angle: 360deg;\n opacity: 1;\n }\n\n 100% {\n --angle: 360deg;\n opacity: 0;\n }\n }\n\n [promptbar=\"submit\"][is-clicked=\"true\"] {\n transform: scale(0.80);\n transition: transform 0.12s cubic-bezier(0.34, 1.56, 0.64, 1),\n background-color 0.15s ease;\n }\n\n [promptbar=\"submit\"][is-clicked=\"false\"] {\n transform: scale(1);\n transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1),\n background-color 0.5s ease;\n }\n\n\n /* .chroma-text {\n background-image: linear-gradient(90deg,\n #000000 0,\n #000000 33.33%,\n #4E52F2 40%,\n #DD9DFF 45%,\n #E3A4A8 50%,\n #50C0FE 55%,\n #1E31FC 60%,\n transparent 66.67%,\n transparent);\n background-size: 300% 100%;\n background-position: 100% 0;\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n text-fill-color: transparent;\n color: transparent;\n\n\n font-size: var(--_text-size---body--l);\n line-height: var(--_line-height---line-height-body--l);\n font-weight: var(--_font-weight---font-weight-body--l);\n} */\n .chroma-text {\n background-image: linear-gradient(90deg,\n #ffffff 0,\n #ffffff 33.33%,\n #e8603c 40%,\n #f0845a 45%,\n #ffc4a8 50%,\n #f07050 55%,\n #c94020 60%,\n transparent 66.67%,\n transparent);\n background-size: 300% 100%;\n background-position: 100% 0;\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n text-fill-color: transparent;\n color: transparent;\n\n font-size: var(--_text-size---body--l);\n line-height: var(--_line-height---line-height-body--l);\n font-weight: var(--_font-weight---font-weight-body--l);\n }\n\n /* Only animate when explicitly true */\n .chroma-text[data-animate=\"true\"] {\n animation: chroma-sweep 1.5s ease-in-out forwards;\n filter: blur(1px);\n }\n\n @keyframes chroma-sweep {\n 0% {\n background-position: 100% 0;\n filter: blur(1px);\n }\n\n to {\n background-position: 0 0;\n filter: blur(0);\n }\n }\n\n .promptbar-text-item {\n display: none;\n opacity: 0 !important;\n }\n\n\n\n [prompt-slide-image] {\n position: absolute;\n border-radius: 18px;\n opacity: 0;\n transform: scale(0);\n filter: blur(16px);\n transition: none;\n /* let GSAP handle it */\n }\n\n\n\n /* stagger delays\n .block:nth-child(1) { transition-delay: 0.00s; }\n .block:nth-child(2) { transition-delay: 0.07s; }\n .block:nth-child(3) { transition-delay: 0.14s; }\n .block:nth-child(4) { transition-delay: 0.21s; }\n .block:nth-child(5) { transition-delay: 0.28s; }\n .block:nth-child(6) { transition-delay: 0.35s; }\n .block:nth-child(7) { transition-delay: 0.42s; }\n .block:nth-child(8) { transition-delay: 0.49s; } */\n\n [prompt-slide-image=\"1\"] {\n --i: 1;\n }\n\n [prompt-slide-image=\"2\"] {\n --i: 2;\n }\n\n [prompt-slide-image=\"3\"] {\n --i: 3;\n }\n\n [prompt-slide-image=\"4\"] {\n --i: 4;\n }\n\n [prompt-slide-image=\"5\"] {\n --i: 5;\n }\n\n [prompt-slide-image=\"6\"] {\n --i: 6;\n }\n\n [prompt-slide-image=\"7\"] {\n --i: 7;\n }\n\n [prompt-slide-image=\"8\"] {\n --i: 8;\n }\n\n /*\n 8 ZONES (never touch center keep-out ~26%\u201374% x, 28%\u201372% y):\n 1 \u2192 far-left-top\n 2 \u2192 far-left-bottom\n 3 \u2192 far-right-top\n 4 \u2192 far-right-bottom\n 5 \u2192 top-inner-left (above center, left half)\n 6 \u2192 top-inner-right (above center, right half)\n 7 \u2192 bottom-inner-left\n 8 \u2192 bottom-inner-right\n\n Each [prompt-slide-image=\"N\"] maps to zone N.\n Each slide has different sizes + slight position variation per zone.\n */\n\n /* ===================== ZONE POSITIONS (shared across slides, overridden per slide for size variety) ===================== */\n /* Zone 1 \u2013 far left top */\n [prompt-slide-image=\"1\"] {\n top: 52vh;\n left: 1vw;\n width: 10vw;\n aspect-ratio: 3/4;\n }\n\n /* Zone 2 \u2013 far left bottom */\n [prompt-slide-image=\"2\"] {\n bottom: -5vh;\n left: 16vw;\n width: 18vw;\n aspect-ratio: 3/4;\n }\n\n /* Zone 3 \u2013 far right top */\n [prompt-slide-image=\"3\"] {\n top: 28vh;\n right: -4vw;\n width: 16vw;\n aspect-ratio: 4/5;\n }\n\n /* Zone 4 \u2013 far right bottom */\n [prompt-slide-image=\"4\"] {\n top: -20vh;\n right: 40vw;\n width: 20vw;\n\n aspect-ratio: 4/5;\n }\n\n /* Zone 5 \u2013 top inner left */\n [prompt-slide-image=\"5\"] {\n top: -18vh;\n left: 4vw;\n width: 18vw;\n aspect-ratio: 2/3;\n }\n\n /* Zone 6 \u2013 top inner right */\n [prompt-slide-image=\"6\"] {\n top: 6vh;\n right: 14vw;\n width: 12vw;\n aspect-ratio: 3/4;\n }\n\n /* Zone 7 \u2013 bottom inner left */\n [prompt-slide-image=\"7\"] {\n bottom: -24vh;\n left: 42vw;\n width: 18vw;\n aspect-ratio: 4/5;\n }\n\n /* Zone 8 \u2013 bottom inner right */\n [prompt-slide-image=\"8\"] {\n bottom: -20vh;\n right: 10vw;\n width: 20vw;\n aspect-ratio: 2/3;\n }\n\n /* \n @media (min-width: 990px) and (min-height: 801px) {\n [prompt-slide-image=\"5\"] {\n top: -2vh;\n }\n\n [prompt-slide-image=\"1\"] {\n top: 52vh;\n }\n\n [prompt-slide-image=\"7\"] {\n bottom: -10vh;\n }\n } */\n\n /*mobile styles */\n @media (max-width: 800px) {\n\n /* [prompt-slide-image=\"5\"], */\n [prompt-slide-image=\"4\"],\n [prompt-slide-image=\"6\"],\n [prompt-slide-image=\"7\"],\n [prompt-slide-image=\"8\"] {\n display: none;\n }\n\n /* Zone 1 \u2013 far left top */\n [prompt-slide-image=\"1\"] {\n top: 6vh;\n left: 6vw;\n width: calc(10vw + 100px);\n aspect-ratio: 3/4;\n }\n\n /* Zone 2 \u2013 far left bottom */\n [prompt-slide-image=\"2\"] {\n bottom: 12vh;\n left: 8vw;\n width: calc(6vw + 100px);\n aspect-ratio: 2/3;\n }\n\n /* Zone 3 \u2013 far right top */\n [prompt-slide-image=\"3\"] {\n top: 4vh;\n right: 8vw;\n width: calc(10vw + 100px);\n aspect-ratio: 4/5;\n }\n\n /* Zone 4 \u2013 far right bottom */\n /* [prompt-slide-image=\"4\"] {\n bottom: 92vh;\n right: 10vw;\n width: 50vw;\n height: 40vw;\n } */\n\n [prompt-slide-image=\"5\"] {\n top: auto;\n bottom: 10vh;\n right: 4vw;\n left: auto;\n width: 40vw;\n aspect-ratio: 3/4;\n }\n }\n\n /*Tablet styles */\n @media (min-width: 768px) and (max-width: 1024px) and (orientation: portrait) {\n\n [prompt-slide-image=\"1\"] {\n top: -1vh;\n left: 2vw;\n width: 20vw;\n }\n\n [prompt-slide-image=\"6\"] {\n top: 3vh;\n right: 2vw;\n width: 20vw;\n }\n\n [prompt-slide-image=\"2\"] {\n bottom: 10vh;\n left: 1vw;\n width: 18vw;\n }\n\n [prompt-slide-image=\"3\"] {\n top: 40vh;\n right: 3vw;\n width: 16vw;\n }\n\n [prompt-slide-image=\"8\"] {\n bottom: -2vh;\n right: 40vw;\n width: 24vw;\n aspect-ratio: 1/1.2;\n }\n\n .prompt-hero_wrapper {\n max-height: 600px;\n }\n }\n\n @media (min-width: 1025px) and (max-width: 1366px) and (orientation: portrait) {\n .prompt-hero_wrapper {\n max-height: 800px;\n }\n\n [prompt-slide-image=\"5\"] {\n top: -100vh;\n }\n }\n\n /* pagination */\n .swiper-pagination-bullet {\n background: rgba(255, 255, 255, 0.35);\n opacity: 1;\n transition: background 0.3s, transform 0.3s;\n }\n\n .swiper-pagination-bullet-active {\n background: #fff;\n transform: scale(1.4);\n }\n\n [prompt-skeleton] {\n position: absolute;\n inset: 0;\n border-radius: 18px;\n background: #1a1a1a;\n animation: skeleton-pulse 1.6s ease-in-out infinite;\n opacity: 1;\n transition: opacity 0.4s ease;\n z-index: 2;\n }\n\n @keyframes skeleton-pulse {\n 0% {\n background: #1a1a1a;\n }\n\n 50% {\n background: #2e2e2e;\n }\n\n 100% {\n background: #1a1a1a;\n }\n }\n\n\n /* [promptbar-slider] {\n opacity: 0;\n transition: opacity 1s ease;\n} */\n\n @property --angle {\n syntax: \"<angle>\";\n initial-value: 0deg;\n inherits: false;\n }\n\n @keyframes spin {\n to {\n --angle: 360deg;\n }\n }\n\n .submit_button_loading {\n position: absolute;\n inset: 0;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Glowing shadow behind */\n .submit_button_loading::before {\n content: \"\";\n position: absolute;\n inset: -6px;\n background: conic-gradient(from var(--angle),\n #e8603c,\n #f0a070,\n #ffd27a,\n #ff8fa3,\n #e8603c);\n animation: spin 2s linear infinite;\n z-index: -2;\n border-radius: 12px;\n filter: blur(10px);\n opacity: 0.85;\n }\n\n /* White mask covers center, lets glow peek out at edges */\n .submit_button_loading::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: white;\n border-radius: 8px;\n z-index: -1;\n }\n\n /* Remove the ::after \u2014 no more white mask needed */\n\n @keyframes spin {\n to {\n --angle: 360deg;\n }\n }\n\n\n [prompt-skeleton] {\n display: none;\n }\n\n [prompt-slide-image-inner] {\n border-radius: 10px;\n overflow: hidden;\n }\n\n\n @media screen and (max-width: 479px) {\n [custom-style-identifier=\"prompt-title\"] {\n font-size: 40px;\n max-width: 264px;\n margin: auto;\n text-align: center;\n }\n }\n\n /* \n .prompt-wrapper {\n pointer-events: none;\n\n } */"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|