@fynd-design-engineering/fynd-one-v2 3.4.28 → 3.4.29

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 +1 @@
1
- "use strict";(()=>{var E=n=>{let t=new URLSearchParams(window.location.search).get(n);return t?t.trim():null},T=()=>{let n=E("utm_medium")?.toLowerCase();return n==="cpc"||n==="ads"},L="fynd_website_ad.",P=n=>`${L}${n}`,_=n=>{let t=n.closest("form");return t&&(t.getAttribute("data-name")||t.getAttribute("name")||t.id)||null},g=()=>{if(window.__adsTrackingInitializedGeneral||!T())return;window.__adsTrackingInitializedGeneral=!0;let n={"fynd_website.current_page":window.location.pathname},t=(e,i)=>{let r=P(e);window.trackEvent?.(r,{...n,...i||{}})};document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll('[data-ph="sign-up"]').forEach(a=>a.addEventListener("click",()=>t("sign_up.clicked"))),document.querySelectorAll('[data-ph="sign-in"]').forEach(a=>a.addEventListener("click",()=>t("sign_in.clicked"))),document.querySelectorAll('[data-ph="book-a-demo"]').forEach(a=>a.addEventListener("click",()=>t("book_a_demo.clicked")));let e=document.querySelectorAll("[ph-form-field]"),i=new Set,r=function(){let a=_(this)||"unknown-form";i.has(a)||(i.add(a),t("form.started",{started_form:a}))};e.forEach(a=>{let o=a.tagName.toLowerCase(),f=a.type?.toLowerCase();o==="button"||o==="input"&&f==="submit"||a.addEventListener("focus",r),o==="button"||o==="input"&&f==="submit"?a.addEventListener("click",r):o==="select"?a.addEventListener("change",r):a.addEventListener("input",r)}),document.querySelectorAll('[type="submit"]').forEach(a=>{a.addEventListener("click",function(){let o=_(this);setTimeout(()=>{window.validationPassed===!0&&t("form.submitted",o?{submitted_form:o}:{})},10)})})})};var w="2741377816069290";function A(){typeof window>"u"||window.fbq||function(n,t,e,i,r,a,o){n.fbq||(r=n.fbq=function(){r.callMethod?r.callMethod.apply(r,arguments):r.queue.push(arguments)},n._fbq||(n._fbq=r),r.push=r,r.loaded=!0,r.version="2.0",r.queue=[],a=t.createElement(e),a.async=!0,a.src="https://connect.facebook.net/en_US/fbevents.js",o=t.getElementsByTagName(e)[0],o.parentNode.insertBefore(a,o))}(window,document,"script",void 0)}function b(){try{let n=null;if(typeof window.getUserJourney=="function"&&(n=window.getUserJourney()),!n){let i=sessionStorage.getItem("userJourney");i&&(n=JSON.parse(i))}let t={},e=n?.formDetails;return e?.email&&(t.email=e.email),e?.phone&&(t.phone=e.phone),e?.firstName&&(t.first_name=e.firstName),e?.lastName&&(t.last_name=e.lastName),e?.city&&(t.city=e.city),e?.state&&(t.state=e.state),e?.zip&&(t.zip=e.zip),n?.country&&(t.country=n.country),n?.userId&&(t.external_id=String(n.userId)),Object.keys(t).forEach(i=>{let r=i;t[r]||delete t[r]}),Object.keys(t).length?t:null}catch{return null}}function M(n){if(!n)return null;let t={};return n["fynd_website.form_email"]&&(t.email=n["fynd_website.form_email"]),n["fynd_website.form_phone"]&&(t.phone=n["fynd_website.form_phone"]),n["fynd_website.form_first_name"]&&(t.first_name=n["fynd_website.form_first_name"]),n["fynd_website.form_last_name"]&&(t.last_name=n["fynd_website.form_last_name"]),n.city&&(t.city=n.city),n.state&&(t.state=n.state),n.zip&&(t.zip=n.zip),n.country&&(t.country=n.country),n.external_id&&(t.external_id=n.external_id),Object.keys(t).forEach(e=>{let i=e;t[i]||delete t[i]}),Object.keys(t).length?t:null}function S(n="evt"){return`${n}_${Date.now()}_${Math.random().toString(36).slice(2)}`}function u(...n){window.fbq&&window.fbq(...n)}function D(n,t){let e=t||{},i=M(e)||b();switch(n){case"fynd_website.form.submitted":{let r=e.event_id||S("lead"),a=e.submitted_form||e["fynd_website.form_name"]||"unknown_form";return{type:"track",name:"Lead",params:{form_id:e["fynd_website.form_id"]||void 0,form_name:a,value:0,currency:"INR"},options:{eventID:r},userData:i}}case"fynd_website.sign_up.clicked":return{type:"trackCustom",name:"SignUpClick",params:{},userData:i};case"fynd_website.sign_in.clicked":return{type:"trackCustom",name:"SignInClick",params:{},userData:i};case"fynd_website.book_a_demo.clicked":return{type:"trackCustom",name:"BookDemoClick",params:{source_page:e?.["fynd_website.source_page"]},userData:i};case"fynd_website.form.started":return{type:"trackCustom",name:"FormStarted",params:{form_id:e?.["fynd_website.form_id"]||void 0,form_name:e?.["fynd_website.form_name"]||void 0},userData:i};case"fynd_website.page.loaded":return{type:"track",name:"PageView",params:{},userData:i};default:return null}}function h(n={}){let{enableAdvancedMatching:t=!0,enableSpaPageViews:e=!0,hasConsent:i}=n;A();let r=t?b():null;if(i&&!i()){let o=window.setInterval(()=>{i()&&(window.clearInterval(o),u("init",w,r||{}),p(e))},250)}else u("init",w,r||{}),p(e);let a=window.trackEvent;window.trackEvent=function(o,f){try{if(typeof a=="function"&&a.call(window,o,f),i&&!i())return;let d=D(o,f);if(!d)return;d.type==="track"?d.options?.eventID?u("track",d.name,d.params||{},{eventID:d.options.eventID}):u("track",d.name,d.params||{}):u("trackCustom",d.name,d.params||{})}catch(d){console.warn("Meta tracking error:",d)}}}function p(n){if(u("track","PageView"),n){let r=function(){setTimeout(()=>u("track","PageView"),0)};var t=r;let e=history.pushState,i=history.replaceState;history.pushState=function(...a){let o=e.apply(this,a);return r(),o},history.replaceState=function(...a){let o=i.apply(this,a);return r(),o},window.addEventListener("popstate",r)}}var v=()=>{let n={};try{let t=null;if(typeof window.getUserJourney=="function"&&(t=window.getUserJourney()),!t){let e=sessionStorage.getItem("userJourney");e&&(t=JSON.parse(e))}if(t?.formDetails){let e=t.formDetails;e.formId&&(n.form_id=e.formId),e.formName&&(n.form_name=e.formName),e.firstName&&(n.form_first_name=e.firstName),e.lastName&&(n.form_last_name=e.lastName),e.email&&(n.form_email=e.email),e.phone&&(n.form_phone=e.phone)}if(t?.aiData){let e=t.aiData;e.context&&(n.aidata_context=e.context),e.platform&&(n.aidata_platform=e.platform),e.type&&(n.aidata_type=e.type),e.detectionMethod&&(n.aidata_detection=e.detectionMethod)}}catch(t){console.warn("Error getting user journey data for GA tracking:",t)}return n},y=()=>{let t={"fynd_website.source_page":window.location.pathname,"fynd_website.product":"fynd.com website","fynd_website.device_type":"Unknown","fynd_website.utm_source":new URLSearchParams(window.location.search).get("utm_source")||"","fynd_website.utm_medium":new URLSearchParams(window.location.search).get("utm_medium")||"","fynd_website.utm_campaign":new URLSearchParams(window.location.search).get("utm_campaign")||"","fynd_website.referrer":document.referrer};try{let e=null;if(typeof window.getUserJourney=="function"&&(e=window.getUserJourney()),!e){let i=sessionStorage.getItem("userJourney");i&&(e=JSON.parse(i))}if(e){if(t["fynd_website.journey_touchpoints"]=e.userJourney||e,e.formDetails){let i=e.formDetails;i.formId&&(t["fynd_website.form_id"]=i.formId),i.formName&&(t["fynd_website.form_name"]=i.formName),i.firstName&&(t["fynd_website.form_first_name"]=i.firstName),i.lastName&&(t["fynd_website.form_last_name"]=i.lastName),i.email&&(t["fynd_website.form_email"]=i.email),i.phone&&(t["fynd_website.form_phone"]=i.phone)}if(e.userJourney?.length>0){t["fynd_website.journey_total_pages"]=e.userJourney.length,t["fynd_website.journey_touchpoints_count"]=e.userJourney.length,t["fynd_website.journey_first_page"]=e.userJourney[0].page,t["fynd_website.journey_current_page"]=e.userJourney[e.userJourney.length-1].page;let i=new Date(e.userJourney[0].time),r=new Date(e.userJourney[e.userJourney.length-1].time);t["fynd_website.journey_session_duration"]=Math.floor((r.getTime()-i.getTime())/1e3),t["fynd_website.journey_entry_time"]=e.userJourney[0].time,t["fynd_website.journey_exit_time"]=e.userJourney[e.userJourney.length-1].time}if(e.deviceCategory&&(t["fynd_website.device_type"]=e.deviceCategory),e.browser&&(t["fynd_website.journey_browser"]=e.browser),e.device&&(t["fynd_website.journey_device"]=e.device),e.origin&&(t["fynd_website.journey_origin"]=e.origin),e.utmPath&&(t["fynd_website.journey_utm_path"]=e.utmPath),e.scrollDepth&&(t["fynd_website.journey_scroll_depth"]=e.scrollDepth),e.aiData){let i=e.aiData;i.context&&(t["fynd_website.aidata_context"]=i.context),i.platform&&(t["fynd_website.aidata_platform"]=i.platform),i.type&&(t["fynd_website.aidata_type"]=i.type),i.detectionMethod&&(t["fynd_website.aidata_detection"]=i.detectionMethod)}}}catch(e){console.warn("Error getting user journey data for tracking:",e)}if(t["fynd_website.device_type"]==="Unknown"){let e=navigator.userAgent;/iPad/.test(e)||/Android/.test(e)&&!/Mobile/.test(e)||/Tablet/.test(e)?t["fynd_website.device_type"]="Tablet":/Mobile|iPhone|Android|BlackBerry|Opera Mini|IEMobile|WPDesktop/.test(e)?t["fynd_website.device_type"]="Mobile":t["fynd_website.device_type"]="Desktop"}try{let e=document.cookie.match(/(?:^|;\s*)user-id=([^;]*)/);t["fynd_website.uuid"]=e?decodeURIComponent(e[1]):null}catch(e){console.warn("Error reading user-id cookie:",e),t["fynd_website.uuid"]=null}return t},j=(n,t,e)=>{if(window.dataLayer){let i={event:n,event_category:"form_interaction",event_label:n,...t};e?.submitted_form&&(i.submitted_form=e.submitted_form),window.dataLayer.push(i)}else console.warn("dataLayer not available for GA tracking")},m=(n,t)=>{try{let e=y(),i=t?{...e,...t}:e;window.posthog&&window.posthog.capture(n,i);let r=v(),a=r.aidata_context||r.aidata_platform||r.aidata_type||r.aidata_detection;(n.includes("form")||Object.keys(r).length>0||t?.submitted_form||!!a)&&j(n,r,t)}catch(e){console.error("Error tracking event:",e)}},k=n=>{let t=n.closest("form");return t&&(t.getAttribute("data-name")||t.getAttribute("name")||t.id)||null};document.addEventListener("DOMContentLoaded",()=>{let n=y();window.posthog&&window.posthog.capture("$pageview",n)});window.addEventListener("load",()=>{m("fynd_website.page.loaded")});document.addEventListener("DOMContentLoaded",()=>{let n=document.querySelectorAll('[data-ph="sign-up"]'),t=document.querySelectorAll('[data-ph="sign-in"]'),e=document.querySelectorAll('[href="#footer-form"]'),i=document.querySelectorAll('[data-ph="book-a-demo"]'),r=document.querySelectorAll('[data-ph="call"]');document.querySelectorAll('[type="submit"]').forEach(s=>{s.addEventListener("click",function(){let c=k(this);setTimeout(()=>{window.validationPassed===!0&&m("fynd_website.form.submitted",c?{submitted_form:c}:{})},10)})}),n.forEach(s=>{s.addEventListener("click",()=>m("fynd_website.sign_up.clicked"))}),t.forEach(s=>{s.addEventListener("click",()=>m("fynd_website.sign_in.clicked"))}),e.forEach(s=>{s.addEventListener("click",()=>m("fynd_website.scroll_to_form.clicked"))}),i.forEach(s=>{s.addEventListener("click",()=>m("fynd_website.book_a_demo.clicked"))}),r.forEach(s=>{s.addEventListener("click",()=>m("fynd_website.call.clicked"))});let o=document.querySelectorAll("[ph-form-field]"),f=new Set,d=function(){let c=k(this)||"unknown-form";f.has(c)||(f.add(c),m("fynd_website.form.started"))};o.forEach(s=>{let c=s.tagName.toLowerCase(),l=s.type?.toLowerCase();c==="button"||c==="input"&&l==="submit"||s.addEventListener("focus",d),c==="button"||c==="input"&&l==="submit"?s.addEventListener("click",d):c==="select"?s.addEventListener("change",d):s.addEventListener("input",d)})});window.getPosthogTrackingProperties=y;window.trackEvent=m;window.getGaTrackingProperties=v;g();h({enableAdvancedMatching:!0,enableSpaPageViews:!0,hasConsent:()=>window.__ad_consent==="granted"||!0});})();
1
+ "use strict";(()=>{var E=n=>{let t=new URLSearchParams(window.location.search).get(n);return t?t.trim():null},T=()=>{let n=E("utm_medium")?.toLowerCase();return n==="cpc"||n==="ads"},P="fynd_website_ad.",L=n=>`${P}${n}`,_=n=>{let t=n.closest("form");return t&&(t.getAttribute("data-name")||t.getAttribute("name")||t.id)||null},g=()=>{if(window.__adsTrackingInitializedGeneral||!T())return;window.__adsTrackingInitializedGeneral=!0;let n={"fynd_website.current_page":window.location.pathname},t=(e,i)=>{let r=L(e);window.trackEvent?.(r,{...n,...i||{}})};document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll('[data-ph="sign-up"]').forEach(a=>a.addEventListener("click",()=>t("sign_up.clicked"))),document.querySelectorAll('[data-ph="sign-in"]').forEach(a=>a.addEventListener("click",()=>t("sign_in.clicked"))),document.querySelectorAll('[data-ph="book-a-demo"]').forEach(a=>a.addEventListener("click",()=>t("book_a_demo.clicked")));let e=document.querySelectorAll("[ph-form-field]"),i=new Set,r=function(){let a=_(this)||"unknown-form";i.has(a)||(i.add(a),t("form.started",{started_form:a}))};e.forEach(a=>{let d=a.tagName.toLowerCase(),c=a.type?.toLowerCase();d==="button"||d==="input"&&c==="submit"||a.addEventListener("focus",r),d==="button"||d==="input"&&c==="submit"?a.addEventListener("click",r):d==="select"?a.addEventListener("change",r):a.addEventListener("input",r)}),document.querySelectorAll('[type="submit"]').forEach(a=>{a.addEventListener("click",function(){let d=_(this);setTimeout(()=>{window.validationPassed===!0&&t("form.submitted",d?{submitted_form:d}:{})},10)})})})};var w="2741377816069290";function A(){typeof window>"u"||window.fbq||function(n,t,e,i,r,a,d){n.fbq||(r=n.fbq=function(){r.callMethod?r.callMethod.apply(r,arguments):r.queue.push(arguments)},n._fbq||(n._fbq=r),r.push=r,r.loaded=!0,r.version="2.0",r.queue=[],a=t.createElement(e),a.async=!0,a.src="https://connect.facebook.net/en_US/fbevents.js",d=t.getElementsByTagName(e)[0],d.parentNode.insertBefore(a,d))}(window,document,"script",void 0)}function b(){try{let n=null;if(typeof window.getUserJourney=="function"&&(n=window.getUserJourney()),!n){let i=sessionStorage.getItem("userJourney");i&&(n=JSON.parse(i))}let t={},e=n?.formDetails;return e?.email&&(t.email=e.email),e?.phone&&(t.phone=e.phone),e?.firstName&&(t.first_name=e.firstName),e?.lastName&&(t.last_name=e.lastName),e?.city&&(t.city=e.city),e?.state&&(t.state=e.state),e?.zip&&(t.zip=e.zip),n?.country&&(t.country=n.country),n?.userId&&(t.external_id=String(n.userId)),Object.keys(t).forEach(i=>{let r=i;t[r]||delete t[r]}),Object.keys(t).length?t:null}catch{return null}}function D(n){if(!n)return null;let t={};return n["fynd_website.form_email"]&&(t.email=n["fynd_website.form_email"]),n["fynd_website.form_phone"]&&(t.phone=n["fynd_website.form_phone"]),n["fynd_website.form_first_name"]&&(t.first_name=n["fynd_website.form_first_name"]),n["fynd_website.form_last_name"]&&(t.last_name=n["fynd_website.form_last_name"]),n.city&&(t.city=n.city),n.state&&(t.state=n.state),n.zip&&(t.zip=n.zip),n.country&&(t.country=n.country),n.external_id&&(t.external_id=n.external_id),Object.keys(t).forEach(e=>{let i=e;t[i]||delete t[i]}),Object.keys(t).length?t:null}function S(n="evt"){return`${n}_${Date.now()}_${Math.random().toString(36).slice(2)}`}function u(...n){window.fbq&&window.fbq(...n)}function M(n,t){let e=t||{},i=D(e)||b();switch(n){case"fynd_website.form.submitted":{let r=e.event_id||S("lead"),a=e.submitted_form||e["fynd_website.form_name"]||"unknown_form";return{type:"track",name:"Lead",params:{form_id:e["fynd_website.form_id"]||void 0,form_name:a,value:0,currency:"INR"},options:{eventID:r},userData:i}}case"fynd_website.sign_up.clicked":return{type:"trackCustom",name:"SignUpClick",params:{},userData:i};case"fynd_website.sign_in.clicked":return{type:"trackCustom",name:"SignInClick",params:{},userData:i};case"fynd_website.book_a_demo.clicked":return{type:"trackCustom",name:"BookDemoClick",params:{source_page:e?.["fynd_website.source_page"]},userData:i};case"fynd_website.form.started":return{type:"trackCustom",name:"FormStarted",params:{form_id:e?.["fynd_website.form_id"]||void 0,form_name:e?.["fynd_website.form_name"]||void 0},userData:i};case"fynd_website.page.loaded":return{type:"track",name:"PageView",params:{},userData:i};default:return null}}function h(n={}){let{enableAdvancedMatching:t=!0,enableSpaPageViews:e=!0,hasConsent:i}=n;A();let r=t?b():null;if(i&&!i()){let d=window.setInterval(()=>{i()&&(window.clearInterval(d),u("init",w,r||{}),p(e))},250)}else u("init",w,r||{}),p(e);let a=window.trackEvent;window.trackEvent=function(d,c){try{if(typeof a=="function"&&a.call(window,d,c),i&&!i())return;let o=M(d,c);if(!o)return;o.type==="track"?o.options?.eventID?u("track",o.name,o.params||{},{eventID:o.options.eventID}):u("track",o.name,o.params||{}):u("trackCustom",o.name,o.params||{})}catch(o){console.warn("Meta tracking error:",o)}}}function p(n){if(u("track","PageView"),n){let r=function(){setTimeout(()=>u("track","PageView"),0)};var t=r;let e=history.pushState,i=history.replaceState;history.pushState=function(...a){let d=e.apply(this,a);return r(),d},history.replaceState=function(...a){let d=i.apply(this,a);return r(),d},window.addEventListener("popstate",r)}}var v=()=>{let n={};try{let t=null;if(typeof window.getUserJourney=="function"&&(t=window.getUserJourney()),!t){let e=localStorage.getItem("userJourney");e&&(t=JSON.parse(e))}if(t?.formDetails){let e=t.formDetails;e.formId&&(n.form_id=e.formId),e.formName&&(n.form_name=e.formName),e.firstName&&(n.form_first_name=e.firstName),e.lastName&&(n.form_last_name=e.lastName),e.email&&(n.form_email=e.email),e.phone&&(n.form_phone=e.phone)}if(t?.aiData){let e=t.aiData;e.context&&(n.aidata_context=e.context),e.platform&&(n.aidata_platform=e.platform),e.type&&(n.aidata_type=e.type),e.detectionMethod&&(n.aidata_detection=e.detectionMethod)}}catch(t){console.warn("Error getting user journey data for GA tracking:",t)}return n},y=()=>{let t={"fynd_website.source_page":window.location.pathname,"fynd_website.product":"fynd.com website","fynd_website.device_type":"Unknown","fynd_website.utm_source":new URLSearchParams(window.location.search).get("utm_source")||"","fynd_website.utm_medium":new URLSearchParams(window.location.search).get("utm_medium")||"","fynd_website.utm_campaign":new URLSearchParams(window.location.search).get("utm_campaign")||"","fynd_website.referrer":document.referrer};try{let e=null;if(typeof window.getUserJourney=="function"&&(e=window.getUserJourney()),!e){let i=localStorage.getItem("userJourney");i&&(e=JSON.parse(i))}if(e){if(t["fynd_website.journey_touchpoints"]=e.userJourney||e,e.formDetails){let i=e.formDetails;i.formId&&(t["fynd_website.form_id"]=i.formId),i.formName&&(t["fynd_website.form_name"]=i.formName),i.firstName&&(t["fynd_website.form_first_name"]=i.firstName),i.lastName&&(t["fynd_website.form_last_name"]=i.lastName),i.email&&(t["fynd_website.form_email"]=i.email),i.phone&&(t["fynd_website.form_phone"]=i.phone)}if(e.userJourney?.length>0){t["fynd_website.journey_total_pages"]=e.userJourney.length,t["fynd_website.journey_touchpoints_count"]=e.userJourney.length,t["fynd_website.journey_first_page"]=e.userJourney[0].page,t["fynd_website.journey_current_page"]=e.userJourney[e.userJourney.length-1].page;let i=new Date(e.userJourney[0].time),r=new Date(e.userJourney[e.userJourney.length-1].time);t["fynd_website.journey_session_duration"]=Math.floor((r.getTime()-i.getTime())/1e3),t["fynd_website.journey_entry_time"]=e.userJourney[0].time,t["fynd_website.journey_exit_time"]=e.userJourney[e.userJourney.length-1].time}if(e.deviceCategory&&(t["fynd_website.device_type"]=e.deviceCategory),e.browser&&(t["fynd_website.journey_browser"]=e.browser),e.device&&(t["fynd_website.journey_device"]=e.device),e.origin&&(t["fynd_website.journey_origin"]=e.origin),e.utmPath&&(t["fynd_website.journey_utm_path"]=e.utmPath),e.scrollDepth&&(t["fynd_website.journey_scroll_depth"]=e.scrollDepth),e.aiData){let i=e.aiData;i.context&&(t["fynd_website.aidata_context"]=i.context),i.platform&&(t["fynd_website.aidata_platform"]=i.platform),i.type&&(t["fynd_website.aidata_type"]=i.type),i.detectionMethod&&(t["fynd_website.aidata_detection"]=i.detectionMethod)}}}catch(e){console.warn("Error getting user journey data for tracking:",e)}if(t["fynd_website.device_type"]==="Unknown"){let e=navigator.userAgent;/iPad/.test(e)||/Android/.test(e)&&!/Mobile/.test(e)||/Tablet/.test(e)?t["fynd_website.device_type"]="Tablet":/Mobile|iPhone|Android|BlackBerry|Opera Mini|IEMobile|WPDesktop/.test(e)?t["fynd_website.device_type"]="Mobile":t["fynd_website.device_type"]="Desktop"}try{let e=document.cookie.match(/(?:^|;\s*)user-id=([^;]*)/);t["fynd_website.uuid"]=e?decodeURIComponent(e[1]):null}catch(e){console.warn("Error reading user-id cookie:",e),t["fynd_website.uuid"]=null}return t},j=(n,t,e)=>{if(window.dataLayer){let i={event:n,event_category:"form_interaction",event_label:n,...t};e?.submitted_form&&(i.submitted_form=e.submitted_form),window.dataLayer.push(i)}else console.warn("dataLayer not available for GA tracking")},m=(n,t)=>{try{let e=y(),i=t?{...e,...t}:e;if(window.posthog){let c={...i};if(n==="fynd_website.form.submitted")try{let o=window.getUserJourney?.()||JSON.parse(localStorage.getItem("userJourney")||"{}"),s={};o?.formDetails?.firstName&&(s.name=o.formDetails.firstName),o?.formDetails?.email&&(s.email=o.formDetails.email),o?.formDetails?.phone&&(s.mobile=o.formDetails.phone),Object.keys(s).length>0&&(c.$set=s)}catch(o){console.warn("Error extracting person properties:",o)}window.posthog.capture(n,c)}let r=v(),a=r.aidata_context||r.aidata_platform||r.aidata_type||r.aidata_detection;(n.includes("form")||Object.keys(r).length>0||t?.submitted_form||!!a)&&j(n,r,t)}catch(e){console.error("Error tracking event:",e)}},k=n=>{let t=n.closest("form");return t&&(t.getAttribute("data-name")||t.getAttribute("name")||t.id)||null};document.addEventListener("DOMContentLoaded",()=>{let n=y();window.posthog&&window.posthog.capture("$pageview",n)});window.addEventListener("load",()=>{m("fynd_website.page.loaded")});document.addEventListener("DOMContentLoaded",()=>{let n=document.querySelectorAll('[data-ph="sign-up"]'),t=document.querySelectorAll('[data-ph="sign-in"]'),e=document.querySelectorAll('[href="#footer-form"]'),i=document.querySelectorAll('[data-ph="book-a-demo"]'),r=document.querySelectorAll('[data-ph="call"]');document.querySelectorAll('[type="submit"]').forEach(s=>{s.addEventListener("click",function(){let f=k(this);setTimeout(()=>{window.validationPassed===!0&&m("fynd_website.form.submitted",f?{submitted_form:f}:{})},10)})}),n.forEach(s=>{s.addEventListener("click",()=>m("fynd_website.sign_up.clicked"))}),t.forEach(s=>{s.addEventListener("click",()=>m("fynd_website.sign_in.clicked"))}),e.forEach(s=>{s.addEventListener("click",()=>m("fynd_website.scroll_to_form.clicked"))}),i.forEach(s=>{s.addEventListener("click",()=>m("fynd_website.book_a_demo.clicked"))}),r.forEach(s=>{s.addEventListener("click",()=>m("fynd_website.call.clicked"))});let d=document.querySelectorAll("[ph-form-field]"),c=new Set,o=function(){let f=k(this)||"unknown-form";c.has(f)||(c.add(f),m("fynd_website.form.started"))};d.forEach(s=>{let f=s.tagName.toLowerCase(),l=s.type?.toLowerCase();f==="button"||f==="input"&&l==="submit"||s.addEventListener("focus",o),f==="button"||f==="input"&&l==="submit"?s.addEventListener("click",o):f==="select"?s.addEventListener("change",o):s.addEventListener("input",o)})});window.getPosthogTrackingProperties=y;window.trackEvent=m;window.getGaTrackingProperties=v;g();h({enableAdvancedMatching:!0,enableSpaPageViews:!0,hasConsent:()=>window.__ad_consent==="granted"||!0});})();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../bin/live-reload.js", "../../src/posthog-and-ga/adtracking-general.ts", "../../src/posthog-and-ga/meta-tracking.ts", "../../src/posthog-and-ga/main.ts"],
4
- "sourcesContent": ["// Only enable live reload when running on localhost\nif (\n window.location.hostname === \"localhost\" ||\n window.location.hostname === \"127.0.0.1\"\n) {\n new EventSource(`${SERVE_ORIGIN}/esbuild`).addEventListener(\"change\", () =>\n location.reload()\n );\n} else {\n // console.log(\"Live reload disabled: not running on localhost\");\n}\n", "// adTracking.general.ts \u2014 General ad events for paid traffic (utm_medium=cpc|ads)\n\ndeclare global {\n interface Window {\n trackEvent: (eventName: string, properties?: any) => void;\n validationPassed?: boolean;\n __adsTrackingInitializedGeneral?: boolean;\n }\n }\n \n const getSearchParam = (name: string): string | null => {\n const v = new URLSearchParams(window.location.search).get(name);\n return v ? v.trim() : null;\n };\n \n const isAdTraffic = (): boolean => {\n const medium = getSearchParam(\"utm_medium\")?.toLowerCase();\n return medium === \"cpc\" || medium === \"ads\";\n };\n \n const AD_EVENT_PREFIX = \"fynd_website_ad.\";\n const makeEvent = (suffix: string) => `${AD_EVENT_PREFIX}${suffix}`;\n \n // helper: find nearest form and get a friendly name\n const getParentFormName = (element: HTMLElement): string | null => {\n const parentForm = element.closest(\"form\") as HTMLFormElement | null;\n if (!parentForm) return null;\n return (\n parentForm.getAttribute(\"data-name\") ||\n parentForm.getAttribute(\"name\") ||\n parentForm.id ||\n null\n );\n };\n \n /**\n * Initialize general ads tracking.\n * Fires only when utm_medium is \"cpc\" or \"ads\".\n * Adds `fynd_website.current_page` = current page path.\n */\n export const initGeneralAdsTracking = () => {\n if (window.__adsTrackingInitializedGeneral) return;\n if (!isAdTraffic()) return;\n \n window.__adsTrackingInitializedGeneral = true;\n \n const baseProps: Record<string, any> = {\n \"fynd_website.current_page\": window.location.pathname,\n };\n \n const emit = (suffix: string, props?: Record<string, any>) => {\n const name = makeEvent(suffix);\n window.trackEvent?.(name, { ...baseProps, ...(props || {}) });\n };\n \n document.addEventListener(\"DOMContentLoaded\", () => {\n // Buttons\n document.querySelectorAll('[data-ph=\"sign-up\"]').forEach((btn) =>\n btn.addEventListener(\"click\", () => emit(\"sign_up.clicked\"))\n );\n document.querySelectorAll('[data-ph=\"sign-in\"]').forEach((btn) =>\n btn.addEventListener(\"click\", () => emit(\"sign_in.clicked\"))\n );\n document.querySelectorAll('[data-ph=\"book-a-demo\"]').forEach((btn) =>\n btn.addEventListener(\"click\", () => emit(\"book_a_demo.clicked\"))\n );\n \n // Form started\n const formFields = document.querySelectorAll<HTMLElement>(\"[ph-form-field]\");\n const triggeredForms = new Set<string>();\n \n const handleFormStarted = function (this: HTMLElement) {\n const formName = getParentFormName(this) || \"unknown-form\";\n if (!triggeredForms.has(formName)) {\n triggeredForms.add(formName);\n emit(\"form.started\", { started_form: formName });\n }\n };\n \n formFields.forEach((field) => {\n const tag = field.tagName.toLowerCase();\n const type = (field as HTMLInputElement).type?.toLowerCase();\n \n if (!(tag === \"button\" || (tag === \"input\" && type === \"submit\"))) {\n field.addEventListener(\"focus\", handleFormStarted);\n }\n if (tag === \"button\" || (tag === \"input\" && type === \"submit\")) {\n field.addEventListener(\"click\", handleFormStarted);\n } else if (tag === \"select\") {\n field.addEventListener(\"change\", handleFormStarted);\n } else {\n field.addEventListener(\"input\", handleFormStarted);\n }\n });\n \n // Form submitted\n document.querySelectorAll('[type=\"submit\"]').forEach((button) => {\n button.addEventListener(\"click\", function (this: HTMLElement) {\n const formName = getParentFormName(this);\n setTimeout(() => {\n if (window.validationPassed === true) {\n const props = formName ? { submitted_form: formName } : {};\n emit(\"form.submitted\", props);\n }\n }, 10);\n });\n });\n });\n };", "// meta-tracking.ts \u2014 Meta Pixel integration (standards-compliant) for Fynd website\n// - Initializes Meta Pixel (fbq) with Advanced Matching (when available)\n// - Mirrors your existing window.trackEvent() calls to Meta events\n// - Maps Fynd events -> Meta standard/custom events for better optimization\n// - Adds SPA PageView handling + eventID generation for future CAPI dedup\n// - Safe to import once anywhere in your app bootstrap\n\nimport { UserJourney } from \"../utils/types/user-journey\";\n\n// ---------- Config ----------\nconst META_PIXEL_ID = \"2741377816069290\";\n\ntype AdvancedUser = {\n email?: string;\n phone?: string;\n first_name?: string;\n last_name?: string;\n city?: string;\n state?: string;\n zip?: string;\n country?: string;\n external_id?: string;\n};\n\ntype InitOptions = {\n /**\n * If true, attempts to pull user info from window.getUserJourney/sessionStorage\n * and pass as Advanced Matching data (improves match rate for retargeting).\n */\n enableAdvancedMatching?: boolean;\n\n /**\n * If true, listens for SPA route changes and fires PageView on history changes.\n * Set true if you use a client-side router.\n */\n enableSpaPageViews?: boolean;\n\n /**\n * Optional predicate: return false to block Meta calls until consent is granted.\n * Example: () => window.__ad_consent === 'granted'\n */\n hasConsent?: () => boolean;\n};\n\n// ---------- fbq bootstrap ----------\ndeclare global {\n interface Window {\n fbq?: (...args: any[]) => void;\n _fbq?: any;\n trackEvent: (eventName: string, properties?: any) => void;\n getUserJourney: () => UserJourney | null;\n }\n}\n\nfunction loadMetaPixel(): void {\n if (typeof window === \"undefined\") return;\n if (window.fbq) return;\n\n (function (f: any, b: any, e: any, v: any, n?: any, t?: any, s?: any) {\n if (f.fbq) return;\n n = f.fbq = function () {\n (n as any).callMethod ? (n as any).callMethod.apply(n, arguments) : (n as any).queue.push(arguments);\n };\n if (!f._fbq) f._fbq = n;\n (n as any).push = (n as any);\n (n as any).loaded = true;\n (n as any).version = \"2.0\";\n (n as any).queue = [];\n t = b.createElement(e);\n t.async = true;\n t.src = \"https://connect.facebook.net/en_US/fbevents.js\";\n s = b.getElementsByTagName(e)[0];\n s.parentNode!.insertBefore(t, s);\n })(window, document, \"script\", undefined);\n}\n\n// ---------- Advanced Matching helpers ----------\nfunction getAdvancedUserFromJourney(): AdvancedUser | null {\n try {\n let journey: any = null;\n if (typeof window.getUserJourney === \"function\") {\n journey = window.getUserJourney();\n }\n if (!journey) {\n const stored = sessionStorage.getItem(\"userJourney\");\n if (stored) journey = JSON.parse(stored);\n }\n\n const u: AdvancedUser = {};\n const fd = journey?.formDetails;\n if (fd?.email) u.email = fd.email;\n if (fd?.phone) u.phone = fd.phone;\n if (fd?.firstName) u.first_name = fd.firstName;\n if (fd?.lastName) u.last_name = fd.lastName;\n if (fd?.city) u.city = fd.city;\n if (fd?.state) u.state = fd.state;\n if (fd?.zip) u.zip = fd.zip;\n if (journey?.country) u.country = journey.country;\n if (journey?.userId) u.external_id = String(journey.userId);\n\n // Remove empties\n Object.keys(u).forEach((k) => {\n const key = k as keyof AdvancedUser;\n if (!u[key]) delete u[key];\n });\n\n return Object.keys(u).length ? u : null;\n } catch {\n return null;\n }\n}\n\nfunction getAdvancedUserFromProps(props?: any): AdvancedUser | null {\n if (!props) return null;\n const u: AdvancedUser = {};\n if (props[\"fynd_website.form_email\"]) u.email = props[\"fynd_website.form_email\"];\n if (props[\"fynd_website.form_phone\"]) u.phone = props[\"fynd_website.form_phone\"];\n if (props[\"fynd_website.form_first_name\"]) u.first_name = props[\"fynd_website.form_first_name\"];\n if (props[\"fynd_website.form_last_name\"]) u.last_name = props[\"fynd_website.form_last_name\"];\n if (props.city) u.city = props.city;\n if (props.state) u.state = props.state;\n if (props.zip) u.zip = props.zip;\n if (props.country) u.country = props.country;\n if (props.external_id) u.external_id = props.external_id;\n\n Object.keys(u).forEach((k) => {\n const key = k as keyof AdvancedUser;\n if (!u[key]) delete u[key];\n });\n\n return Object.keys(u).length ? u : null;\n}\n\n// ---------- Utility ----------\nfunction genEventId(prefix: string = \"evt\"): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n}\n\nfunction safeFbq(...args: any[]): void {\n if (!window.fbq) return;\n window.fbq(...args);\n}\n\n// ---------- Core mapping (Fynd -> Meta) ----------\n/**\n * Maps your event names to Meta\u2019s recommended events.\n * Returns {name, params, options} ready for fbq('track'|'trackCustom', ...)\n */\nfunction mapFyndToMeta(eventName: string, properties?: any): {\n type: \"track\" | \"trackCustom\";\n name: string;\n params?: Record<string, any>;\n options?: { eventID?: string };\n userData?: AdvancedUser | null;\n} | null {\n const props = properties || {};\n // Try to extract user for Advanced Matching\n const userData = getAdvancedUserFromProps(props) || getAdvancedUserFromJourney();\n\n switch (eventName) {\n case \"fynd_website.form.submitted\": {\n // Choose 'Lead' as default (use CompleteRegistration for account creation flows)\n const eventID = props.event_id || genEventId(\"lead\");\n const formName = props.submitted_form || props[\"fynd_website.form_name\"] || \"unknown_form\";\n return {\n type: \"track\",\n name: \"Lead\",\n params: {\n form_id: props[\"fynd_website.form_id\"] || undefined,\n form_name: formName,\n value: 0,\n currency: \"INR\",\n },\n options: { eventID },\n userData,\n };\n }\n\n case \"fynd_website.sign_up.clicked\":\n return { type: \"trackCustom\", name: \"SignUpClick\", params: {}, userData };\n\n case \"fynd_website.sign_in.clicked\":\n return { type: \"trackCustom\", name: \"SignInClick\", params: {}, userData };\n\n case \"fynd_website.book_a_demo.clicked\":\n return {\n type: \"trackCustom\",\n name: \"BookDemoClick\",\n params: {\n source_page: props?.[\"fynd_website.source_page\"],\n },\n userData,\n };\n\n case \"fynd_website.form.started\":\n return {\n type: \"trackCustom\",\n name: \"FormStarted\",\n params: {\n form_id: props?.[\"fynd_website.form_id\"] || undefined,\n form_name: props?.[\"fynd_website.form_name\"] || undefined,\n },\n userData,\n };\n\n // Page lifecycle\n case \"fynd_website.page.loaded\":\n return { type: \"track\", name: \"PageView\", params: {}, userData };\n\n default:\n // Ignore other events by default; you can add more mappings here\n return null;\n }\n}\n\n// ---------- Public API ----------\n/**\n * Initialize Meta tracking and tee into window.trackEvent so existing code just works.\n */\nexport function initMetaTracking(options: InitOptions = {}): void {\n const { enableAdvancedMatching = true, enableSpaPageViews = true, hasConsent } = options;\n\n // 1) Load fbq\n loadMetaPixel();\n\n // 2) Init with/without Advanced Matching\n const initialUser = enableAdvancedMatching ? getAdvancedUserFromJourney() : null;\n if (hasConsent && !hasConsent()) {\n // Defer init until consent flips to true (lightweight poller)\n const iv = window.setInterval(() => {\n if (hasConsent()) {\n window.clearInterval(iv);\n safeFbq(\"init\", META_PIXEL_ID, initialUser || {});\n postInit(enableSpaPageViews);\n }\n }, 250);\n } else {\n safeFbq(\"init\", META_PIXEL_ID, initialUser || {});\n postInit(enableSpaPageViews);\n }\n\n // 3) Tee into window.trackEvent to mirror to Meta\n const originalTrackEvent = window.trackEvent;\n window.trackEvent = function (eventName: string, properties?: any): void {\n try {\n // First, call original (so PostHog/GA remain unchanged)\n if (typeof originalTrackEvent === \"function\") {\n originalTrackEvent.call(window, eventName, properties);\n }\n // Then forward to Meta (respect consent if provided)\n if (hasConsent && !hasConsent()) return;\n\n const mapped = mapFyndToMeta(eventName, properties);\n if (!mapped) return;\n\n // Pass Advanced Matching userData by re-calling init? No\u2014Meta supports user data on event via fbq 2nd arg in init or as 'init' options.\n // For events, best practice is to include user data via \"Advanced Matching\" settings or CAPI.\n // Here we rely on init advanced matching; optionally, you can include userData with custom calls via setUserProperties (not available on Pixel).\n if (mapped.type === \"track\") {\n if (mapped.options?.eventID) {\n safeFbq(\"track\", mapped.name, mapped.params || {}, { eventID: mapped.options.eventID });\n } else {\n safeFbq(\"track\", mapped.name, mapped.params || {});\n }\n } else {\n // trackCustom\n // We cannot pass user data as a separate arg here; advanced matching should be handled at init or via CAPI.\n safeFbq(\"trackCustom\", mapped.name, mapped.params || {});\n }\n } catch (e) {\n // swallow to avoid interrupting primary trackers\n // eslint-disable-next-line no-console\n console.warn(\"Meta tracking error:\", e);\n }\n };\n}\n\n/**\n * Manually send a CompleteRegistration when your \u201Cform submitted\u201D is actually an account creation.\n * Reuse the same eventID for later CAPI dedup if you mirror server-side.\n */\nexport function trackCompleteRegistration(registrationMethod: string = \"email\", eventID?: string, props?: any) {\n const options = eventID ? { eventID } : undefined;\n // Respect optional consent gate if your app uses one:\n // if (window.__ad_consent !== 'granted') return;\n safeFbq(\"track\", \"CompleteRegistration\", { registration_method: registrationMethod }, options);\n}\n\n/**\n * Optional helper if you want to send a Lead directly (outside of window.trackEvent).\n */\nexport function trackLead(formId?: string, formName?: string, valueINR: number = 0, eventID?: string) {\n const params: Record<string, any> = { value: valueINR, currency: \"INR\" };\n if (formId) params.form_id = formId;\n if (formName) params.form_name = formName;\n const options = { eventID: eventID || genEventId(\"lead\") };\n safeFbq(\"track\", \"Lead\", params, options);\n}\n\n// ---------- Internal: post init tasks ----------\nfunction postInit(enableSpaPageViews: boolean) {\n // Fire initial PageView (Meta does this automatically when you call fbq('track','PageView')\u2014we mimic GA's $pageview behavior)\n safeFbq(\"track\", \"PageView\");\n\n if (enableSpaPageViews) {\n // Hook into history API to catch virtual route changes\n const origPushState = history.pushState;\n const origReplaceState = history.replaceState;\n\n function onLocationChange() {\n // Delay slightly to allow DOM/router to settle\n setTimeout(() => safeFbq(\"track\", \"PageView\"), 0);\n }\n\n history.pushState = function (...args: any[]) {\n const ret = origPushState.apply(this, args as any);\n onLocationChange();\n return ret;\n };\n\n history.replaceState = function (...args: any[]) {\n const ret = origReplaceState.apply(this, args as any);\n onLocationChange();\n return ret;\n };\n\n window.addEventListener(\"popstate\", onLocationChange);\n }\n}\n\n// ---------- (Optional) noscript pixel for non-JS fallbacks ----------\n// In your HTML <noscript>, add:\n// <img height=\"1\" width=\"1\" style=\"display:none\"\n// src=\"https://www.facebook.com/tr?id=2741377816069290&ev=PageView&noscript=1\"/>", "// main.ts \u2014 Core tracking: PostHog + GA (GTM dataLayer) + optional ad tracking bootstrap\nimport { FormDetails, UserJourney } from \"../utils/types/user-journey\";\nimport { AdConfig, initAdsTracking } from \"./adTracking\";\nimport { initGeneralAdsTracking } from \"./adtracking-general\";\nimport { initMetaTracking } from \"./meta-tracking\";\n\n// ---------- Types ----------\ninterface GTMEvent {\n event: string;\n event_category: string;\n event_label: string;\n form_id?: string;\n form_name?: string;\n form_first_name?: string;\n form_last_name?: string;\n form_email?: string;\n form_phone?: string;\n submitted_form?: string;\n [key: string]: any;\n}\n\ninterface GATrackingProperties {\n form_id?: string;\n form_name?: string;\n form_first_name?: string;\n form_last_name?: string;\n form_email?: string;\n form_phone?: string;\n submitted_form?: string;\n aidata_context?: string;\n aidata_platform?: string;\n aidata_type?: string;\n aidata_detection?: string;\n}\n\ninterface TrackingProperties {\n \"fynd_website.source_page\": string;\n \"fynd_website.product\": string;\n \"fynd_website.device_type\": string;\n \"fynd_website.utm_source\": string;\n \"fynd_website.utm_medium\": string;\n \"fynd_website.utm_campaign\": string;\n \"fynd_website.referrer\": string;\n \"fynd_website.form_id\"?: string;\n \"fynd_website.form_name\"?: string;\n \"fynd_website.form_first_name\"?: string;\n \"fynd_website.form_last_name\"?: string;\n \"fynd_website.form_email\"?: string;\n \"fynd_website.form_phone\"?: string;\n \"fynd_website.journey_total_pages\"?: number;\n \"fynd_website.journey_session_duration\"?: number;\n \"fynd_website.journey_first_page\"?: string;\n \"fynd_website.journey_current_page\"?: string;\n \"fynd_website.journey_device\"?: string;\n \"fynd_website.journey_browser\"?: string;\n \"fynd_website.journey_device_name\"?: string;\n \"fynd_website.journey_origin\"?: string;\n \"fynd_website.journey_touchpoints\"?: any;\n \"fynd_website.journey_touchpoints_count\"?: number;\n \"fynd_website.journey_utm_path\"?: string;\n \"fynd_website.journey_entry_time\"?: string;\n \"fynd_website.journey_exit_time\"?: string;\n \"fynd_website.journey_scroll_depth\"?: number;\n \"fynd_website.aidata_context\"?: string;\n \"fynd_website.aidata_platform\"?: string;\n \"fynd_website.aidata_type\"?: string;\n \"fynd_website.aidata_detection\"?: string;\n submitted_form?: string;\n field_type?: string;\n field_name?: string;\n [key: string]: any;\n}\n\ndeclare global {\n interface Window {\n trackEvent: (eventName: string, properties?: any) => void;\n getPosthogTrackingProperties: () => TrackingProperties;\n getGaTrackingProperties: () => GATrackingProperties;\n validationPassed?: boolean;\n getUserJourney: () => UserJourney | null;\n dataLayer?: GTMEvent[];\n }\n}\n\n// ---------- GA helpers ----------\nconst getGaTrackingProperties = (): GATrackingProperties => {\n const gaProperties: GATrackingProperties = {};\n try {\n let journey: any = null;\n if (typeof (window as any).getUserJourney === \"function\") {\n journey = (window as any).getUserJourney();\n }\n if (!journey) {\n const storedData = sessionStorage.getItem(\"userJourney\");\n if (storedData) journey = JSON.parse(storedData);\n }\n\n if (journey?.formDetails) {\n const formDetails: FormDetails = journey.formDetails;\n if (formDetails.formId) gaProperties.form_id = formDetails.formId;\n if (formDetails.formName) gaProperties.form_name = formDetails.formName;\n if (formDetails.firstName) gaProperties.form_first_name = formDetails.firstName;\n if (formDetails.lastName) gaProperties.form_last_name = formDetails.lastName;\n if (formDetails.email) gaProperties.form_email = formDetails.email;\n if (formDetails.phone) gaProperties.form_phone = formDetails.phone;\n }\n\n if (journey?.aiData) {\n const aiData = journey.aiData;\n if (aiData.context) gaProperties.aidata_context = aiData.context;\n if (aiData.platform) gaProperties.aidata_platform = aiData.platform;\n if (aiData.type) gaProperties.aidata_type = aiData.type;\n if (aiData.detectionMethod) gaProperties.aidata_detection = aiData.detectionMethod;\n }\n } catch (err) {\n console.warn(\"Error getting user journey data for GA tracking:\", err);\n }\n return gaProperties;\n};\n\n// ---------- PostHog properties ----------\nconst getPosthogTrackingProperties = (): TrackingProperties => {\n const pathname: string = window.location.pathname;\n\n const base: TrackingProperties = {\n \"fynd_website.source_page\": pathname,\n \"fynd_website.product\": \"fynd.com website\",\n \"fynd_website.device_type\": \"Unknown\",\n \"fynd_website.utm_source\": new URLSearchParams(window.location.search).get(\"utm_source\") || \"\",\n \"fynd_website.utm_medium\": new URLSearchParams(window.location.search).get(\"utm_medium\") || \"\",\n \"fynd_website.utm_campaign\": new URLSearchParams(window.location.search).get(\"utm_campaign\") || \"\",\n \"fynd_website.referrer\": document.referrer,\n };\n\n try {\n let journey: any = null;\n if (typeof (window as any).getUserJourney === \"function\") {\n journey = (window as any).getUserJourney();\n }\n if (!journey) {\n const storedData = sessionStorage.getItem(\"userJourney\");\n if (storedData) journey = JSON.parse(storedData);\n }\n\n if (journey) {\n base[\"fynd_website.journey_touchpoints\"] = journey.userJourney || journey;\n\n if (journey.formDetails) {\n const f: FormDetails = journey.formDetails;\n if (f.formId) base[\"fynd_website.form_id\"] = f.formId;\n if (f.formName) base[\"fynd_website.form_name\"] = f.formName;\n if (f.firstName) base[\"fynd_website.form_first_name\"] = f.firstName;\n if (f.lastName) base[\"fynd_website.form_last_name\"] = f.lastName;\n if (f.email) base[\"fynd_website.form_email\"] = f.email;\n if (f.phone) base[\"fynd_website.form_phone\"] = f.phone;\n }\n\n if (journey.userJourney?.length > 0) {\n base[\"fynd_website.journey_total_pages\"] = journey.userJourney.length;\n base[\"fynd_website.journey_touchpoints_count\"] = journey.userJourney.length;\n base[\"fynd_website.journey_first_page\"] = journey.userJourney[0].page;\n base[\"fynd_website.journey_current_page\"] =\n journey.userJourney[journey.userJourney.length - 1].page;\n\n const firstVisit = new Date(journey.userJourney[0].time);\n const lastVisit = new Date(journey.userJourney[journey.userJourney.length - 1].time);\n base[\"fynd_website.journey_session_duration\"] = Math.floor(\n (lastVisit.getTime() - firstVisit.getTime()) / 1000\n );\n base[\"fynd_website.journey_entry_time\"] = journey.userJourney[0].time;\n base[\"fynd_website.journey_exit_time\"] =\n journey.userJourney[journey.userJourney.length - 1].time;\n }\n\n if (journey.deviceCategory) base[\"fynd_website.device_type\"] = journey.deviceCategory;\n if (journey.browser) base[\"fynd_website.journey_browser\"] = journey.browser;\n if (journey.device) base[\"fynd_website.journey_device\"] = journey.device;\n if (journey.origin) base[\"fynd_website.journey_origin\"] = journey.origin;\n if (journey.utmPath) base[\"fynd_website.journey_utm_path\"] = journey.utmPath;\n if (journey.scrollDepth) base[\"fynd_website.journey_scroll_depth\"] = journey.scrollDepth;\n\n if (journey.aiData) {\n const aiData = journey.aiData;\n if (aiData.context) base[\"fynd_website.aidata_context\"] = aiData.context;\n if (aiData.platform) base[\"fynd_website.aidata_platform\"] = aiData.platform;\n if (aiData.type) base[\"fynd_website.aidata_type\"] = aiData.type;\n if (aiData.detectionMethod) base[\"fynd_website.aidata_detection\"] = aiData.detectionMethod;\n }\n }\n } catch (err) {\n console.warn(\"Error getting user journey data for tracking:\", err);\n }\n\n // Fallback device type\n if (base[\"fynd_website.device_type\"] === \"Unknown\") {\n const ua = navigator.userAgent;\n if (/iPad/.test(ua) || (/Android/.test(ua) && !/Mobile/.test(ua)) || /Tablet/.test(ua)) {\n base[\"fynd_website.device_type\"] = \"Tablet\";\n } else if (/Mobile|iPhone|Android|BlackBerry|Opera Mini|IEMobile|WPDesktop/.test(ua)) {\n base[\"fynd_website.device_type\"] = \"Mobile\";\n } else {\n base[\"fynd_website.device_type\"] = \"Desktop\";\n }\n }\n\n // ---------- UUID from cookie ----------\n try {\n const cookieMatch = document.cookie.match(/(?:^|;\\s*)user-id=([^;]*)/);\n base[\"fynd_website.uuid\"] = cookieMatch ? decodeURIComponent(cookieMatch[1]) : null;\n } catch (err) {\n console.warn(\"Error reading user-id cookie:\", err);\n base[\"fynd_website.uuid\"] = null;\n }\n\n return base;\n};\n\n// ---------- GA send ----------\nconst sendToGA = (eventName: string, gaProps: GATrackingProperties, additionalProps?: any): void => {\n if ((window as any).dataLayer) {\n const eventData: GTMEvent = {\n event: eventName,\n event_category: \"form_interaction\",\n event_label: eventName,\n ...gaProps,\n };\n if (additionalProps?.submitted_form) {\n eventData.submitted_form = additionalProps.submitted_form;\n }\n (window as any).dataLayer.push(eventData);\n } else {\n console.warn(\"dataLayer not available for GA tracking\");\n }\n};\n\n// ---------- Public trackEvent ----------\nconst trackEvent = (eventName: string, properties?: Partial<TrackingProperties>): void => {\n try {\n const baseProps = getPosthogTrackingProperties();\n const finalProps = properties ? { ...baseProps, ...properties } : baseProps;\n\n if ((window as any).posthog) {\n (window as any).posthog.capture(eventName, finalProps);\n }\n\n const gaProps = getGaTrackingProperties();\n const hasAIData =\n gaProps.aidata_context || gaProps.aidata_platform || gaProps.aidata_type || gaProps.aidata_detection;\n\n const isFormRelatedEvent =\n eventName.includes(\"form\") ||\n Object.keys(gaProps).length > 0 ||\n properties?.submitted_form ||\n !!hasAIData;\n\n if (isFormRelatedEvent) {\n sendToGA(eventName, gaProps, properties);\n }\n } catch (error) {\n console.error(\"Error tracking event:\", error);\n }\n};\n\n// ---------- Shared helpers ----------\nconst getParentFormName = (element: HTMLElement): string | null => {\n const parentForm = element.closest(\"form\") as HTMLFormElement | null;\n if (!parentForm) return null;\n return (\n parentForm.getAttribute(\"data-name\") ||\n parentForm.getAttribute(\"name\") ||\n parentForm.id ||\n null\n );\n};\n\n// ---------- Page lifecycle ----------\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const props = getPosthogTrackingProperties();\n if ((window as any).posthog) {\n (window as any).posthog.capture(\"$pageview\", props);\n }\n});\n\nwindow.addEventListener(\"load\", () => {\n trackEvent(\"fynd_website.page.loaded\");\n});\n\n// ---------- Base site interactions ----------\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const signUpButtons = document.querySelectorAll('[data-ph=\"sign-up\"]');\n const signInButtons = document.querySelectorAll('[data-ph=\"sign-in\"]');\n const scrollToFormButtons = document.querySelectorAll('[href=\"#footer-form\"]');\n const bookADemoButtons = document.querySelectorAll('[data-ph=\"book-a-demo\"]');\n const callButtons = document.querySelectorAll('[data-ph=\"call\"]');\n const submitButtons = document.querySelectorAll('[type=\"submit\"]');\n\n submitButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (this: HTMLElement): void {\n const formName = getParentFormName(this);\n setTimeout(() => {\n if (window.validationPassed === true) {\n const additionalProps = formName ? { submitted_form: formName } : {};\n trackEvent(\"fynd_website.form.submitted\", additionalProps);\n }\n }, 10);\n });\n });\n\n signUpButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", () => trackEvent(\"fynd_website.sign_up.clicked\"));\n });\n\n signInButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", () => trackEvent(\"fynd_website.sign_in.clicked\"));\n });\n\n scrollToFormButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", () => trackEvent(\"fynd_website.scroll_to_form.clicked\"));\n });\n\n bookADemoButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", () => trackEvent(\"fynd_website.book_a_demo.clicked\"));\n });\n\n callButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", () => trackEvent(\"fynd_website.call.clicked\"));\n });\n\n // Form started\n const formFields = document.querySelectorAll<HTMLElement>(\"[ph-form-field]\");\n const triggeredForms = new Set<string>();\n\n const handleFormStarted = function (this: HTMLElement): void {\n const formName = getParentFormName(this);\n const formIdentifier = formName || \"unknown-form\";\n if (!triggeredForms.has(formIdentifier)) {\n triggeredForms.add(formIdentifier);\n trackEvent(\"fynd_website.form.started\");\n }\n };\n\n formFields.forEach((field) => {\n const tagName = field.tagName.toLowerCase();\n const inputType = (field as HTMLInputElement).type?.toLowerCase();\n\n if (!(tagName === \"button\" || (tagName === \"input\" && inputType === \"submit\"))) {\n field.addEventListener(\"focus\", handleFormStarted);\n }\n if (tagName === \"button\" || (tagName === \"input\" && inputType === \"submit\")) {\n field.addEventListener(\"click\", handleFormStarted);\n } else if (tagName === \"select\") {\n field.addEventListener(\"change\", handleFormStarted);\n } else {\n field.addEventListener(\"input\", handleFormStarted);\n }\n });\n});\n\n// ---------- Expose globals ----------\nwindow.getPosthogTrackingProperties = getPosthogTrackingProperties;\nwindow.trackEvent = trackEvent;\nwindow.getGaTrackingProperties = getGaTrackingProperties;\n\n// ---------- Optional: bootstrap ad tracking here ----------\n// const AD_CONFIGS: AdConfig[] = [\n// { adPageSlug: \"/solutions/transport-management-system\", adEventExtension: \"tms\", adUTMCampaign: \"tms\", },\n// ];\n// initAdsTracking(AD_CONFIGS);\ninitGeneralAdsTracking();\n\ninitMetaTracking({\n enableAdvancedMatching: true, // pulls user data from your journey store when available\n enableSpaPageViews: true, // fires PageView on virtual navigations\n hasConsent: () => (window as any).__ad_consent === \"granted\" || true, // replace with your consent logic\n});\n\n// ---------- Exports ----------\nexport {\n getPosthogTrackingProperties,\n getGaTrackingProperties,\n trackEvent,\n getParentFormName,\n type TrackingProperties,\n type GATrackingProperties,\n type GTMEvent,\n};"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Only enable live reload when running on localhost\nif (\n window.location.hostname === \"localhost\" ||\n window.location.hostname === \"127.0.0.1\"\n) {\n new EventSource(`${SERVE_ORIGIN}/esbuild`).addEventListener(\"change\", () =>\n location.reload()\n );\n} else {\n // console.log(\"Live reload disabled: not running on localhost\");\n}\n", "// adTracking.general.ts \u2014 General ad events for paid traffic (utm_medium=cpc|ads)\n\ndeclare global {\n interface Window {\n trackEvent: (eventName: string, properties?: any) => void;\n validationPassed?: boolean;\n __adsTrackingInitializedGeneral?: boolean;\n }\n }\n \n const getSearchParam = (name: string): string | null => {\n const v = new URLSearchParams(window.location.search).get(name);\n return v ? v.trim() : null;\n };\n \n const isAdTraffic = (): boolean => {\n const medium = getSearchParam(\"utm_medium\")?.toLowerCase();\n return medium === \"cpc\" || medium === \"ads\";\n };\n \n const AD_EVENT_PREFIX = \"fynd_website_ad.\";\n const makeEvent = (suffix: string) => `${AD_EVENT_PREFIX}${suffix}`;\n \n // helper: find nearest form and get a friendly name\n const getParentFormName = (element: HTMLElement): string | null => {\n const parentForm = element.closest(\"form\") as HTMLFormElement | null;\n if (!parentForm) return null;\n return (\n parentForm.getAttribute(\"data-name\") ||\n parentForm.getAttribute(\"name\") ||\n parentForm.id ||\n null\n );\n };\n \n /**\n * Initialize general ads tracking.\n * Fires only when utm_medium is \"cpc\" or \"ads\".\n * Adds `fynd_website.current_page` = current page path.\n */\n export const initGeneralAdsTracking = () => {\n if (window.__adsTrackingInitializedGeneral) return;\n if (!isAdTraffic()) return;\n \n window.__adsTrackingInitializedGeneral = true;\n \n const baseProps: Record<string, any> = {\n \"fynd_website.current_page\": window.location.pathname,\n };\n \n const emit = (suffix: string, props?: Record<string, any>) => {\n const name = makeEvent(suffix);\n window.trackEvent?.(name, { ...baseProps, ...(props || {}) });\n };\n \n document.addEventListener(\"DOMContentLoaded\", () => {\n // Buttons\n document.querySelectorAll('[data-ph=\"sign-up\"]').forEach((btn) =>\n btn.addEventListener(\"click\", () => emit(\"sign_up.clicked\"))\n );\n document.querySelectorAll('[data-ph=\"sign-in\"]').forEach((btn) =>\n btn.addEventListener(\"click\", () => emit(\"sign_in.clicked\"))\n );\n document.querySelectorAll('[data-ph=\"book-a-demo\"]').forEach((btn) =>\n btn.addEventListener(\"click\", () => emit(\"book_a_demo.clicked\"))\n );\n \n // Form started\n const formFields = document.querySelectorAll<HTMLElement>(\"[ph-form-field]\");\n const triggeredForms = new Set<string>();\n \n const handleFormStarted = function (this: HTMLElement) {\n const formName = getParentFormName(this) || \"unknown-form\";\n if (!triggeredForms.has(formName)) {\n triggeredForms.add(formName);\n emit(\"form.started\", { started_form: formName });\n }\n };\n \n formFields.forEach((field) => {\n const tag = field.tagName.toLowerCase();\n const type = (field as HTMLInputElement).type?.toLowerCase();\n \n if (!(tag === \"button\" || (tag === \"input\" && type === \"submit\"))) {\n field.addEventListener(\"focus\", handleFormStarted);\n }\n if (tag === \"button\" || (tag === \"input\" && type === \"submit\")) {\n field.addEventListener(\"click\", handleFormStarted);\n } else if (tag === \"select\") {\n field.addEventListener(\"change\", handleFormStarted);\n } else {\n field.addEventListener(\"input\", handleFormStarted);\n }\n });\n \n // Form submitted\n document.querySelectorAll('[type=\"submit\"]').forEach((button) => {\n button.addEventListener(\"click\", function (this: HTMLElement) {\n const formName = getParentFormName(this);\n setTimeout(() => {\n if (window.validationPassed === true) {\n const props = formName ? { submitted_form: formName } : {};\n emit(\"form.submitted\", props);\n }\n }, 10);\n });\n });\n });\n };", "// meta-tracking.ts \u2014 Meta Pixel integration (standards-compliant) for Fynd website\n// - Initializes Meta Pixel (fbq) with Advanced Matching (when available)\n// - Mirrors your existing window.trackEvent() calls to Meta events\n// - Maps Fynd events -> Meta standard/custom events for better optimization\n// - Adds SPA PageView handling + eventID generation for future CAPI dedup\n// - Safe to import once anywhere in your app bootstrap\n\nimport { UserJourney } from \"../utils/types/user-journey\";\n\n// ---------- Config ----------\nconst META_PIXEL_ID = \"2741377816069290\";\n\ntype AdvancedUser = {\n email?: string;\n phone?: string;\n first_name?: string;\n last_name?: string;\n city?: string;\n state?: string;\n zip?: string;\n country?: string;\n external_id?: string;\n};\n\ntype InitOptions = {\n /**\n * If true, attempts to pull user info from window.getUserJourney/sessionStorage\n * and pass as Advanced Matching data (improves match rate for retargeting).\n */\n enableAdvancedMatching?: boolean;\n\n /**\n * If true, listens for SPA route changes and fires PageView on history changes.\n * Set true if you use a client-side router.\n */\n enableSpaPageViews?: boolean;\n\n /**\n * Optional predicate: return false to block Meta calls until consent is granted.\n * Example: () => window.__ad_consent === 'granted'\n */\n hasConsent?: () => boolean;\n};\n\n// ---------- fbq bootstrap ----------\ndeclare global {\n interface Window {\n fbq?: (...args: any[]) => void;\n _fbq?: any;\n trackEvent: (eventName: string, properties?: any) => void;\n getUserJourney: () => UserJourney | null;\n }\n}\n\nfunction loadMetaPixel(): void {\n if (typeof window === \"undefined\") return;\n if (window.fbq) return;\n\n (function (f: any, b: any, e: any, v: any, n?: any, t?: any, s?: any) {\n if (f.fbq) return;\n n = f.fbq = function () {\n (n as any).callMethod ? (n as any).callMethod.apply(n, arguments) : (n as any).queue.push(arguments);\n };\n if (!f._fbq) f._fbq = n;\n (n as any).push = (n as any);\n (n as any).loaded = true;\n (n as any).version = \"2.0\";\n (n as any).queue = [];\n t = b.createElement(e);\n t.async = true;\n t.src = \"https://connect.facebook.net/en_US/fbevents.js\";\n s = b.getElementsByTagName(e)[0];\n s.parentNode!.insertBefore(t, s);\n })(window, document, \"script\", undefined);\n}\n\n// ---------- Advanced Matching helpers ----------\nfunction getAdvancedUserFromJourney(): AdvancedUser | null {\n try {\n let journey: any = null;\n if (typeof window.getUserJourney === \"function\") {\n journey = window.getUserJourney();\n }\n if (!journey) {\n const stored = sessionStorage.getItem(\"userJourney\");\n if (stored) journey = JSON.parse(stored);\n }\n\n const u: AdvancedUser = {};\n const fd = journey?.formDetails;\n if (fd?.email) u.email = fd.email;\n if (fd?.phone) u.phone = fd.phone;\n if (fd?.firstName) u.first_name = fd.firstName;\n if (fd?.lastName) u.last_name = fd.lastName;\n if (fd?.city) u.city = fd.city;\n if (fd?.state) u.state = fd.state;\n if (fd?.zip) u.zip = fd.zip;\n if (journey?.country) u.country = journey.country;\n if (journey?.userId) u.external_id = String(journey.userId);\n\n // Remove empties\n Object.keys(u).forEach((k) => {\n const key = k as keyof AdvancedUser;\n if (!u[key]) delete u[key];\n });\n\n return Object.keys(u).length ? u : null;\n } catch {\n return null;\n }\n}\n\nfunction getAdvancedUserFromProps(props?: any): AdvancedUser | null {\n if (!props) return null;\n const u: AdvancedUser = {};\n if (props[\"fynd_website.form_email\"]) u.email = props[\"fynd_website.form_email\"];\n if (props[\"fynd_website.form_phone\"]) u.phone = props[\"fynd_website.form_phone\"];\n if (props[\"fynd_website.form_first_name\"]) u.first_name = props[\"fynd_website.form_first_name\"];\n if (props[\"fynd_website.form_last_name\"]) u.last_name = props[\"fynd_website.form_last_name\"];\n if (props.city) u.city = props.city;\n if (props.state) u.state = props.state;\n if (props.zip) u.zip = props.zip;\n if (props.country) u.country = props.country;\n if (props.external_id) u.external_id = props.external_id;\n\n Object.keys(u).forEach((k) => {\n const key = k as keyof AdvancedUser;\n if (!u[key]) delete u[key];\n });\n\n return Object.keys(u).length ? u : null;\n}\n\n// ---------- Utility ----------\nfunction genEventId(prefix: string = \"evt\"): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n}\n\nfunction safeFbq(...args: any[]): void {\n if (!window.fbq) return;\n window.fbq(...args);\n}\n\n// ---------- Core mapping (Fynd -> Meta) ----------\n/**\n * Maps your event names to Meta\u2019s recommended events.\n * Returns {name, params, options} ready for fbq('track'|'trackCustom', ...)\n */\nfunction mapFyndToMeta(eventName: string, properties?: any): {\n type: \"track\" | \"trackCustom\";\n name: string;\n params?: Record<string, any>;\n options?: { eventID?: string };\n userData?: AdvancedUser | null;\n} | null {\n const props = properties || {};\n // Try to extract user for Advanced Matching\n const userData = getAdvancedUserFromProps(props) || getAdvancedUserFromJourney();\n\n switch (eventName) {\n case \"fynd_website.form.submitted\": {\n // Choose 'Lead' as default (use CompleteRegistration for account creation flows)\n const eventID = props.event_id || genEventId(\"lead\");\n const formName = props.submitted_form || props[\"fynd_website.form_name\"] || \"unknown_form\";\n return {\n type: \"track\",\n name: \"Lead\",\n params: {\n form_id: props[\"fynd_website.form_id\"] || undefined,\n form_name: formName,\n value: 0,\n currency: \"INR\",\n },\n options: { eventID },\n userData,\n };\n }\n\n case \"fynd_website.sign_up.clicked\":\n return { type: \"trackCustom\", name: \"SignUpClick\", params: {}, userData };\n\n case \"fynd_website.sign_in.clicked\":\n return { type: \"trackCustom\", name: \"SignInClick\", params: {}, userData };\n\n case \"fynd_website.book_a_demo.clicked\":\n return {\n type: \"trackCustom\",\n name: \"BookDemoClick\",\n params: {\n source_page: props?.[\"fynd_website.source_page\"],\n },\n userData,\n };\n\n case \"fynd_website.form.started\":\n return {\n type: \"trackCustom\",\n name: \"FormStarted\",\n params: {\n form_id: props?.[\"fynd_website.form_id\"] || undefined,\n form_name: props?.[\"fynd_website.form_name\"] || undefined,\n },\n userData,\n };\n\n // Page lifecycle\n case \"fynd_website.page.loaded\":\n return { type: \"track\", name: \"PageView\", params: {}, userData };\n\n default:\n // Ignore other events by default; you can add more mappings here\n return null;\n }\n}\n\n// ---------- Public API ----------\n/**\n * Initialize Meta tracking and tee into window.trackEvent so existing code just works.\n */\nexport function initMetaTracking(options: InitOptions = {}): void {\n const { enableAdvancedMatching = true, enableSpaPageViews = true, hasConsent } = options;\n\n // 1) Load fbq\n loadMetaPixel();\n\n // 2) Init with/without Advanced Matching\n const initialUser = enableAdvancedMatching ? getAdvancedUserFromJourney() : null;\n if (hasConsent && !hasConsent()) {\n // Defer init until consent flips to true (lightweight poller)\n const iv = window.setInterval(() => {\n if (hasConsent()) {\n window.clearInterval(iv);\n safeFbq(\"init\", META_PIXEL_ID, initialUser || {});\n postInit(enableSpaPageViews);\n }\n }, 250);\n } else {\n safeFbq(\"init\", META_PIXEL_ID, initialUser || {});\n postInit(enableSpaPageViews);\n }\n\n // 3) Tee into window.trackEvent to mirror to Meta\n const originalTrackEvent = window.trackEvent;\n window.trackEvent = function (eventName: string, properties?: any): void {\n try {\n // First, call original (so PostHog/GA remain unchanged)\n if (typeof originalTrackEvent === \"function\") {\n originalTrackEvent.call(window, eventName, properties);\n }\n // Then forward to Meta (respect consent if provided)\n if (hasConsent && !hasConsent()) return;\n\n const mapped = mapFyndToMeta(eventName, properties);\n if (!mapped) return;\n\n // Pass Advanced Matching userData by re-calling init? No\u2014Meta supports user data on event via fbq 2nd arg in init or as 'init' options.\n // For events, best practice is to include user data via \"Advanced Matching\" settings or CAPI.\n // Here we rely on init advanced matching; optionally, you can include userData with custom calls via setUserProperties (not available on Pixel).\n if (mapped.type === \"track\") {\n if (mapped.options?.eventID) {\n safeFbq(\"track\", mapped.name, mapped.params || {}, { eventID: mapped.options.eventID });\n } else {\n safeFbq(\"track\", mapped.name, mapped.params || {});\n }\n } else {\n // trackCustom\n // We cannot pass user data as a separate arg here; advanced matching should be handled at init or via CAPI.\n safeFbq(\"trackCustom\", mapped.name, mapped.params || {});\n }\n } catch (e) {\n // swallow to avoid interrupting primary trackers\n // eslint-disable-next-line no-console\n console.warn(\"Meta tracking error:\", e);\n }\n };\n}\n\n/**\n * Manually send a CompleteRegistration when your \u201Cform submitted\u201D is actually an account creation.\n * Reuse the same eventID for later CAPI dedup if you mirror server-side.\n */\nexport function trackCompleteRegistration(registrationMethod: string = \"email\", eventID?: string, props?: any) {\n const options = eventID ? { eventID } : undefined;\n // Respect optional consent gate if your app uses one:\n // if (window.__ad_consent !== 'granted') return;\n safeFbq(\"track\", \"CompleteRegistration\", { registration_method: registrationMethod }, options);\n}\n\n/**\n * Optional helper if you want to send a Lead directly (outside of window.trackEvent).\n */\nexport function trackLead(formId?: string, formName?: string, valueINR: number = 0, eventID?: string) {\n const params: Record<string, any> = { value: valueINR, currency: \"INR\" };\n if (formId) params.form_id = formId;\n if (formName) params.form_name = formName;\n const options = { eventID: eventID || genEventId(\"lead\") };\n safeFbq(\"track\", \"Lead\", params, options);\n}\n\n// ---------- Internal: post init tasks ----------\nfunction postInit(enableSpaPageViews: boolean) {\n // Fire initial PageView (Meta does this automatically when you call fbq('track','PageView')\u2014we mimic GA's $pageview behavior)\n safeFbq(\"track\", \"PageView\");\n\n if (enableSpaPageViews) {\n // Hook into history API to catch virtual route changes\n const origPushState = history.pushState;\n const origReplaceState = history.replaceState;\n\n function onLocationChange() {\n // Delay slightly to allow DOM/router to settle\n setTimeout(() => safeFbq(\"track\", \"PageView\"), 0);\n }\n\n history.pushState = function (...args: any[]) {\n const ret = origPushState.apply(this, args as any);\n onLocationChange();\n return ret;\n };\n\n history.replaceState = function (...args: any[]) {\n const ret = origReplaceState.apply(this, args as any);\n onLocationChange();\n return ret;\n };\n\n window.addEventListener(\"popstate\", onLocationChange);\n }\n}\n\n// ---------- (Optional) noscript pixel for non-JS fallbacks ----------\n// In your HTML <noscript>, add:\n// <img height=\"1\" width=\"1\" style=\"display:none\"\n// src=\"https://www.facebook.com/tr?id=2741377816069290&ev=PageView&noscript=1\"/>", "// main.ts \u2014 Core tracking: PostHog + GA (GTM dataLayer) + optional ad tracking bootstrap\nimport { FormDetails, UserJourney } from \"../utils/types/user-journey\";\nimport { AdConfig, initAdsTracking } from \"./adTracking\";\nimport { initGeneralAdsTracking } from \"./adtracking-general\";\nimport { initMetaTracking } from \"./meta-tracking\";\n\n// ---------- Types ----------\ninterface GTMEvent {\n event: string;\n event_category: string;\n event_label: string;\n form_id?: string;\n form_name?: string;\n form_first_name?: string;\n form_last_name?: string;\n form_email?: string;\n form_phone?: string;\n submitted_form?: string;\n [key: string]: any;\n}\n\ninterface GATrackingProperties {\n form_id?: string;\n form_name?: string;\n form_first_name?: string;\n form_last_name?: string;\n form_email?: string;\n form_phone?: string;\n submitted_form?: string;\n aidata_context?: string;\n aidata_platform?: string;\n aidata_type?: string;\n aidata_detection?: string;\n}\n\ninterface TrackingProperties {\n \"fynd_website.source_page\": string;\n \"fynd_website.product\": string;\n \"fynd_website.device_type\": string;\n \"fynd_website.utm_source\": string;\n \"fynd_website.utm_medium\": string;\n \"fynd_website.utm_campaign\": string;\n \"fynd_website.referrer\": string;\n \"fynd_website.form_id\"?: string;\n \"fynd_website.form_name\"?: string;\n \"fynd_website.form_first_name\"?: string;\n \"fynd_website.form_last_name\"?: string;\n \"fynd_website.form_email\"?: string;\n \"fynd_website.form_phone\"?: string;\n \"fynd_website.journey_total_pages\"?: number;\n \"fynd_website.journey_session_duration\"?: number;\n \"fynd_website.journey_first_page\"?: string;\n \"fynd_website.journey_current_page\"?: string;\n \"fynd_website.journey_device\"?: string;\n \"fynd_website.journey_browser\"?: string;\n \"fynd_website.journey_device_name\"?: string;\n \"fynd_website.journey_origin\"?: string;\n \"fynd_website.journey_touchpoints\"?: any;\n \"fynd_website.journey_touchpoints_count\"?: number;\n \"fynd_website.journey_utm_path\"?: string;\n \"fynd_website.journey_entry_time\"?: string;\n \"fynd_website.journey_exit_time\"?: string;\n \"fynd_website.journey_scroll_depth\"?: number;\n \"fynd_website.aidata_context\"?: string;\n \"fynd_website.aidata_platform\"?: string;\n \"fynd_website.aidata_type\"?: string;\n \"fynd_website.aidata_detection\"?: string;\n submitted_form?: string;\n field_type?: string;\n field_name?: string;\n [key: string]: any;\n}\n\ndeclare global {\n interface Window {\n trackEvent: (eventName: string, properties?: any) => void;\n getPosthogTrackingProperties: () => TrackingProperties;\n getGaTrackingProperties: () => GATrackingProperties;\n validationPassed?: boolean;\n getUserJourney: () => UserJourney | null;\n dataLayer?: GTMEvent[];\n }\n}\n\n// ---------- GA helpers ----------\nconst getGaTrackingProperties = (): GATrackingProperties => {\n const gaProperties: GATrackingProperties = {};\n try {\n let journey: any = null;\n if (typeof (window as any).getUserJourney === \"function\") {\n journey = (window as any).getUserJourney();\n }\n if (!journey) {\n const storedData = localStorage.getItem(\"userJourney\");\n if (storedData) journey = JSON.parse(storedData);\n }\n\n if (journey?.formDetails) {\n const formDetails: FormDetails = journey.formDetails;\n if (formDetails.formId) gaProperties.form_id = formDetails.formId;\n if (formDetails.formName) gaProperties.form_name = formDetails.formName;\n if (formDetails.firstName) gaProperties.form_first_name = formDetails.firstName;\n if (formDetails.lastName) gaProperties.form_last_name = formDetails.lastName;\n if (formDetails.email) gaProperties.form_email = formDetails.email;\n if (formDetails.phone) gaProperties.form_phone = formDetails.phone;\n }\n\n if (journey?.aiData) {\n const aiData = journey.aiData;\n if (aiData.context) gaProperties.aidata_context = aiData.context;\n if (aiData.platform) gaProperties.aidata_platform = aiData.platform;\n if (aiData.type) gaProperties.aidata_type = aiData.type;\n if (aiData.detectionMethod) gaProperties.aidata_detection = aiData.detectionMethod;\n }\n } catch (err) {\n console.warn(\"Error getting user journey data for GA tracking:\", err);\n }\n return gaProperties;\n};\n\n// ---------- PostHog properties ----------\nconst getPosthogTrackingProperties = (): TrackingProperties => {\n const pathname: string = window.location.pathname;\n\n const base: TrackingProperties = {\n \"fynd_website.source_page\": pathname,\n \"fynd_website.product\": \"fynd.com website\",\n \"fynd_website.device_type\": \"Unknown\",\n \"fynd_website.utm_source\": new URLSearchParams(window.location.search).get(\"utm_source\") || \"\",\n \"fynd_website.utm_medium\": new URLSearchParams(window.location.search).get(\"utm_medium\") || \"\",\n \"fynd_website.utm_campaign\": new URLSearchParams(window.location.search).get(\"utm_campaign\") || \"\",\n \"fynd_website.referrer\": document.referrer,\n };\n\n try {\n let journey: any = null;\n if (typeof (window as any).getUserJourney === \"function\") {\n journey = (window as any).getUserJourney();\n }\n if (!journey) {\n const storedData = localStorage.getItem(\"userJourney\");\n if (storedData) journey = JSON.parse(storedData);\n }\n\n if (journey) {\n base[\"fynd_website.journey_touchpoints\"] = journey.userJourney || journey;\n\n if (journey.formDetails) {\n const f: FormDetails = journey.formDetails;\n if (f.formId) base[\"fynd_website.form_id\"] = f.formId;\n if (f.formName) base[\"fynd_website.form_name\"] = f.formName;\n if (f.firstName) base[\"fynd_website.form_first_name\"] = f.firstName;\n if (f.lastName) base[\"fynd_website.form_last_name\"] = f.lastName;\n if (f.email) base[\"fynd_website.form_email\"] = f.email;\n if (f.phone) base[\"fynd_website.form_phone\"] = f.phone;\n }\n\n if (journey.userJourney?.length > 0) {\n base[\"fynd_website.journey_total_pages\"] = journey.userJourney.length;\n base[\"fynd_website.journey_touchpoints_count\"] = journey.userJourney.length;\n base[\"fynd_website.journey_first_page\"] = journey.userJourney[0].page;\n base[\"fynd_website.journey_current_page\"] =\n journey.userJourney[journey.userJourney.length - 1].page;\n\n const firstVisit = new Date(journey.userJourney[0].time);\n const lastVisit = new Date(journey.userJourney[journey.userJourney.length - 1].time);\n base[\"fynd_website.journey_session_duration\"] = Math.floor(\n (lastVisit.getTime() - firstVisit.getTime()) / 1000\n );\n base[\"fynd_website.journey_entry_time\"] = journey.userJourney[0].time;\n base[\"fynd_website.journey_exit_time\"] =\n journey.userJourney[journey.userJourney.length - 1].time;\n }\n\n if (journey.deviceCategory) base[\"fynd_website.device_type\"] = journey.deviceCategory;\n if (journey.browser) base[\"fynd_website.journey_browser\"] = journey.browser;\n if (journey.device) base[\"fynd_website.journey_device\"] = journey.device;\n if (journey.origin) base[\"fynd_website.journey_origin\"] = journey.origin;\n if (journey.utmPath) base[\"fynd_website.journey_utm_path\"] = journey.utmPath;\n if (journey.scrollDepth) base[\"fynd_website.journey_scroll_depth\"] = journey.scrollDepth;\n\n if (journey.aiData) {\n const aiData = journey.aiData;\n if (aiData.context) base[\"fynd_website.aidata_context\"] = aiData.context;\n if (aiData.platform) base[\"fynd_website.aidata_platform\"] = aiData.platform;\n if (aiData.type) base[\"fynd_website.aidata_type\"] = aiData.type;\n if (aiData.detectionMethod) base[\"fynd_website.aidata_detection\"] = aiData.detectionMethod;\n }\n }\n } catch (err) {\n console.warn(\"Error getting user journey data for tracking:\", err);\n }\n\n // Fallback device type\n if (base[\"fynd_website.device_type\"] === \"Unknown\") {\n const ua = navigator.userAgent;\n if (/iPad/.test(ua) || (/Android/.test(ua) && !/Mobile/.test(ua)) || /Tablet/.test(ua)) {\n base[\"fynd_website.device_type\"] = \"Tablet\";\n } else if (/Mobile|iPhone|Android|BlackBerry|Opera Mini|IEMobile|WPDesktop/.test(ua)) {\n base[\"fynd_website.device_type\"] = \"Mobile\";\n } else {\n base[\"fynd_website.device_type\"] = \"Desktop\";\n }\n }\n\n // ---------- UUID from cookie ----------\n try {\n const cookieMatch = document.cookie.match(/(?:^|;\\s*)user-id=([^;]*)/);\n base[\"fynd_website.uuid\"] = cookieMatch ? decodeURIComponent(cookieMatch[1]) : null;\n } catch (err) {\n console.warn(\"Error reading user-id cookie:\", err);\n base[\"fynd_website.uuid\"] = null;\n }\n\n return base;\n};\n\n// ---------- GA send ----------\nconst sendToGA = (eventName: string, gaProps: GATrackingProperties, additionalProps?: any): void => {\n if ((window as any).dataLayer) {\n const eventData: GTMEvent = {\n event: eventName,\n event_category: \"form_interaction\",\n event_label: eventName,\n ...gaProps,\n };\n if (additionalProps?.submitted_form) {\n eventData.submitted_form = additionalProps.submitted_form;\n }\n (window as any).dataLayer.push(eventData);\n } else {\n console.warn(\"dataLayer not available for GA tracking\");\n }\n};\n\n// ---------- Public trackEvent ----------\nconst trackEvent = (eventName: string, properties?: Partial<TrackingProperties>): void => {\n try {\n const baseProps = getPosthogTrackingProperties();\n const finalProps = properties ? { ...baseProps, ...properties } : baseProps;\n\n if ((window as any).posthog) {\n const captureProps: any = { ...finalProps };\n\n // If this is a form submission event, add person properties\n if (eventName === \"fynd_website.form.submitted\") {\n try {\n const journey = (window as any).getUserJourney?.() ||\n JSON.parse(localStorage.getItem(\"userJourney\") || \"{}\");\n\n const personProps: { [key: string]: any } = {};\n\n if (journey?.formDetails?.firstName) {\n personProps[\"name\"] = journey.formDetails.firstName;\n }\n if (journey?.formDetails?.email) {\n personProps[\"email\"] = journey.formDetails.email;\n }\n if (journey?.formDetails?.phone) {\n personProps[\"mobile\"] = journey.formDetails.phone;\n }\n\n if (Object.keys(personProps).length > 0) {\n captureProps[\"$set\"] = personProps;\n }\n } catch (err) {\n console.warn(\"Error extracting person properties:\", err);\n }\n }\n\n (window as any).posthog.capture(eventName, captureProps);\n }\n\n const gaProps = getGaTrackingProperties();\n const hasAIData =\n gaProps.aidata_context || gaProps.aidata_platform || gaProps.aidata_type || gaProps.aidata_detection;\n\n const isFormRelatedEvent =\n eventName.includes(\"form\") ||\n Object.keys(gaProps).length > 0 ||\n properties?.submitted_form ||\n !!hasAIData;\n\n if (isFormRelatedEvent) {\n sendToGA(eventName, gaProps, properties);\n }\n } catch (error) {\n console.error(\"Error tracking event:\", error);\n }\n};\n\n// ---------- Shared helpers ----------\nconst getParentFormName = (element: HTMLElement): string | null => {\n const parentForm = element.closest(\"form\") as HTMLFormElement | null;\n if (!parentForm) return null;\n return (\n parentForm.getAttribute(\"data-name\") ||\n parentForm.getAttribute(\"name\") ||\n parentForm.id ||\n null\n );\n};\n\n// ---------- Page lifecycle ----------\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const props = getPosthogTrackingProperties();\n if ((window as any).posthog) {\n (window as any).posthog.capture(\"$pageview\", props);\n }\n});\n\nwindow.addEventListener(\"load\", () => {\n trackEvent(\"fynd_website.page.loaded\");\n});\n\n// ---------- Base site interactions ----------\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const signUpButtons = document.querySelectorAll('[data-ph=\"sign-up\"]');\n const signInButtons = document.querySelectorAll('[data-ph=\"sign-in\"]');\n const scrollToFormButtons = document.querySelectorAll('[href=\"#footer-form\"]');\n const bookADemoButtons = document.querySelectorAll('[data-ph=\"book-a-demo\"]');\n const callButtons = document.querySelectorAll('[data-ph=\"call\"]');\n const submitButtons = document.querySelectorAll('[type=\"submit\"]');\n\n submitButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (this: HTMLElement): void {\n const formName = getParentFormName(this);\n setTimeout(() => {\n if (window.validationPassed === true) {\n const additionalProps = formName ? { submitted_form: formName } : {};\n trackEvent(\"fynd_website.form.submitted\", additionalProps);\n }\n }, 10);\n });\n });\n\n signUpButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", () => trackEvent(\"fynd_website.sign_up.clicked\"));\n });\n\n signInButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", () => trackEvent(\"fynd_website.sign_in.clicked\"));\n });\n\n scrollToFormButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", () => trackEvent(\"fynd_website.scroll_to_form.clicked\"));\n });\n\n bookADemoButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", () => trackEvent(\"fynd_website.book_a_demo.clicked\"));\n });\n\n callButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", () => trackEvent(\"fynd_website.call.clicked\"));\n });\n\n // Form started\n const formFields = document.querySelectorAll<HTMLElement>(\"[ph-form-field]\");\n const triggeredForms = new Set<string>();\n\n const handleFormStarted = function (this: HTMLElement): void {\n const formName = getParentFormName(this);\n const formIdentifier = formName || \"unknown-form\";\n if (!triggeredForms.has(formIdentifier)) {\n triggeredForms.add(formIdentifier);\n trackEvent(\"fynd_website.form.started\");\n }\n };\n\n formFields.forEach((field) => {\n const tagName = field.tagName.toLowerCase();\n const inputType = (field as HTMLInputElement).type?.toLowerCase();\n\n if (!(tagName === \"button\" || (tagName === \"input\" && inputType === \"submit\"))) {\n field.addEventListener(\"focus\", handleFormStarted);\n }\n if (tagName === \"button\" || (tagName === \"input\" && inputType === \"submit\")) {\n field.addEventListener(\"click\", handleFormStarted);\n } else if (tagName === \"select\") {\n field.addEventListener(\"change\", handleFormStarted);\n } else {\n field.addEventListener(\"input\", handleFormStarted);\n }\n });\n});\n\n// ---------- Expose globals ----------\nwindow.getPosthogTrackingProperties = getPosthogTrackingProperties;\nwindow.trackEvent = trackEvent;\nwindow.getGaTrackingProperties = getGaTrackingProperties;\n\n// ---------- Optional: bootstrap ad tracking here ----------\n// const AD_CONFIGS: AdConfig[] = [\n// { adPageSlug: \"/solutions/transport-management-system\", adEventExtension: \"tms\", adUTMCampaign: \"tms\", },\n// ];\n// initAdsTracking(AD_CONFIGS);\ninitGeneralAdsTracking();\n\ninitMetaTracking({\n enableAdvancedMatching: true, // pulls user data from your journey store when available\n enableSpaPageViews: true, // fires PageView on virtual navigations\n hasConsent: () => (window as any).__ad_consent === \"granted\" || true, // replace with your consent logic\n});\n\n// ---------- Exports ----------\nexport {\n getPosthogTrackingProperties,\n getGaTrackingProperties,\n trackEvent,\n getParentFormName,\n type TrackingProperties,\n type GATrackingProperties,\n type GTMEvent,\n};"],
5
+ "mappings": "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",
6
6
  "names": ["onLocationChange", "getParentFormName"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../bin/live-reload.js", "../../src/tracking/fill-form-fields.ts"],
4
- "sourcesContent": ["// Only enable live reload when running on localhost\nif (\n window.location.hostname === \"localhost\" ||\n window.location.hostname === \"127.0.0.1\"\n) {\n new EventSource(`${SERVE_ORIGIN}/esbuild`).addEventListener(\"change\", () =>\n location.reload()\n );\n} else {\n // console.log(\"Live reload disabled: not running on localhost\");\n}\n", "// formFiller.ts - Auto-fill form fields with user journey data\nimport { UserJourney, TouchPoint } from './types';\n\ntype ProductInterestConfig = {\n optionName: string;\n selectValues: string[];\n};\n\ntype solutionMappingConfig = {\n slug: string;\n selectValues: string[];\n}\n\nconst productInterestConfigs: ProductInterestConfig[] = [\n {\n \"optionName\": \"Building a website\",\n \"selectValues\": [\"Storefront\", \"Commerce\"]\n },\n {\n \"optionName\": \"Supply chain solutions\",\n \"selectValues\": [\"WMS\", \"OMS\", \"TMS\", \"Commerce\"]\n },\n {\n \"optionName\": \"Retail store solutions\",\n \"selectValues\": [\"Store OS\", \"Commerce\"]\n },\n {\n \"optionName\": \"Sell on Marketplaces\",\n \"selectValues\": [\"Konnect\", \"Commerce\"]\n },\n {\n \"optionName\": \"AI solutions\",\n \"selectValues\": [\"Kaily, Workflow builder, AI photoshoot\"]\n },\n {\n \"optionName\": \"Fashion manufacturing solution\",\n \"selectValues\": [\"GaaS\", \"DaaS\"]\n }\n];\n\nconst solutionMappingConfigs: solutionMappingConfig[] = [\n {\n \"slug\": \"/solutions/transport-management-system\",\n \"selectValues\": [\"TMS\"]\n }, {\n \"slug\": \"/solutions/storefront\",\n \"selectValues\": [\"Storefront\"]\n },\n]\n\n/**\n * Fills form input fields with user journey data based on fynd-queryparam-name attributes\n */\nfunction fillFormWithUserJourney(): void {\n try {\n // Get user journey data from session storage\n const journey: UserJourney | null = getUserJourneyData();\n\n const sourceValue = 'Inbound Form';\n const sourceDirectionValue = 'Inbound';\n\n if (!journey || journey.userJourney.length === 0) {\n //console.log('No user journey data available to fill form fields');\n return;\n }\n\n // Get first page (landing page) and last page data\n const firstPage: TouchPoint = journey.userJourney[0];\n let lastPage: TouchPoint = journey.userJourney[journey.userJourney.length - 1];\n\n // If current page is contact-us, use the previous page as last page\n if (journey.userJourney.length > 1 &&\n journey.userJourney[journey.userJourney.length - 1].page === '/contact-us') {\n lastPage = journey.userJourney[journey.userJourney.length - 2];\n }\n\n // Define the mapping of attribute values to data\n const fieldMappings: Record<string, string> = {\n // UTM parameters\n 'utm_source': firstPage.utm.source,\n 'utm_medium': firstPage.utm.medium,\n 'utm_campaign': firstPage.utm.campaign,\n 'original_source': firstPage.utm.source,\n 'original_medium': firstPage.utm.medium,\n 'original_campaign': firstPage.utm.campaign,\n\n //hubspot essential fields\n 'source': sourceValue,\n 'source_direction': sourceDirectionValue,\n\n // Journey metadata\n 'userjourney': JSON.stringify(journey.userJourney),\n 'device': journey.deviceCategory,\n 'browser': journey.browser,\n\n // Refferer and host\n 'refferer_domain': document.referrer ? new URL(document.referrer).hostname : '',\n 'host_url': window.location.hostname,\n\n //current page URL\n 'current-page-url': window.location.href,\n };\n\n // Find and fill each form field\n Object.entries(fieldMappings).forEach(([attributeValue, data]) => {\n fillFormField(attributeValue, data);\n });\n\n //console.log('Form fields filled with user journey data');\n\n } catch (error: unknown) {\n console.error('Error filling form with user journey data:', error);\n }\n}\n\n/**\n * Helper function to get user journey data from session storage\n */\nfunction getUserJourneyData(): UserJourney | null {\n try {\n const storedData: string | null = localStorage.getItem('userJourney');\n return storedData ? JSON.parse(storedData) as UserJourney : null;\n } catch (error: unknown) {\n console.error('Error getting user journey data:', error);\n return null;\n }\n}\n\n/**\n * Helper function to find and fill a specific form field\n */\nfunction fillFormField(attributeValue: string, data: string): void {\n try {\n const selector = `[fynd-queryparam-name=\"${attributeValue}\"]`;\n const elements = document.querySelectorAll(selector);\n\n if (elements.length > 0) {\n elements.forEach((element: any) => {\n element.value = data;\n\n // Trigger input event\n const inputEvent = new Event('input', { bubbles: true });\n element.dispatchEvent(inputEvent);\n\n // Trigger change event\n const changeEvent = new Event('change', { bubbles: true });\n element.dispatchEvent(changeEvent);\n });\n } else {\n // console.log(`No fields found for attribute [${attributeValue}]`);\n }\n } catch (error) {\n console.error(`Error filling field [${attributeValue}]:`, error);\n }\n}\n\n/**\n * Fill form fields based on a key-value object.\n * Looks for elements with attribute fynd-form-field=\"<key>\"\n */\nfunction fillTestFormFields(data: Record<string, string>): void {\n try {\n Object.entries(data).forEach(([fieldKey, fieldValue]) => {\n const selector = `[fynd-form-field=\"${fieldKey}\"]`;\n const elements = document.querySelectorAll(selector);\n\n if (elements.length > 0) {\n elements.forEach((element: any) => {\n element.value = fieldValue;\n\n // Dispatch input and change so frameworks react properly\n const inputEvent = new Event('input', { bubbles: true });\n element.dispatchEvent(inputEvent);\n\n const changeEvent = new Event('change', { bubbles: true });\n element.dispatchEvent(changeEvent);\n });\n }\n });\n } catch (error) {\n console.error('Error filling test form fields', error);\n }\n}\n\n/**\n * Format an array of strings into\n * \"A; B; C\" style output\n */\nfunction formatSelectValues(values: string[]): string {\n if (!Array.isArray(values)) return '';\n return values.join('; ');\n}\n\n/**\n * Returns true if current page is NOT under /solutions/\n */\nfunction shouldRunProductInterestLogic(): boolean {\n const path = window.location.pathname;\n return !path.startsWith('/solutions/');\n}\n\n/** Fills inputs based on solution mapping if on a /solutions/ page\n */\nfunction applySolutionMapping() {\n const path = window.location.pathname;\n\n const match = solutionMappingConfigs.find(cfg => cfg.slug === path);\n if (!match) return;\n\n const formatted = formatSelectValues(match.selectValues);\n\n const inputs = document.querySelectorAll('[fynd-form-field=\"product-interested-input\"]');\n\n inputs.forEach(el => {\n if (el instanceof HTMLInputElement || el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement) {\n el.value = formatted;\n } else {\n el.textContent = formatted;\n }\n });\n}\n\n/**\n * Fills all inputs with fynd-form-field=\"product-interested-input\"\n * based on the selected option in the product-interested-select field(s)\n */\nfunction setupProductInterestAutoFill(): void {\n const selectWrapper = '[fynd-wrapper-field=\"product-interested-select\"]';\n\n const selectSelector = '[fynd-form-field=\"product-interested-select\"]';\n const inputSelector = '[fynd-form-field=\"product-interested-input\"]';\n\n const selects = document.querySelectorAll<HTMLSelectElement>(selectSelector);\n const inputs = document.querySelectorAll<HTMLInputElement | HTMLTextAreaElement>(inputSelector);\n\n const selectContainers = document.querySelectorAll<HTMLElement>(selectWrapper);\n\n // If inside /solutions/... hide all these fields\n if (!shouldRunProductInterestLogic()) {\n applySolutionMapping();\n selectContainers.forEach(select => {\n select.style.display = 'none';\n });\n return;\n }\n\n // Outside solutions -> ensure they are visible\n selectContainers.forEach(select => {\n select.style.display = 'flex';\n });\n\n // No selects present, nothing else to do\n if (!selects.length) {\n return;\n }\n\n // Normal behaviour for non-solutions pages\n selects.forEach(select => {\n select.addEventListener('change', () => {\n const selectedValue = select.value;\n\n const config = productInterestConfigs.find(\n item => item.optionName === selectedValue\n );\n\n const valueToFill = config\n ? formatSelectValues(config.selectValues)\n : '';\n\n inputs.forEach(input => {\n input.value = valueToFill;\n\n const inputEvent = new Event('input', { bubbles: true });\n input.dispatchEvent(inputEvent);\n\n const changeEvent = new Event('change', { bubbles: true });\n input.dispatchEvent(changeEvent);\n });\n });\n });\n}\n\n// Execute the function on DOM load with 500ms delay\ndocument.addEventListener('DOMContentLoaded', (): void => {\n setTimeout(() => {\n fillFormWithUserJourney();\n setupProductInterestAutoFill()\n\n // For testing purposes, fill other fields as well\n const testData = {\n firstName: 'Kobe',\n lastName: 'Brant',\n email: 'kobe@example.com',\n phone: '9999999999',\n message: 'Hello, this is a test message!',\n };\n fillTestFormFields(testData);\n // End of testing code\n\n\n }, 500);\n});\n\n// Also execute immediately if DOM is already loaded\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', (): void => {\n setTimeout(() => {\n fillFormWithUserJourney();\n }, 500);\n });\n} else {\n setTimeout(() => {\n fillFormWithUserJourney();\n }, 500);\n}\n\n// Make function globally accessible\ndeclare global {\n interface Window {\n fillFormWithUserJourney: () => void;\n }\n}\n\n// Attach function to window object for global access\nwindow.fillFormWithUserJourney = fillFormWithUserJourney;\n\n// Export function for module usage\nexport { fillFormWithUserJourney };"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Only enable live reload when running on localhost\nif (\n window.location.hostname === \"localhost\" ||\n window.location.hostname === \"127.0.0.1\"\n) {\n new EventSource(`${SERVE_ORIGIN}/esbuild`).addEventListener(\"change\", () =>\n location.reload()\n );\n} else {\n // console.log(\"Live reload disabled: not running on localhost\");\n}\n", "// formFiller.ts - Auto-fill form fields with user journey data\nimport { UserJourney, TouchPoint } from './types';\n\ntype ProductInterestConfig = {\n optionName: string;\n selectValues: string[];\n};\n\ntype solutionMappingConfig = {\n slug: string;\n selectValues: string[];\n}\n\nconst productInterestConfigs: ProductInterestConfig[] = [\n {\n \"optionName\": \"Building a website\",\n \"selectValues\": [\"Storefront\", \"Commerce\"]\n },\n {\n \"optionName\": \"Supply chain solutions\",\n \"selectValues\": [\"WMS\", \"OMS\", \"TMS\", \"Commerce\"]\n },\n {\n \"optionName\": \"Retail store solutions\",\n \"selectValues\": [\"Store OS\", \"Commerce\"]\n },\n {\n \"optionName\": \"Sell on Marketplaces\",\n \"selectValues\": [\"Konnect\", \"Commerce\"]\n },\n {\n \"optionName\": \"AI solutions\",\n \"selectValues\": [\"Kaily, Workflow builder, AI photoshoot\"]\n },\n {\n \"optionName\": \"Fashion manufacturing solution\",\n \"selectValues\": [\"GaaS\", \"DaaS\"]\n }\n];\n\nconst solutionMappingConfigs: solutionMappingConfig[] = [\n {\n \"slug\": \"/solutions/transport-management-system\",\n \"selectValues\": [\"TMS\"]\n }, {\n \"slug\": \"/solutions/storefront\",\n \"selectValues\": [\"Storefront\"]\n },\n]\n\n/**\n * Fills form input fields with user journey data based on fynd-queryparam-name attributes\n */\nfunction fillFormWithUserJourney(): void {\n try {\n // Get user journey data from session storage\n const journey: UserJourney | null = getUserJourneyData();\n\n const sourceValue = 'Inbound Form';\n const sourceDirectionValue = 'Inbound';\n const contactTypeValue = 'Prospect';\n\n if (!journey || journey.userJourney.length === 0) {\n //console.log('No user journey data available to fill form fields');\n return;\n }\n\n // Get first page (landing page) and last page data\n const firstPage: TouchPoint = journey.userJourney[0];\n let lastPage: TouchPoint = journey.userJourney[journey.userJourney.length - 1];\n\n // If current page is contact-us, use the previous page as last page\n if (journey.userJourney.length > 1 &&\n journey.userJourney[journey.userJourney.length - 1].page === '/contact-us') {\n lastPage = journey.userJourney[journey.userJourney.length - 2];\n }\n\n // Define the mapping of attribute values to data\n const fieldMappings: Record<string, string> = {\n // UTM parameters\n 'utm_source': firstPage.utm.source,\n 'utm_medium': firstPage.utm.medium,\n 'utm_campaign': firstPage.utm.campaign,\n\n //hubspot essential fields\n 'source': sourceValue,\n 'source_direction': sourceDirectionValue,\n 'contact_type': contactTypeValue,\n\n\n // Journey metadata\n 'userjourney': JSON.stringify(journey.userJourney),\n 'device': journey.deviceCategory,\n 'browser': journey.browser,\n\n // Refferer and host\n 'refferer_domain': document.referrer ? new URL(document.referrer).hostname : '',\n 'host_url': window.location.hostname,\n\n //current page URL\n 'current-page-url': window.location.href,\n };\n\n // Find and fill each form field\n Object.entries(fieldMappings).forEach(([attributeValue, data]) => {\n fillFormField(attributeValue, data);\n });\n\n //console.log('Form fields filled with user journey data');\n\n } catch (error: unknown) {\n console.error('Error filling form with user journey data:', error);\n }\n}\n\n/**\n * Helper function to get user journey data from session storage\n */\nfunction getUserJourneyData(): UserJourney | null {\n try {\n const storedData: string | null = localStorage.getItem('userJourney');\n return storedData ? JSON.parse(storedData) as UserJourney : null;\n } catch (error: unknown) {\n console.error('Error getting user journey data:', error);\n return null;\n }\n}\n\n/**\n * Helper function to find and fill a specific form field\n */\nfunction fillFormField(attributeValue: string, data: string): void {\n try {\n const selector = `[fynd-queryparam-name=\"${attributeValue}\"]`;\n const elements = document.querySelectorAll(selector);\n\n if (elements.length > 0) {\n elements.forEach((element: any) => {\n element.value = data;\n\n // Trigger input event\n const inputEvent = new Event('input', { bubbles: true });\n element.dispatchEvent(inputEvent);\n\n // Trigger change event\n const changeEvent = new Event('change', { bubbles: true });\n element.dispatchEvent(changeEvent);\n });\n } else {\n // console.log(`No fields found for attribute [${attributeValue}]`);\n }\n } catch (error) {\n console.error(`Error filling field [${attributeValue}]:`, error);\n }\n}\n\n/**\n * Fill form fields based on a key-value object.\n * Looks for elements with attribute fynd-form-field=\"<key>\"\n */\nfunction fillTestFormFields(data: Record<string, string>): void {\n try {\n Object.entries(data).forEach(([fieldKey, fieldValue]) => {\n const selector = `[fynd-form-field=\"${fieldKey}\"]`;\n const elements = document.querySelectorAll(selector);\n\n if (elements.length > 0) {\n elements.forEach((element: any) => {\n element.value = fieldValue;\n\n // Dispatch input and change so frameworks react properly\n const inputEvent = new Event('input', { bubbles: true });\n element.dispatchEvent(inputEvent);\n\n const changeEvent = new Event('change', { bubbles: true });\n element.dispatchEvent(changeEvent);\n });\n }\n });\n } catch (error) {\n console.error('Error filling test form fields', error);\n }\n}\n\n/**\n * Format an array of strings into\n * \"A; B; C\" style output\n */\nfunction formatSelectValues(values: string[]): string {\n if (!Array.isArray(values)) return '';\n return values.join('; ');\n}\n\n/**\n * Returns true if current page is NOT under /solutions/\n */\nfunction shouldRunProductInterestLogic(): boolean {\n const path = window.location.pathname;\n return !path.startsWith('/solutions/');\n}\n\n/** Fills inputs based on solution mapping if on a /solutions/ page\n */\nfunction applySolutionMapping() {\n const path = window.location.pathname;\n\n const match = solutionMappingConfigs.find(cfg => cfg.slug === path);\n if (!match) return;\n\n const formatted = formatSelectValues(match.selectValues);\n\n const inputs = document.querySelectorAll('[fynd-form-field=\"product-interested-input\"]');\n\n inputs.forEach(el => {\n if (el instanceof HTMLInputElement || el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement) {\n el.value = formatted;\n } else {\n el.textContent = formatted;\n }\n });\n}\n\n/**\n * Fills all inputs with fynd-form-field=\"product-interested-input\"\n * based on the selected option in the product-interested-select field(s)\n */\nfunction setupProductInterestAutoFill(): void {\n const selectWrapper = '[fynd-wrapper-field=\"product-interested-select\"]';\n\n const selectSelector = '[fynd-form-field=\"product-interested-select\"]';\n const inputSelector = '[fynd-form-field=\"product-interested-input\"]';\n\n const selects = document.querySelectorAll<HTMLSelectElement>(selectSelector);\n const inputs = document.querySelectorAll<HTMLInputElement | HTMLTextAreaElement>(inputSelector);\n\n const selectContainers = document.querySelectorAll<HTMLElement>(selectWrapper);\n\n // If inside /solutions/... hide all these fields\n if (!shouldRunProductInterestLogic()) {\n applySolutionMapping();\n selectContainers.forEach(select => {\n select.style.display = 'none';\n });\n return;\n }\n\n // Outside solutions -> ensure they are visible\n selectContainers.forEach(select => {\n select.style.display = 'flex';\n });\n\n // No selects present, nothing else to do\n if (!selects.length) {\n return;\n }\n\n // Normal behaviour for non-solutions pages\n selects.forEach(select => {\n select.addEventListener('change', () => {\n const selectedValue = select.value;\n\n const config = productInterestConfigs.find(\n item => item.optionName === selectedValue\n );\n\n const valueToFill = config\n ? formatSelectValues(config.selectValues)\n : '';\n\n inputs.forEach(input => {\n input.value = valueToFill;\n\n const inputEvent = new Event('input', { bubbles: true });\n input.dispatchEvent(inputEvent);\n\n const changeEvent = new Event('change', { bubbles: true });\n input.dispatchEvent(changeEvent);\n });\n });\n });\n}\n\n// Execute the function on DOM load with 500ms delay\ndocument.addEventListener('DOMContentLoaded', (): void => {\n setTimeout(() => {\n fillFormWithUserJourney();\n setupProductInterestAutoFill();\n // // For testing purposes, fill other fields as well\n // const testData = {\n // firstName: 'Kobe',\n // lastName: 'Brant',\n // email: 'kobe@example.com',\n // phone: '9999999999',\n // message: 'Hello, this is a test message!',\n // };\n // fillTestFormFields(testData);\n // // End of testing code\n }, 500);\n});\n\n// Also execute immediately if DOM is already loaded\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', (): void => {\n setTimeout(() => {\n fillFormWithUserJourney();\n }, 500);\n });\n} else {\n setTimeout(() => {\n fillFormWithUserJourney();\n }, 500);\n}\n\n// Make function globally accessible\ndeclare global {\n interface Window {\n fillFormWithUserJourney: () => void;\n }\n}\n\n// Attach function to window object for global access\nwindow.fillFormWithUserJourney = fillFormWithUserJourney;\n\n// Export function for module usage\nexport { fillFormWithUserJourney };"],
5
+ "mappings": ";;;AACA,MACE,OAAO,SAAS,aAAa,eAC7B,OAAO,SAAS,aAAa,aAC7B;AACA,QAAI,YAAY,GAAG,uBAAY,UAAU,EAAE;AAAA,MAAiB;AAAA,MAAU,MACpE,SAAS,OAAO;AAAA,IAClB;AAAA,EACF,OAAO;AAAA,EAEP;;;ACGA,MAAM,yBAAkD;AAAA,IACpD;AAAA,MACI,cAAc;AAAA,MACd,gBAAgB,CAAC,cAAc,UAAU;AAAA,IAC7C;AAAA,IACA;AAAA,MACI,cAAc;AAAA,MACd,gBAAgB,CAAC,OAAO,OAAO,OAAO,UAAU;AAAA,IACpD;AAAA,IACA;AAAA,MACI,cAAc;AAAA,MACd,gBAAgB,CAAC,YAAY,UAAU;AAAA,IAC3C;AAAA,IACA;AAAA,MACI,cAAc;AAAA,MACd,gBAAgB,CAAC,WAAW,UAAU;AAAA,IAC1C;AAAA,IACA;AAAA,MACI,cAAc;AAAA,MACd,gBAAgB,CAAC,wCAAwC;AAAA,IAC7D;AAAA,IACA;AAAA,MACI,cAAc;AAAA,MACd,gBAAgB,CAAC,QAAQ,MAAM;AAAA,IACnC;AAAA,EACJ;AAEA,MAAM,yBAAkD;AAAA,IACpD;AAAA,MACI,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK;AAAA,IAC1B;AAAA,IAAG;AAAA,MACC,QAAQ;AAAA,MACR,gBAAgB,CAAC,YAAY;AAAA,IACjC;AAAA,EACJ;AAKA,WAAS,0BAAgC;AACrC,QAAI;AAEA,YAAM,UAA8B,mBAAmB;AAEvD,YAAM,cAAc;AACpB,YAAM,uBAAuB;AAC7B,YAAM,mBAAmB;AAEzB,UAAI,CAAC,WAAW,QAAQ,YAAY,WAAW,GAAG;AAE9C;AAAA,MACJ;AAGA,YAAM,YAAwB,QAAQ,YAAY,CAAC;AACnD,UAAI,WAAuB,QAAQ,YAAY,QAAQ,YAAY,SAAS,CAAC;AAG7E,UAAI,QAAQ,YAAY,SAAS,KAC7B,QAAQ,YAAY,QAAQ,YAAY,SAAS,CAAC,EAAE,SAAS,eAAe;AAC5E,mBAAW,QAAQ,YAAY,QAAQ,YAAY,SAAS,CAAC;AAAA,MACjE;AAGA,YAAM,gBAAwC;AAAA;AAAA,QAE1C,cAAc,UAAU,IAAI;AAAA,QAC5B,cAAc,UAAU,IAAI;AAAA,QAC5B,gBAAgB,UAAU,IAAI;AAAA;AAAA,QAG9B,UAAU;AAAA,QACV,oBAAoB;AAAA,QACpB,gBAAgB;AAAA;AAAA,QAIhB,eAAe,KAAK,UAAU,QAAQ,WAAW;AAAA,QACjD,UAAU,QAAQ;AAAA,QAClB,WAAW,QAAQ;AAAA;AAAA,QAGnB,mBAAmB,SAAS,WAAW,IAAI,IAAI,SAAS,QAAQ,EAAE,WAAW;AAAA,QAC7E,YAAY,OAAO,SAAS;AAAA;AAAA,QAG5B,oBAAoB,OAAO,SAAS;AAAA,MACxC;AAGA,aAAO,QAAQ,aAAa,EAAE,QAAQ,CAAC,CAAC,gBAAgB,IAAI,MAAM;AAC9D,sBAAc,gBAAgB,IAAI;AAAA,MACtC,CAAC;AAAA,IAIL,SAAS,OAAgB;AACrB,cAAQ,MAAM,8CAA8C,KAAK;AAAA,IACrE;AAAA,EACJ;AAKA,WAAS,qBAAyC;AAC9C,QAAI;AACA,YAAM,aAA4B,aAAa,QAAQ,aAAa;AACpE,aAAO,aAAa,KAAK,MAAM,UAAU,IAAmB;AAAA,IAChE,SAAS,OAAgB;AACrB,cAAQ,MAAM,oCAAoC,KAAK;AACvD,aAAO;AAAA,IACX;AAAA,EACJ;AAKA,WAAS,cAAc,gBAAwB,MAAoB;AAC/D,QAAI;AACA,YAAM,WAAW,0BAA0B,cAAc;AACzD,YAAM,WAAW,SAAS,iBAAiB,QAAQ;AAEnD,UAAI,SAAS,SAAS,GAAG;AACrB,iBAAS,QAAQ,CAAC,YAAiB;AAC/B,kBAAQ,QAAQ;AAGhB,gBAAM,aAAa,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC;AACvD,kBAAQ,cAAc,UAAU;AAGhC,gBAAM,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC;AACzD,kBAAQ,cAAc,WAAW;AAAA,QACrC,CAAC;AAAA,MACL,OAAO;AAAA,MAEP;AAAA,IACJ,SAAS,OAAO;AACZ,cAAQ,MAAM,wBAAwB,cAAc,MAAM,KAAK;AAAA,IACnE;AAAA,EACJ;AAkCA,WAAS,mBAAmB,QAA0B;AAClD,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO;AACnC,WAAO,OAAO,KAAK,IAAI;AAAA,EAC3B;AAKA,WAAS,gCAAyC;AAC9C,UAAM,OAAO,OAAO,SAAS;AAC7B,WAAO,CAAC,KAAK,WAAW,aAAa;AAAA,EACzC;AAIA,WAAS,uBAAuB;AAC5B,UAAM,OAAO,OAAO,SAAS;AAE7B,UAAM,QAAQ,uBAAuB,KAAK,SAAO,IAAI,SAAS,IAAI;AAClE,QAAI,CAAC,MAAO;AAEZ,UAAM,YAAY,mBAAmB,MAAM,YAAY;AAEvD,UAAM,SAAS,SAAS,iBAAiB,8CAA8C;AAEvF,WAAO,QAAQ,QAAM;AACjB,UAAI,cAAc,oBAAoB,cAAc,qBAAqB,cAAc,qBAAqB;AACxG,WAAG,QAAQ;AAAA,MACf,OAAO;AACH,WAAG,cAAc;AAAA,MACrB;AAAA,IACJ,CAAC;AAAA,EACL;AAMA,WAAS,+BAAqC;AAC1C,UAAM,gBAAgB;AAEtB,UAAM,iBAAiB;AACvB,UAAM,gBAAgB;AAEtB,UAAM,UAAU,SAAS,iBAAoC,cAAc;AAC3E,UAAM,SAAS,SAAS,iBAAyD,aAAa;AAE9F,UAAM,mBAAmB,SAAS,iBAA8B,aAAa;AAG7E,QAAI,CAAC,8BAA8B,GAAG;AAClC,2BAAqB;AACrB,uBAAiB,QAAQ,YAAU;AAC/B,eAAO,MAAM,UAAU;AAAA,MAC3B,CAAC;AACD;AAAA,IACJ;AAGA,qBAAiB,QAAQ,YAAU;AAC/B,aAAO,MAAM,UAAU;AAAA,IAC3B,CAAC;AAGD,QAAI,CAAC,QAAQ,QAAQ;AACjB;AAAA,IACJ;AAGA,YAAQ,QAAQ,YAAU;AACtB,aAAO,iBAAiB,UAAU,MAAM;AACpC,cAAM,gBAAgB,OAAO;AAE7B,cAAM,SAAS,uBAAuB;AAAA,UAClC,UAAQ,KAAK,eAAe;AAAA,QAChC;AAEA,cAAM,cAAc,SACd,mBAAmB,OAAO,YAAY,IACtC;AAEN,eAAO,QAAQ,WAAS;AACpB,gBAAM,QAAQ;AAEd,gBAAM,aAAa,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC;AACvD,gBAAM,cAAc,UAAU;AAE9B,gBAAM,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC;AACzD,gBAAM,cAAc,WAAW;AAAA,QACnC,CAAC;AAAA,MACL,CAAC;AAAA,IACL,CAAC;AAAA,EACL;AAGA,WAAS,iBAAiB,oBAAoB,MAAY;AACtD,eAAW,MAAM;AACb,8BAAwB;AACxB,mCAA6B;AAAA,IAWjC,GAAG,GAAG;AAAA,EACV,CAAC;AAGD,MAAI,SAAS,eAAe,WAAW;AACnC,aAAS,iBAAiB,oBAAoB,MAAY;AACtD,iBAAW,MAAM;AACb,gCAAwB;AAAA,MAC5B,GAAG,GAAG;AAAA,IACV,CAAC;AAAA,EACL,OAAO;AACH,eAAW,MAAM;AACb,8BAAwB;AAAA,IAC5B,GAAG,GAAG;AAAA,EACV;AAUA,SAAO,0BAA0B;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fynd-design-engineering/fynd-one-v2",
3
- "version": "3.4.28",
3
+ "version": "3.4.29",
4
4
  "description": "Updated CDN for fynd.com",
5
5
  "homepage": "https://github.com/Fynd-Design-Engineering/Fynd-Utils/blob/main/README.md",
6
6
  "license": "ISC",