@rtstic.dev/pulse 0.0.101 → 0.0.102
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/form/book-a-demo/thank-you.ts"],
|
|
4
|
-
"sourcesContent": ["function getSessionData() {\n return {\n firstName: sessionStorage.getItem(\"ty_firstName\") ?? \"\",\n lastName: sessionStorage.getItem(\"ty_lastName\") ?? \"\",\n email: sessionStorage.getItem(\"ty_email\") ?? \"\",\n showCalendar: sessionStorage.getItem(\"ty_showCalendar\") === \"true\",\n calendarName: sessionStorage.getItem(\"ty_calendarName\") ?? \"\",\n embedUrl: sessionStorage.getItem(\"ty_embedUrl\") ?? \"\",\n flow: sessionStorage.getItem(\"ty_flow\") ?? \"\",\n };\n}\n\nfunction hasCookieConsent(): boolean {\n const state = (window as any).Termly?.getConsentState();\n if (!state) return false;\n return state.analytics === true && state.advertising === true;\n}\n\nfunction showThankYou(): void {\n const container = document.querySelector<HTMLElement>(\"[hs-calender-block]\");\n if (container) {\n container.setAttribute(\"hs-calender-block-active\", \"false\");\n container.innerHTML = \"\";\n }\n document.querySelectorAll<HTMLElement>(\"[hs-thankyou-block-active]\")\n .forEach((el) => el.setAttribute(\"hs-thankyou-block-active\", \"true\"));\n}\n\nfunction
|
|
5
|
-
"mappings": ";;;AAAA,WAAS,iBAAiB;AACtB,WAAO;AAAA,MACH,WAAW,eAAe,QAAQ,cAAc,KAAK;AAAA,MACrD,UAAU,eAAe,QAAQ,aAAa,KAAK;AAAA,MACnD,OAAO,eAAe,QAAQ,UAAU,KAAK;AAAA,MAC7C,cAAc,eAAe,QAAQ,iBAAiB,MAAM;AAAA,MAC5D,cAAc,eAAe,QAAQ,iBAAiB,KAAK;AAAA,MAC3D,UAAU,eAAe,QAAQ,aAAa,KAAK;AAAA,MACnD,MAAM,eAAe,QAAQ,SAAS,KAAK;AAAA,IAC/C;AAAA,EACJ;AAQA,WAAS,eAAqB;AAC1B,UAAM,YAAY,SAAS,cAA2B,qBAAqB;AAC3E,QAAI,WAAW;AACX,gBAAU,aAAa,4BAA4B,OAAO;AAC1D,gBAAU,YAAY;AAAA,IAC1B;AACA,aAAS,iBAA8B,4BAA4B,EAC9D,QAAQ,CAAC,OAAO,GAAG,aAAa,4BAA4B,MAAM,CAAC;AAAA,EAC5E;
|
|
4
|
+
"sourcesContent": ["function getSessionData() {\n return {\n firstName: sessionStorage.getItem(\"ty_firstName\") ?? \"\",\n lastName: sessionStorage.getItem(\"ty_lastName\") ?? \"\",\n email: sessionStorage.getItem(\"ty_email\") ?? \"\",\n showCalendar: sessionStorage.getItem(\"ty_showCalendar\") === \"true\",\n calendarName: sessionStorage.getItem(\"ty_calendarName\") ?? \"\",\n embedUrl: sessionStorage.getItem(\"ty_embedUrl\") ?? \"\",\n flow: sessionStorage.getItem(\"ty_flow\") ?? \"\",\n };\n}\n\nfunction hasCookieConsent(): boolean {\n const state = (window as any).Termly?.getConsentState();\n if (!state) return false;\n return state.analytics === true && state.advertising === true;\n}\n\nfunction showThankYou(): void {\n const container = document.querySelector<HTMLElement>(\"[hs-calender-block]\");\n if (container) {\n container.setAttribute(\"hs-calender-block-active\", \"false\");\n container.innerHTML = \"\";\n }\n document.querySelectorAll<HTMLElement>(\"[hs-thankyou-block-active]\")\n .forEach((el) => el.setAttribute(\"hs-thankyou-block-active\", \"true\"));\n}\n\nfunction setFlowAttribute(): void {\n const flow = sessionStorage.getItem(\"ty_flow\") ?? \"\";\n if (!flow) return;\n\n document.querySelectorAll<HTMLElement>(\"[hs-thankyou-flow]\")\n .forEach((el) => {\n const elFlow = el.getAttribute(\"hs-thankyou-flow\");\n el.setAttribute(\n \"form-flow-active\",\n elFlow === flow ? \"true\" : \"false\"\n );\n });\n}\n\nfunction init(): void {\n const data = getSessionData();\n setFlowAttribute();\n showThankYou();\n\n if (data.embedUrl && data.showCalendar) {\n const baseUrl = data.embedUrl.split(\"?\")[0];\n\n const params = new URLSearchParams();\n if (data.firstName) params.set(\"firstName\", data.firstName);\n if (data.lastName) params.set(\"lastName\", data.lastName);\n if (data.email) params.set(\"email\", data.email);\n\n const finalUrl = params.toString() ? `${baseUrl}?${params.toString()}` : baseUrl;\n\n setTimeout(() => {\n window.location.href = finalUrl;\n }, 1000);\n }\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n init();\n});"],
|
|
5
|
+
"mappings": ";;;AAAA,WAAS,iBAAiB;AACtB,WAAO;AAAA,MACH,WAAW,eAAe,QAAQ,cAAc,KAAK;AAAA,MACrD,UAAU,eAAe,QAAQ,aAAa,KAAK;AAAA,MACnD,OAAO,eAAe,QAAQ,UAAU,KAAK;AAAA,MAC7C,cAAc,eAAe,QAAQ,iBAAiB,MAAM;AAAA,MAC5D,cAAc,eAAe,QAAQ,iBAAiB,KAAK;AAAA,MAC3D,UAAU,eAAe,QAAQ,aAAa,KAAK;AAAA,MACnD,MAAM,eAAe,QAAQ,SAAS,KAAK;AAAA,IAC/C;AAAA,EACJ;AAQA,WAAS,eAAqB;AAC1B,UAAM,YAAY,SAAS,cAA2B,qBAAqB;AAC3E,QAAI,WAAW;AACX,gBAAU,aAAa,4BAA4B,OAAO;AAC1D,gBAAU,YAAY;AAAA,IAC1B;AACA,aAAS,iBAA8B,4BAA4B,EAC9D,QAAQ,CAAC,OAAO,GAAG,aAAa,4BAA4B,MAAM,CAAC;AAAA,EAC5E;AAEA,WAAS,mBAAyB;AAC9B,UAAM,OAAO,eAAe,QAAQ,SAAS,KAAK;AAClD,QAAI,CAAC,KAAM;AAEX,aAAS,iBAA8B,oBAAoB,EACtD,QAAQ,CAAC,OAAO;AACb,YAAM,SAAS,GAAG,aAAa,kBAAkB;AACjD,SAAG;AAAA,QACC;AAAA,QACA,WAAW,OAAO,SAAS;AAAA,MAC/B;AAAA,IACJ,CAAC;AAAA,EACT;AAEA,WAAS,OAAa;AAClB,UAAM,OAAO,eAAe;AAC5B,qBAAiB;AACjB,iBAAa;AAEb,QAAI,KAAK,YAAY,KAAK,cAAc;AACpC,YAAM,UAAU,KAAK,SAAS,MAAM,GAAG,EAAE,CAAC;AAE1C,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,UAAW,QAAO,IAAI,aAAa,KAAK,SAAS;AAC1D,UAAI,KAAK,SAAU,QAAO,IAAI,YAAY,KAAK,QAAQ;AACvD,UAAI,KAAK,MAAO,QAAO,IAAI,SAAS,KAAK,KAAK;AAE9C,YAAM,WAAW,OAAO,SAAS,IAAI,GAAG,OAAO,IAAI,OAAO,SAAS,CAAC,KAAK;AAEzE,iBAAW,MAAM;AACb,eAAO,SAAS,OAAO;AAAA,MAC3B,GAAG,GAAI;AAAA,IACX;AAAA,EACJ;AAEA,WAAS,iBAAiB,oBAAoB,MAAM;AAChD,SAAK;AAAA,EACT,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(()=>{var
|
|
1
|
+
"use strict";(()=>{var P=["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"],y=["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"],A={"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"},R={"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 r={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]",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 g(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 p(n){return P.some(t=>g(n,t))}function h(n){return y.some(t=>g(n,t))}function T(n){for(let[t,o]of Object.entries(R))if(g(n,t))return o;return k(n)}function b(n){for(let[t,o]of Object.entries(A))if(g(n,t))return o;return k(n)}function k(n){return n.replace(/^www\./,"")}function f(n){let t=n.toLowerCase().trim();return Object.values(A).map(e=>e.toLowerCase()).includes(t)?!0:y.some(e=>t===e||t===e.replace(".com",""))}function U(n){let t=n.toLowerCase().trim();return Object.values(R).map(e=>e.toLowerCase()).includes(t)?!0:P.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 C(){let n=new URLSearchParams(window.location.search),t={};r.utmKeys.forEach(e=>{let i=n.get(e);i&&(t[e]=i)}),r.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 N(n){return!!n.utm_source||!!n.utm_medium||!!n.utm_campaign||!!n.source||!!n.gclid||!!n.msclkid||!!n.fbclid}function O(n){return!!n.utm_source||!!n.utm_medium||!!n.utm_campaign}function I(){try{if(!document.referrer)return"";let n=new URL(document.referrer);return n.hostname===window.location.hostname?"":n.hostname.toLowerCase()}catch{return""}}function G(){return window.location.pathname+window.location.search}function K(){let n=window.location.pathname.split("/").filter(Boolean);return n.length>0?"/"+n[0]:"/"}function W(n,t){let o=n.utm_source||"",e=n.utm_medium||"",i=n.utm_campaign||"",d=n.utm_term||"",s=n.utm_content||"",u=n.source||"",m=n.gclid||"",M=n.msclkid||"",w=G(),Q=K(),c={landingPage:w,landingPageGroup:Q},v=Object.entries({"chatgpt.com":"ChatGPT","chat.openai.com":"ChatGPT","perplexity.ai":"Perplexity","you.com":"You.com","phind.com":"Phind","claude.ai":"Claude","gemini.google.com":"Gemini","copilot.microsoft.com":"Copilot"}).find(([a])=>g(t,a));if(v)return{...c,channel:"LLMs",channelDrilldown1:v[1],channelDrilldown2:w,channelDrilldown3:""};if(D(e,"social")&&(f(o)||h(t))){let a=f(o)?_(o):b(t);return{...c,channel:"Organic Social",channelDrilldown1:a,channelDrilldown2:i,channelDrilldown3:s}}if(D(e,"email"))return{...c,channel:"Email Marketing",channelDrilldown1:o||"Email",channelDrilldown2:i,channelDrilldown3:s};if(l(o,"paidsocial")||l(e,"paidsocial")||l(e,"paid","ppc","cpc")&&f(o)||l(e,"paid","ppc","cpc")&&h(t)){let a=f(o)?_(o):h(t)?b(t):o||"Paid Social";return{...c,channel:"Paid Social",channelDrilldown1:a,channelDrilldown2:i,channelDrilldown3:d||s}}if(l(o,"paidsearch")||l(e,"paidsearch")||l(o,"adwords","ppc","cpc")||l(e,"adwords","ppc","cpc")||l(i,"adwords","ppc","cpc")||m||M||O(n)&&p(t)){let a="Paid Search";return m?a="Google":M?a="Bing":U(o)?a=_(o):p(t)?a=T(t):o&&(a=o),{...c,channel:"Paid Search",channelDrilldown1:a,channelDrilldown2:i,channelDrilldown3:d}}return D(e,"display")?{...c,channel:"Display",channelDrilldown1:o||"Display",channelDrilldown2:i,channelDrilldown3:s}:l(e,"affiliate")?{...c,channel:"Affiliates",channelDrilldown1:o||"Affiliate",channelDrilldown2:i,channelDrilldown3:s}:N(n)?{...c,channel:"Other Campaigns",channelDrilldown1:o||u,channelDrilldown2:e,channelDrilldown3:i}:t&&h(t)?{...c,channel:"Organic Social",channelDrilldown1:b(t),channelDrilldown2:"",channelDrilldown3:""}:t&&p(t)?{...c,channel:"Organic Search",channelDrilldown1:T(t),channelDrilldown2:"",channelDrilldown3:""}:t?{...c,channel:"Referral",channelDrilldown1:k(t),channelDrilldown2:w,channelDrilldown3:""}:{...c,channel:"Direct",channelDrilldown1:"Direct",channelDrilldown2:w,channelDrilldown3:""}}function _(n){return n&&n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()}function j(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 x(n,t){try{let o=new URL(n,window.location.origin);return Object.entries(t).forEach(([e,i])=>{r.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 E(n){return n.getAttribute("data-utm-exception")==="true"}function L(n,t){if(E(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&&j(e,o)){let i=x(e,t);n instanceof HTMLAnchorElement?n.href=i:n instanceof HTMLElement&&n.dataset.href&&(n.dataset.href=i)}}function q(n){document.querySelectorAll(r.linkSelectors.join(", ")).forEach(t=>L(t,n))}function S(n,t){if(E(n))return;let o=n.getAttribute("data-utm-input")?.trim().toLowerCase();if(!o)return;let e=r.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 B(n){document.querySelectorAll(r.inputSelector).forEach(t=>S(t,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 z(n,t){let o=[...r.linkSelectors,r.inputSelector].join(", "),e=null,i=[];function d(){let s=i.slice();i=[],e=null,s.forEach(u=>{u.matches?.(r.inputSelector)?S(u,t):u.matches?.(r.linkSelectors.join(", "))&&L(u,n),u.querySelectorAll?.(o).forEach(m=>{m.matches(r.inputSelector)?S(m,t):L(m,n)})})}new MutationObserver(s=>{s.forEach(u=>{u.addedNodes.forEach(m=>{m.nodeType===Node.ELEMENT_NODE&&i.push(m)})}),i.length>0&&!e&&(e=setTimeout(d,50))}).observe(document.body,{childList:!0,subtree:!0})}function F(){let n=C(),t=I(),o=W(n,t),e={params:n,attribution:o},i=Y(e),d=()=>{q(e.params),B(i),z(e.params,i)};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",d):d()}F()})();})();
|
|
@@ -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. No cookies or storage \u2014 reads fresh from URL on every page load\n// (UTMs persist across pages via link propagation in rule 4)\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 utmKeys: string[];\n clickIdKeys: string[];\n linkSelectors: string[];\n inputSelector: string;\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\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 inputKeyMap: {\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 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 gclid: \"gclid\",\n msclkid: \"msclkid\",\n fbclid: \"fbclid\",\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 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 function cleanDomain(hostname: string): string {\n return hostname.replace(/^www\\./, \"\");\n }\n\n function valueIsSocialNetwork(value: string): boolean {\n const v = value.toLowerCase().trim();\n const allNames = Object.values(SOCIAL_DISPLAY_NAMES).map((n) => n.toLowerCase());\n if (allNames.includes(v)) return true;\n return SOCIAL_NETWORKS.some((domain) => v === domain || v === domain.replace(\".com\", \"\"));\n }\n\n function valueIsSearchEngine(value: string): boolean {\n const v = value.toLowerCase().trim();\n const allNames = Object.values(SEARCH_DISPLAY_NAMES).map((n) => n.toLowerCase());\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 // 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 config.utmKeys.forEach((key) => {\n const value = urlParams.get(key);\n if (value) captured[key] = value;\n });\n\n config.clickIdKeys.forEach((key) => {\n const value = urlParams.get(key);\n if (value) captured[key] = value;\n });\n\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 !!params.utm_source || !!params.utm_medium || !!params.utm_campaign;\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 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 segments = window.location.pathname.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\n const landingPage = getLandingPage();\n const landingPageGroup = getLandingPageGroup();\n\n const base = { landingPage, landingPageGroup };\n\n // Rule 1: Organic Social\n if (equalsAny(utm_medium, \"social\")) {\n if (valueIsSocialNetwork(utm_source) || isRecognisedSocialNetwork(referrerHost)) {\n const sourceName = valueIsSocialNetwork(utm_source)\n ? capitalise(utm_source)\n : getSocialNetworkName(referrerHost);\n return { ...base, channel: \"Organic Social\", channelDrilldown1: sourceName, channelDrilldown2: utm_campaign, channelDrilldown3: utm_content };\n }\n }\n\n // Rule 2: Email Marketing\n if (equalsAny(utm_medium, \"email\")) {\n return { ...base, channel: \"Email Marketing\", channelDrilldown1: utm_source || \"Email\", channelDrilldown2: utm_campaign, channelDrilldown3: utm_content };\n }\n\n // Rule 3: Paid Social\n if (\n containsAny(utm_source, \"paidsocial\") ||\n containsAny(utm_medium, \"paidsocial\") ||\n (containsAny(utm_medium, \"paid\", \"ppc\", \"cpc\") && valueIsSocialNetwork(utm_source)) ||\n (containsAny(utm_medium, \"paid\", \"ppc\", \"cpc\") && 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 { ...base, channel: \"Paid Social\", channelDrilldown1: sourceName, channelDrilldown2: utm_campaign, channelDrilldown3: utm_term || utm_content };\n }\n\n // Rule 4: Paid Search\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 || msclkid ||\n (hasUTMParams(params) && isRecognisedSearchEngine(referrerHost))\n ) {\n let sourceName = \"Paid Search\";\n if (gclid) sourceName = \"Google\";\n else if (msclkid) sourceName = \"Bing\";\n else if (valueIsSearchEngine(utm_source)) sourceName = capitalise(utm_source);\n else if (isRecognisedSearchEngine(referrerHost)) sourceName = getSearchEngineName(referrerHost);\n else if (utm_source) sourceName = utm_source;\n return { ...base, channel: \"Paid Search\", channelDrilldown1: sourceName, channelDrilldown2: utm_campaign, channelDrilldown3: utm_term };\n }\n\n // Rule 5: Display\n if (equalsAny(utm_medium, \"display\")) {\n return { ...base, channel: \"Display\", channelDrilldown1: utm_source || \"Display\", channelDrilldown2: utm_campaign, channelDrilldown3: utm_content };\n }\n\n // Rule 6: Affiliates\n if (containsAny(utm_medium, \"affiliate\")) {\n return { ...base, channel: \"Affiliates\", channelDrilldown1: utm_source || \"Affiliate\", channelDrilldown2: utm_campaign, channelDrilldown3: utm_content };\n }\n\n // Rule 7: Other Campaigns\n if (hasTrackingParams(params)) {\n return { ...base, channel: \"Other Campaigns\", channelDrilldown1: utm_source || bare_source, channelDrilldown2: utm_medium, channelDrilldown3: utm_campaign };\n }\n\n // Rule 8: Organic Social (by referrer)\n if (referrerHost && isRecognisedSocialNetwork(referrerHost)) {\n return { ...base, channel: \"Organic Social\", channelDrilldown1: getSocialNetworkName(referrerHost), channelDrilldown2: \"\", channelDrilldown3: \"\" };\n }\n\n // Rule 9: Organic Search (by referrer)\n if (referrerHost && isRecognisedSearchEngine(referrerHost)) {\n return { ...base, channel: \"Organic Search\", channelDrilldown1: getSearchEngineName(referrerHost), channelDrilldown2: \"\", channelDrilldown3: \"\" };\n }\n\n // Rule 10: Referral\n if (referrerHost) {\n return { ...base, channel: \"Referral\", channelDrilldown1: cleanDomain(referrerHost), channelDrilldown2: landingPage, channelDrilldown3: \"\" };\n }\n\n // Rule 11: Direct\n return { ...base, channel: \"Direct\", channelDrilldown1: \"Direct\", channelDrilldown2: landingPage, channelDrilldown3: \"\" };\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 to internal links)\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 (url.startsWith(\"/\") || url.startsWith(\"./\") || url.startsWith(\"../\")) return true;\n if (/^[a-z]+:/i.test(url) && !url.startsWith(\"http\")) return false;\n if (url.startsWith(\"http\")) return new URL(url).hostname === currentHost;\n if (url.startsWith(\"//\")) return new URL(\"https:\" + url).hostname === currentHost;\n if (!url.includes(\"://\")) return true;\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 Object.entries(utmParams).forEach(([key, value]) => {\n if (!config.utmKeys.includes(key)) return;\n if (urlObj.searchParams.has(key)) return; // never override existing\n urlObj.searchParams.set(key, value);\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 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 document.querySelectorAll(config.linkSelectors.join(\", \")).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 function processInput(element: Element, allValues: Record<string, string>): void {\n if (hasUTMException(element)) return;\n\n const shortKey = element.getAttribute(\"data-utm-input\")?.trim().toLowerCase();\n if (!shortKey) return;\n\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 if (element.value && element.value.trim() !== \"\") return; // never override\n element.value = value;\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 document.querySelectorAll(config.inputSelector).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 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 Object.entries(data.params).forEach(([key, value]) => { map[key] = value; });\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 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(utmParams: UTMParams, allValues: Record<string, string>): void {\n const allSelectors = [...config.linkSelectors, config.inputSelector].join(\", \");\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?.(config.inputSelector)) {\n processInput(element, allValues);\n } else if (element.matches?.(config.linkSelectors.join(\", \"))) {\n processLink(element, utmParams);\n }\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 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 if (pendingNodes.length > 0 && !debounceTimer) {\n debounceTimer = setTimeout(flushPending, 50);\n }\n }).observe(document.body, { childList: true, subtree: true });\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 \u2014 no cookies, no storage, fresh on every load\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\n const attribution = categorise(freshParams, referrerHost);\n const data: AttributionData = { params: freshParams, attribution };\n const allValues = buildValueMap(data);\n\n const run = (): void => {\n processAllLinks(data.params);\n processAllInputs(allValues);\n observeNewContent(data.params, allValues);\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. No cookies or storage \u2014 reads fresh from URL on every page load\n// (UTMs persist across pages via link propagation in rule 4)\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 utmKeys: string[];\n clickIdKeys: string[];\n linkSelectors: string[];\n inputSelector: string;\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\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 inputKeyMap: {\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 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 gclid: \"gclid\",\n msclkid: \"msclkid\",\n fbclid: \"fbclid\",\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 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 function cleanDomain(hostname: string): string {\n return hostname.replace(/^www\\./, \"\");\n }\n\n function valueIsSocialNetwork(value: string): boolean {\n const v = value.toLowerCase().trim();\n const allNames = Object.values(SOCIAL_DISPLAY_NAMES).map((n) => n.toLowerCase());\n if (allNames.includes(v)) return true;\n return SOCIAL_NETWORKS.some((domain) => v === domain || v === domain.replace(\".com\", \"\"));\n }\n\n function valueIsSearchEngine(value: string): boolean {\n const v = value.toLowerCase().trim();\n const allNames = Object.values(SEARCH_DISPLAY_NAMES).map((n) => n.toLowerCase());\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 // 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 config.utmKeys.forEach((key) => {\n const value = urlParams.get(key);\n if (value) captured[key] = value;\n });\n\n config.clickIdKeys.forEach((key) => {\n const value = urlParams.get(key);\n if (value) captured[key] = value;\n });\n\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 !!params.utm_source || !!params.utm_medium || !!params.utm_campaign;\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 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 segments = window.location.pathname.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\n const landingPage = getLandingPage();\n const landingPageGroup = getLandingPageGroup();\n\n const base = { landingPage, landingPageGroup };\n\n // Rule 0: LLMs\n const LLM_DOMAINS: Record<string, string> = {\n \"chatgpt.com\": \"ChatGPT\",\n \"chat.openai.com\": \"ChatGPT\",\n \"perplexity.ai\": \"Perplexity\",\n \"you.com\": \"You.com\",\n \"phind.com\": \"Phind\",\n \"claude.ai\": \"Claude\",\n \"gemini.google.com\": \"Gemini\",\n \"copilot.microsoft.com\": \"Copilot\",\n };\n\n const matchedLLM = Object.entries(LLM_DOMAINS).find(([domain]) => domainMatches(referrerHost, domain));\n if (matchedLLM) {\n return { ...base, channel: \"LLMs\", channelDrilldown1: matchedLLM[1], channelDrilldown2: landingPage, channelDrilldown3: \"\" };\n }\n\n // Rule 1: Organic Social\n if (equalsAny(utm_medium, \"social\")) {\n if (valueIsSocialNetwork(utm_source) || isRecognisedSocialNetwork(referrerHost)) {\n const sourceName = valueIsSocialNetwork(utm_source)\n ? capitalise(utm_source)\n : getSocialNetworkName(referrerHost);\n return { ...base, channel: \"Organic Social\", channelDrilldown1: sourceName, channelDrilldown2: utm_campaign, channelDrilldown3: utm_content };\n }\n }\n\n // Rule 2: Email Marketing\n if (equalsAny(utm_medium, \"email\")) {\n return { ...base, channel: \"Email Marketing\", channelDrilldown1: utm_source || \"Email\", channelDrilldown2: utm_campaign, channelDrilldown3: utm_content };\n }\n\n // Rule 3: Paid Social\n if (\n containsAny(utm_source, \"paidsocial\") ||\n containsAny(utm_medium, \"paidsocial\") ||\n (containsAny(utm_medium, \"paid\", \"ppc\", \"cpc\") && valueIsSocialNetwork(utm_source)) ||\n (containsAny(utm_medium, \"paid\", \"ppc\", \"cpc\") && 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 { ...base, channel: \"Paid Social\", channelDrilldown1: sourceName, channelDrilldown2: utm_campaign, channelDrilldown3: utm_term || utm_content };\n }\n\n // Rule 4: Paid Search\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 || msclkid ||\n (hasUTMParams(params) && isRecognisedSearchEngine(referrerHost))\n ) {\n let sourceName = \"Paid Search\";\n if (gclid) sourceName = \"Google\";\n else if (msclkid) sourceName = \"Bing\";\n else if (valueIsSearchEngine(utm_source)) sourceName = capitalise(utm_source);\n else if (isRecognisedSearchEngine(referrerHost)) sourceName = getSearchEngineName(referrerHost);\n else if (utm_source) sourceName = utm_source;\n return { ...base, channel: \"Paid Search\", channelDrilldown1: sourceName, channelDrilldown2: utm_campaign, channelDrilldown3: utm_term };\n }\n\n // Rule 5: Display\n if (equalsAny(utm_medium, \"display\")) {\n return { ...base, channel: \"Display\", channelDrilldown1: utm_source || \"Display\", channelDrilldown2: utm_campaign, channelDrilldown3: utm_content };\n }\n\n // Rule 6: Affiliates\n if (containsAny(utm_medium, \"affiliate\")) {\n return { ...base, channel: \"Affiliates\", channelDrilldown1: utm_source || \"Affiliate\", channelDrilldown2: utm_campaign, channelDrilldown3: utm_content };\n }\n\n // Rule 7: Other Campaigns\n if (hasTrackingParams(params)) {\n return { ...base, channel: \"Other Campaigns\", channelDrilldown1: utm_source || bare_source, channelDrilldown2: utm_medium, channelDrilldown3: utm_campaign };\n }\n\n // Rule 8: Organic Social (by referrer)\n if (referrerHost && isRecognisedSocialNetwork(referrerHost)) {\n return { ...base, channel: \"Organic Social\", channelDrilldown1: getSocialNetworkName(referrerHost), channelDrilldown2: \"\", channelDrilldown3: \"\" };\n }\n\n // Rule 9: Organic Search (by referrer)\n if (referrerHost && isRecognisedSearchEngine(referrerHost)) {\n return { ...base, channel: \"Organic Search\", channelDrilldown1: getSearchEngineName(referrerHost), channelDrilldown2: \"\", channelDrilldown3: \"\" };\n }\n\n // Rule 10: Referral\n if (referrerHost) {\n return { ...base, channel: \"Referral\", channelDrilldown1: cleanDomain(referrerHost), channelDrilldown2: landingPage, channelDrilldown3: \"\" };\n }\n\n // Rule 11: Direct\n return { ...base, channel: \"Direct\", channelDrilldown1: \"Direct\", channelDrilldown2: landingPage, channelDrilldown3: \"\" };\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 to internal links)\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 (url.startsWith(\"/\") || url.startsWith(\"./\") || url.startsWith(\"../\")) return true;\n if (/^[a-z]+:/i.test(url) && !url.startsWith(\"http\")) return false;\n if (url.startsWith(\"http\")) return new URL(url).hostname === currentHost;\n if (url.startsWith(\"//\")) return new URL(\"https:\" + url).hostname === currentHost;\n if (!url.includes(\"://\")) return true;\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 Object.entries(utmParams).forEach(([key, value]) => {\n if (!config.utmKeys.includes(key)) return;\n if (urlObj.searchParams.has(key)) return; // never override existing\n urlObj.searchParams.set(key, value);\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 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 document.querySelectorAll(config.linkSelectors.join(\", \")).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 function processInput(element: Element, allValues: Record<string, string>): void {\n if (hasUTMException(element)) return;\n\n const shortKey = element.getAttribute(\"data-utm-input\")?.trim().toLowerCase();\n if (!shortKey) return;\n\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 if (element.value && element.value.trim() !== \"\") return; // never override\n element.value = value;\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 document.querySelectorAll(config.inputSelector).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 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 Object.entries(data.params).forEach(([key, value]) => { map[key] = value; });\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 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(utmParams: UTMParams, allValues: Record<string, string>): void {\n const allSelectors = [...config.linkSelectors, config.inputSelector].join(\", \");\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?.(config.inputSelector)) {\n processInput(element, allValues);\n } else if (element.matches?.(config.linkSelectors.join(\", \"))) {\n processLink(element, utmParams);\n }\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 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 if (pendingNodes.length > 0 && !debounceTimer) {\n debounceTimer = setTimeout(flushPending, 50);\n }\n }).observe(document.body, { childList: true, subtree: true });\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 \u2014 no cookies, no storage, fresh on every load\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\n const attribution = categorise(freshParams, referrerHost);\n const data: AttributionData = { params: freshParams, attribution };\n const allValues = buildValueMap(data);\n\n const run = (): void => {\n processAllLinks(data.params);\n processAllInputs(allValues);\n observeNewContent(data.params, allValues);\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/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(()=>{document.addEventListener("DOMContentLoaded",()=>{
|
|
1
|
+
"use strict";(()=>{document.addEventListener("DOMContentLoaded",()=>{let n=window.gsap;document.querySelectorAll("[prompt-slide-image-inner]").forEach(e=>{n.set(e,{x:0,y:0});function t(){n.to(e,{x:n.utils.random(-20,20),y:n.utils.random(-20,20),duration:n.utils.random(2,3),ease:"sine.inOut",onComplete:t})}n.delayedCall(n.utils.random(0,4),t)});let m=[{prompt:"Build a list of country music dancers that wear cowboy hats",slide:0},{prompt:"Build a list of grandma creators who do hip hop lip sync content",slide:1},{prompt:"Build a list of meme pages that are perfect for an EDM launch",slide:2}],l=document.querySelector("[promptbar=word-count]"),c=document.querySelector("[promptbar=submit]"),a=document.querySelector("[promptbar=border]"),d=document.querySelector("[promptbar=text-slot]"),p=document.querySelector("[promptbar=submit-loader]"),D=!1,s=new window.Swiper("[promptbar-slider]",{loop:!0,speed:0,effect:"fade",fadeEffect:{crossFade:!1},pagination:{el:".swiper-pagination",clickable:!0},keyboard:{enabled:!0},mousewheel:{enabled:!0},autoplay:!1});if(!l||!c||!a||!d||!n){console.error("[promptbar] One or more dependencies missing. Aborting.");return}let f=0,h=!1;function u(e){return new Promise(t=>setTimeout(t,e))}function x(e){let t=e.trim().split(/\s+/).filter(Boolean).length;l.textContent=`${t||0}/300 words`}function y(e){let t=document.createElement("div");return t.className="chroma-text",t.setAttribute("data-animate","false"),t.textContent=e,t}function E(e){return new Promise(t=>{let o=n.timeline({defaults:{ease:"power1.out"}}),r=d.querySelector(".chroma-text");r&&(o.to(r,{duration:.4,autoAlpha:0,ease:"power1.in"}),o.add(()=>r.remove()));let i;o.add(()=>{i=y(e),d.appendChild(i),i.setAttribute("data-animate","true"),C(e)}),o.to(()=>i,{duration:.6,autoAlpha:1}),o.add(()=>{t()})})}function T(){return new Promise(e=>{c.setAttribute("is-clicked","true"),q(),setTimeout(()=>{c.setAttribute("is-clicked","false"),setTimeout(e,250)},120)})}function A(e,t){return new Promise(o=>{a.removeAttribute("is-animating"),setTimeout(()=>{a.setAttribute("is-animating","true");let r=window.getComputedStyle(a),i=setTimeout(()=>{console.warn("[promptbar] animationend never fired \u2014 fallback \u26A0\uFE0F"),a.removeAttribute("is-animating"),o()},4500);a.addEventListener("animationend",()=>{clearTimeout(i),a.removeAttribute("is-animating"),o()},{once:!0})},50)})}function C(e){let t=e.trim().split(/\s+/).filter(Boolean).length,o={value:0};n.to(o,{value:t,duration:.8,ease:"power2.out",onUpdate:()=>{l.textContent=`${Math.round(o.value)}/300 words`},onComplete:()=>{l.textContent=`${t}/300 words`}})}function L(e,t){return new Promise(o=>{let i=e.slides[e.activeIndex].querySelectorAll("[prompt-slide-image]");n.timeline({onComplete:o}).to(i,{scale:1.5,opacity:0,filter:"blur(16px)",duration:1,ease:"power2.in",stagger:.05}).add(()=>{e.slideToLoop(t),requestAnimationFrame(()=>{let v=e.slides[e.activeIndex],P=v.querySelectorAll("[prompt-slide-image]");e.slides.forEach(S=>{S!==v&&n.set(S.querySelectorAll("[prompt-slide-image]"),{scale:.8,opacity:0,filter:"blur(12px)"})}),n.fromTo(P,{scale:.8,opacity:0,filter:"blur(12px)"},{scale:1,opacity:1,filter:"blur(0px)",duration:1,ease:"power3.out",stagger:.07,onComplete:o})})},"-=0.25")})}function b(e){setTimeout(()=>{e.slides[e.activeIndex]?.querySelectorAll("[prompt-skeleton]")?.forEach(r=>{let i=Math.random()*1500;r.style.transition="opacity 0.5s ease",r.style.opacity="1",setTimeout(()=>{r.style.opacity="0"},i)})},50)}function q(){p&&(p.style.opacity="1",setTimeout(()=>{p.style.opacity="0"},2500))}function M(){requestAnimationFrame(()=>{let t=s.slides[s.activeIndex].querySelectorAll("[prompt-slide-image]");n.fromTo(t,{scale:.8,opacity:0,filter:"blur(12px)"},{scale:1,opacity:1,filter:"blur(0px)",duration:1,ease:"power3.out",stagger:.07})})}async function I(){for(;;){if(h)return;let e=m[f%m.length];await E(e.prompt),f++,await u(100),T(),A(s,e.slide),await u(1500),await L(s,e.slide),b(s),await u(2e3)}}let g=m[0],w=y(g.prompt);d.appendChild(w),w.setAttribute("data-animate","true"),x(g.prompt),s.slideToLoop(g.slide),M(),b(s),f=1,u(3e3).then(()=>I())});})();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/promptbar/index.ts"],
|
|
4
|
-
"sourcesContent": ["document.addEventListener('DOMContentLoaded', () => {\n\n console.log('[promptbar] DOMContentLoaded fired');\n\n const gsap = (window as any).gsap;\n\n const floatEls = document.querySelectorAll('[prompt-slide-image-inner]');\n console.log('[float] elements found:', floatEls.length);\n\n floatEls.forEach((el) => {\n gsap.set(el, { x: 0, y: 0 });\n\n function drift() {\n gsap.to(el, {\n x: gsap.utils.random(-20, 20),\n y: gsap.utils.random(-20, 20),\n duration: gsap.utils.random(2, 3),\n ease: 'sine.inOut',\n onComplete: drift,\n });\n }\n\n gsap.delayedCall(gsap.utils.random(0, 4), drift);\n });\n\n const slides: { prompt: string; slide: number }[] = [\n { prompt: \"Build a list of country music dancers that wear cowboy hats\", slide: 0 },\n { prompt: \"Build a list of grandma creators who do hip hop lip sync content\", slide: 1 },\n { prompt: \"Build a list of meme pages that are perfect for an EDM launch\", slide: 2 },\n ];\n\n const wordCount = document.querySelector('[promptbar=word-count]') as HTMLSpanElement;\n const sendBtn = document.querySelector('[promptbar=submit]') as HTMLDivElement;\n const barBorder = document.querySelector('[promptbar=border]') as HTMLDivElement;\n const textSlot = document.querySelector('[promptbar=text-slot]') as HTMLDivElement;\n const submitButtonLoading = document.querySelector('[promptbar=submit-loader]') as HTMLDivElement;\n\n let sliderRevealed = false;\n\n const imageSlider = new (window as any).Swiper('[promptbar-slider]', {\n loop: true,\n speed: 0,\n effect: 'fade',\n fadeEffect: { crossFade: false },\n pagination: { el: '.swiper-pagination', clickable: true },\n keyboard: { enabled: true },\n mousewheel: { enabled: true },\n autoplay: false,\n });\n\n console.log('[slider] imageSlider instance:', imageSlider ?? 'NOT FOUND \u274C');\n console.log('[slider] Swiper available on window:', (window as any).Swiper ? '\u2705' : 'NOT FOUND \u274C');\n console.log('[slider] .swiper element exists:', document.querySelector('.swiper') ?? 'NOT FOUND \u274C');\n console.log('[slider] slide count:', imageSlider?.slides?.length ?? 'unknown');\n console.log('[slider] active index:', imageSlider?.activeIndex ?? 'unknown');\n\n console.log('[promptbar] wordCount: ', wordCount ?? 'NOT FOUND \u274C');\n console.log('[promptbar] sendBtn: ', sendBtn ?? 'NOT FOUND \u274C');\n console.log('[promptbar] barBorder: ', barBorder ?? 'NOT FOUND \u274C');\n console.log('[promptbar] textSlot: ', textSlot ?? 'NOT FOUND \u274C');\n console.log('[promptbar] gsap: ', gsap ? '\u2705' : 'NOT FOUND \u274C');\n\n if (!wordCount || !sendBtn || !barBorder || !textSlot || !gsap) {\n console.error('[promptbar] One or more dependencies missing. Aborting.');\n return;\n }\n\n console.log('[promptbar] All elements found \u2705 Starting loop...');\n\n let currentIndex: number = 0;\n let cancelled: boolean = false;\n\n // \u2500\u2500 Utilities \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n function updateWordCount(text: string): void {\n const words = text.trim().split(/\\s+/).filter(Boolean).length;\n wordCount.textContent = `${words || 0}/300 words`;\n }\n\n // \u2500\u2500 chroma element factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 makeChromaElement(text: string): HTMLDivElement {\n const div = document.createElement('div');\n div.className = 'chroma-text';\n div.setAttribute('data-animate', 'false');\n div.textContent = text;\n return div;\n }\n\n // \u2500\u2500 textIn \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 textIn(text: string): Promise<void> {\n console.log(`[promptbar] textIn \u2192 \"${text}\"`);\n return new Promise(resolve => {\n const tl = gsap.timeline({ defaults: { ease: 'power1.out' } });\n\n const existing = textSlot.querySelector('.chroma-text') as HTMLDivElement | null;\n if (existing) {\n tl.to(existing, {\n duration: 0.4,\n autoAlpha: 0,\n ease: 'power1.in',\n });\n tl.add(() => existing.remove());\n }\n\n let newEl: HTMLDivElement;\n\n tl.add(() => {\n newEl = makeChromaElement(text);\n textSlot.appendChild(newEl);\n newEl.setAttribute('data-animate', 'true');\n animateWordCount(text);\n console.log('[promptbar] chroma element appended');\n });\n\n tl.to(() => newEl, {\n duration: 0.6,\n autoAlpha: 1,\n });\n\n tl.add(() => {\n console.log('[promptbar] textIn done \u2705');\n resolve();\n });\n });\n }\n\n // \u2500\u2500 Animation steps \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 triggerSendClick(): Promise<void> {\n console.log('[promptbar] triggerSendClick');\n return new Promise(resolve => {\n sendBtn.setAttribute('is-clicked', 'true');\n triggerSubmitLoader();\n setTimeout(() => {\n sendBtn.setAttribute('is-clicked', 'false');\n setTimeout(resolve, 250);\n }, 120);\n });\n }\n\n function triggerBorderAnimation(slider: any, slideIndex: number): Promise<void> {\n console.log('[promptbar] triggerBorderAnimation started, going to slide:', slideIndex);\n return new Promise(resolve => {\n barBorder.removeAttribute('is-animating');\n\n setTimeout(() => {\n barBorder.setAttribute('is-animating', 'true');\n\n const computedStyle = window.getComputedStyle(barBorder);\n console.log('[promptbar] animation-name:', computedStyle.animationName);\n console.log('[promptbar] animation-duration:', computedStyle.animationDuration);\n\n const fallback = setTimeout(() => {\n console.warn('[promptbar] animationend never fired \u2014 fallback \u26A0\uFE0F');\n barBorder.removeAttribute('is-animating');\n resolve();\n }, 4500);\n\n barBorder.addEventListener('animationend', () => {\n clearTimeout(fallback);\n barBorder.removeAttribute('is-animating');\n console.log('[promptbar] triggerBorderAnimation done \u2705');\n resolve();\n }, { once: true });\n\n }, 50);\n });\n }\n\n function animateWordCount(text: string): void {\n const target = text.trim().split(/\\s+/).filter(Boolean).length;\n const counter = { value: 0 };\n\n gsap.to(counter, {\n value: target,\n duration: 0.8,\n ease: 'power2.out',\n onUpdate: () => {\n wordCount.textContent = `${Math.round(counter.value)}/${300} words`;\n },\n onComplete: () => {\n wordCount.textContent = `${target}/300 words`;\n }\n });\n }\n\n function transitionSlides(slider: any, nextIndex: number): Promise<void> {\n return new Promise(resolve => {\n const currentSlide = slider.slides[slider.activeIndex];\n const currentImages = currentSlide.querySelectorAll('[prompt-slide-image]');\n\n const tl = gsap.timeline({ onComplete: resolve });\n\n tl.to(currentImages, {\n scale: 1.5,\n opacity: 0,\n filter: 'blur(16px)',\n duration: 1,\n ease: 'power2.in',\n stagger: 0.05,\n })\n .add(() => {\n slider.slideToLoop(nextIndex);\n\n requestAnimationFrame(() => {\n const newSlide = slider.slides[slider.activeIndex];\n const newImages = newSlide.querySelectorAll('[prompt-slide-image]');\n\n slider.slides.forEach((slide: HTMLElement) => {\n if (slide !== newSlide) {\n gsap.set(slide.querySelectorAll('[prompt-slide-image]'), {\n scale: 0.8, opacity: 0, filter: 'blur(12px)'\n });\n }\n });\n\n gsap.fromTo(newImages,\n { scale: 0.8, opacity: 0, filter: 'blur(12px)' },\n {\n scale: 1,\n opacity: 1,\n filter: 'blur(0px)',\n duration: 1,\n ease: 'power3.out',\n stagger: 0.07,\n onComplete: resolve\n }\n );\n });\n\n }, '-=0.25');\n });\n }\n\n // \u2500\u2500 Skeleton fade out \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 function fadeOutSkeletons(slider: any): void {\n setTimeout(() => {\n const activeSlide = slider.slides[slider.activeIndex];\n const skeletons = activeSlide?.querySelectorAll('[prompt-skeleton]');\n skeletons?.forEach((skeleton: HTMLElement) => {\n const randomDelay = Math.random() * 1500;\n skeleton.style.transition = 'opacity 0.5s ease';\n skeleton.style.opacity = '1';\n setTimeout(() => {\n skeleton.style.opacity = '0';\n }, randomDelay);\n });\n }, 50);\n }\n\n // \u2500\u2500 Submit loader \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 function triggerSubmitLoader(): void {\n if (!submitButtonLoading) return;\n submitButtonLoading.style.opacity = '1';\n setTimeout(() => {\n submitButtonLoading.style.opacity = '0';\n }, 2500);\n }\n\n // \u2500\u2500 Reveal initial slide (runs once on load) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function revealInitialSlide(): void {\n requestAnimationFrame(() => {\n const firstSlide = imageSlider.slides[imageSlider.activeIndex];\n const firstImages = firstSlide.querySelectorAll('[prompt-slide-image]');\n gsap.fromTo(firstImages,\n { scale: 0.8, opacity: 0, filter: 'blur(12px)' },\n {\n scale: 1,\n opacity: 1,\n filter: 'blur(0px)',\n duration: 1,\n ease: 'power3.out',\n stagger: 0.07,\n }\n );\n });\n }\n\n // \u2500\u2500 Main loop \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 async function runLoop(): Promise<void> {\n while (true) {\n if (cancelled) return;\n\n const item = slides[currentIndex % slides.length];\n\n await textIn(item.prompt);\n\n currentIndex++;\n\n await sleep(100);\n triggerSendClick();\n triggerBorderAnimation(imageSlider, item.slide);\n\n await sleep(1500);\n await transitionSlides(imageSlider, item.slide);\n fadeOutSkeletons(imageSlider);\n\n await sleep(2000);\n }\n }\n\n // \u2500\u2500 Set initial state (iteration 0 already happened) \u2500\u2500\u2500\u2500\u2500\u2500\n\n const firstItem = slides[0];\n\n const initialEl = makeChromaElement(firstItem.prompt);\n textSlot.appendChild(initialEl);\n initialEl.setAttribute('data-animate', 'true');\n updateWordCount(firstItem.prompt);\n\n imageSlider.slideToLoop(firstItem.slide);\n revealInitialSlide();\n fadeOutSkeletons(imageSlider);\n\n currentIndex = 1;\n\n sleep(3000).then(() => runLoop());\n\n});"],
|
|
5
|
-
"mappings": ";;;AAAA,WAAS,iBAAiB,oBAAoB,MAAM;
|
|
4
|
+
"sourcesContent": ["document.addEventListener('DOMContentLoaded', () => {\n\n // console.log('[promptbar] DOMContentLoaded fired');\n\n const gsap = (window as any).gsap;\n\n const floatEls = document.querySelectorAll('[prompt-slide-image-inner]');\n // console.log('[float] elements found:', floatEls.length);\n\n floatEls.forEach((el) => {\n gsap.set(el, { x: 0, y: 0 });\n\n function drift() {\n gsap.to(el, {\n x: gsap.utils.random(-20, 20),\n y: gsap.utils.random(-20, 20),\n duration: gsap.utils.random(2, 3),\n ease: 'sine.inOut',\n onComplete: drift,\n });\n }\n\n gsap.delayedCall(gsap.utils.random(0, 4), drift);\n });\n\n const slides: { prompt: string; slide: number }[] = [\n { prompt: \"Build a list of country music dancers that wear cowboy hats\", slide: 0 },\n { prompt: \"Build a list of grandma creators who do hip hop lip sync content\", slide: 1 },\n { prompt: \"Build a list of meme pages that are perfect for an EDM launch\", slide: 2 },\n ];\n\n const wordCount = document.querySelector('[promptbar=word-count]') as HTMLSpanElement;\n const sendBtn = document.querySelector('[promptbar=submit]') as HTMLDivElement;\n const barBorder = document.querySelector('[promptbar=border]') as HTMLDivElement;\n const textSlot = document.querySelector('[promptbar=text-slot]') as HTMLDivElement;\n const submitButtonLoading = document.querySelector('[promptbar=submit-loader]') as HTMLDivElement;\n\n let sliderRevealed = false;\n\n const imageSlider = new (window as any).Swiper('[promptbar-slider]', {\n loop: true,\n speed: 0,\n effect: 'fade',\n fadeEffect: { crossFade: false },\n pagination: { el: '.swiper-pagination', clickable: true },\n keyboard: { enabled: true },\n mousewheel: { enabled: true },\n autoplay: false,\n });\n\n // console.log('[slider] imageSlider instance:', imageSlider ?? 'NOT FOUND \u274C');\n // console.log('[slider] Swiper available on window:', (window as any).Swiper ? '\u2705' : 'NOT FOUND \u274C');\n // console.log('[slider] .swiper element exists:', document.querySelector('.swiper') ?? 'NOT FOUND \u274C');\n // console.log('[slider] slide count:', imageSlider?.slides?.length ?? 'unknown');\n // console.log('[slider] active index:', imageSlider?.activeIndex ?? 'unknown');\n\n // console.log('[promptbar] wordCount: ', wordCount ?? 'NOT FOUND \u274C');\n // console.log('[promptbar] sendBtn: ', sendBtn ?? 'NOT FOUND \u274C');\n // console.log('[promptbar] barBorder: ', barBorder ?? 'NOT FOUND \u274C');\n // console.log('[promptbar] textSlot: ', textSlot ?? 'NOT FOUND \u274C');\n // console.log('[promptbar] gsap: ', gsap ? '\u2705' : 'NOT FOUND \u274C');\n\n if (!wordCount || !sendBtn || !barBorder || !textSlot || !gsap) {\n console.error('[promptbar] One or more dependencies missing. Aborting.');\n return;\n }\n\n // console.log('[promptbar] All elements found \u2705 Starting loop...');\n\n let currentIndex: number = 0;\n let cancelled: boolean = false;\n\n // \u2500\u2500 Utilities \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n function updateWordCount(text: string): void {\n const words = text.trim().split(/\\s+/).filter(Boolean).length;\n wordCount.textContent = `${words || 0}/300 words`;\n }\n\n // \u2500\u2500 chroma element factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 makeChromaElement(text: string): HTMLDivElement {\n const div = document.createElement('div');\n div.className = 'chroma-text';\n div.setAttribute('data-animate', 'false');\n div.textContent = text;\n return div;\n }\n\n // \u2500\u2500 textIn \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 textIn(text: string): Promise<void> {\n // console.log(`[promptbar] textIn \u2192 \"${text}\"`);\n return new Promise(resolve => {\n const tl = gsap.timeline({ defaults: { ease: 'power1.out' } });\n\n const existing = textSlot.querySelector('.chroma-text') as HTMLDivElement | null;\n if (existing) {\n tl.to(existing, {\n duration: 0.4,\n autoAlpha: 0,\n ease: 'power1.in',\n });\n tl.add(() => existing.remove());\n }\n\n let newEl: HTMLDivElement;\n\n tl.add(() => {\n newEl = makeChromaElement(text);\n textSlot.appendChild(newEl);\n newEl.setAttribute('data-animate', 'true');\n animateWordCount(text);\n // console.log('[promptbar] chroma element appended');\n });\n\n tl.to(() => newEl, {\n duration: 0.6,\n autoAlpha: 1,\n });\n\n tl.add(() => {\n // console.log('[promptbar] textIn done \u2705');\n resolve();\n });\n });\n }\n\n // \u2500\u2500 Animation steps \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 triggerSendClick(): Promise<void> {\n // console.log('[promptbar] triggerSendClick');\n return new Promise(resolve => {\n sendBtn.setAttribute('is-clicked', 'true');\n triggerSubmitLoader();\n setTimeout(() => {\n sendBtn.setAttribute('is-clicked', 'false');\n setTimeout(resolve, 250);\n }, 120);\n });\n }\n\n function triggerBorderAnimation(slider: any, slideIndex: number): Promise<void> {\n // console.log('[promptbar] triggerBorderAnimation started, going to slide:', slideIndex);\n return new Promise(resolve => {\n barBorder.removeAttribute('is-animating');\n\n setTimeout(() => {\n barBorder.setAttribute('is-animating', 'true');\n\n const computedStyle = window.getComputedStyle(barBorder);\n // console.log('[promptbar] animation-name:', computedStyle.animationName);\n // console.log('[promptbar] animation-duration:', computedStyle.animationDuration);\n\n const fallback = setTimeout(() => {\n console.warn('[promptbar] animationend never fired \u2014 fallback \u26A0\uFE0F');\n barBorder.removeAttribute('is-animating');\n resolve();\n }, 4500);\n\n barBorder.addEventListener('animationend', () => {\n clearTimeout(fallback);\n barBorder.removeAttribute('is-animating');\n // console.log('[promptbar] triggerBorderAnimation done \u2705');\n resolve();\n }, { once: true });\n\n }, 50);\n });\n }\n\n function animateWordCount(text: string): void {\n const target = text.trim().split(/\\s+/).filter(Boolean).length;\n const counter = { value: 0 };\n\n gsap.to(counter, {\n value: target,\n duration: 0.8,\n ease: 'power2.out',\n onUpdate: () => {\n wordCount.textContent = `${Math.round(counter.value)}/${300} words`;\n },\n onComplete: () => {\n wordCount.textContent = `${target}/300 words`;\n }\n });\n }\n\n function transitionSlides(slider: any, nextIndex: number): Promise<void> {\n return new Promise(resolve => {\n const currentSlide = slider.slides[slider.activeIndex];\n const currentImages = currentSlide.querySelectorAll('[prompt-slide-image]');\n\n const tl = gsap.timeline({ onComplete: resolve });\n\n tl.to(currentImages, {\n scale: 1.5,\n opacity: 0,\n filter: 'blur(16px)',\n duration: 1,\n ease: 'power2.in',\n stagger: 0.05,\n })\n .add(() => {\n slider.slideToLoop(nextIndex);\n\n requestAnimationFrame(() => {\n const newSlide = slider.slides[slider.activeIndex];\n const newImages = newSlide.querySelectorAll('[prompt-slide-image]');\n\n slider.slides.forEach((slide: HTMLElement) => {\n if (slide !== newSlide) {\n gsap.set(slide.querySelectorAll('[prompt-slide-image]'), {\n scale: 0.8, opacity: 0, filter: 'blur(12px)'\n });\n }\n });\n\n gsap.fromTo(newImages,\n { scale: 0.8, opacity: 0, filter: 'blur(12px)' },\n {\n scale: 1,\n opacity: 1,\n filter: 'blur(0px)',\n duration: 1,\n ease: 'power3.out',\n stagger: 0.07,\n onComplete: resolve\n }\n );\n });\n\n }, '-=0.25');\n });\n }\n\n // \u2500\u2500 Skeleton fade out \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 function fadeOutSkeletons(slider: any): void {\n setTimeout(() => {\n const activeSlide = slider.slides[slider.activeIndex];\n const skeletons = activeSlide?.querySelectorAll('[prompt-skeleton]');\n skeletons?.forEach((skeleton: HTMLElement) => {\n const randomDelay = Math.random() * 1500;\n skeleton.style.transition = 'opacity 0.5s ease';\n skeleton.style.opacity = '1';\n setTimeout(() => {\n skeleton.style.opacity = '0';\n }, randomDelay);\n });\n }, 50);\n }\n\n // \u2500\u2500 Submit loader \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 function triggerSubmitLoader(): void {\n if (!submitButtonLoading) return;\n submitButtonLoading.style.opacity = '1';\n setTimeout(() => {\n submitButtonLoading.style.opacity = '0';\n }, 2500);\n }\n\n // \u2500\u2500 Reveal initial slide (runs once on load) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function revealInitialSlide(): void {\n requestAnimationFrame(() => {\n const firstSlide = imageSlider.slides[imageSlider.activeIndex];\n const firstImages = firstSlide.querySelectorAll('[prompt-slide-image]');\n gsap.fromTo(firstImages,\n { scale: 0.8, opacity: 0, filter: 'blur(12px)' },\n {\n scale: 1,\n opacity: 1,\n filter: 'blur(0px)',\n duration: 1,\n ease: 'power3.out',\n stagger: 0.07,\n }\n );\n });\n }\n\n // \u2500\u2500 Main loop \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 async function runLoop(): Promise<void> {\n while (true) {\n if (cancelled) return;\n\n const item = slides[currentIndex % slides.length];\n\n await textIn(item.prompt);\n\n currentIndex++;\n\n await sleep(100);\n triggerSendClick();\n triggerBorderAnimation(imageSlider, item.slide);\n\n await sleep(1500);\n await transitionSlides(imageSlider, item.slide);\n fadeOutSkeletons(imageSlider);\n\n await sleep(2000);\n }\n }\n\n // \u2500\u2500 Set initial state (iteration 0 already happened) \u2500\u2500\u2500\u2500\u2500\u2500\n\n const firstItem = slides[0];\n\n const initialEl = makeChromaElement(firstItem.prompt);\n textSlot.appendChild(initialEl);\n initialEl.setAttribute('data-animate', 'true');\n updateWordCount(firstItem.prompt);\n\n imageSlider.slideToLoop(firstItem.slide);\n revealInitialSlide();\n fadeOutSkeletons(imageSlider);\n\n currentIndex = 1;\n\n sleep(3000).then(() => runLoop());\n\n});"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|