{"version":3,"file":"Tracking.CDOutCph.mjs","names":["useRef"],"sources":["https:/framerusercontent.com/modules/gQvhIMPZbG0atNKZMM1i/Ewl02tbK46vn6fvUKhe4/Tracking.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{useTracking}from\"framer\";import{forwardRef,useEffect,useRef}from\"react\";const UTM_KEYS=[\"utm_source\",\"utm_medium\",\"utm_campaign\",\"utm_term\",\"utm_content\",\"gclid\",\"fbclid\",\"li_fat_id\",\"ttclid\"];const STORE_KEY=\"swavy_attr\";function captureUTMs(){if(typeof window===\"undefined\")return;const params=new URLSearchParams(window.location.search);const found={};UTM_KEYS.forEach(k=>{const v=params.get(k);if(v)found[k]=v;});if(!Object.keys(found).length)return;try{const existing=JSON.parse(sessionStorage.getItem(STORE_KEY)||\"{}\");sessionStorage.setItem(STORE_KEY,JSON.stringify({...found,...existing}));}catch{}}function getStoredUTMs(){if(typeof window===\"undefined\")return{};try{return JSON.parse(sessionStorage.getItem(STORE_KEY)||\"{}\");}catch{return{};}}function buildUrlWithUTMs(destination){try{const url=new URL(destination,window.location.origin);const utms=getStoredUTMs();if(!Object.keys(utms).length)return null;Object.entries(utms).forEach(([k,v])=>{if(!url.searchParams.has(k))url.searchParams.set(k,v);});return url.toString();}catch{return null;}}function trackClick(Component,trackingId){return /*#__PURE__*/forwardRef((props,ref)=>{const track=useTracking();const wrapperRef=useRef(null);useEffect(()=>{captureUTMs();},[]);useEffect(()=>{const el=wrapperRef.current;if(!el)return;const applyHref=()=>{const anchors=[];if(el.tagName===\"A\")anchors.push(el);el.querySelectorAll(\"a\").forEach(a=>anchors.push(a));anchors.forEach(a=>{const current=a.getAttribute(\"href\");if(!current)return;const rewritten=buildUrlWithUTMs(current);if(rewritten&&rewritten!==current)a.href=rewritten;});};applyHref();const obs=new MutationObserver(applyHref);obs.observe(el,{attributes:true,subtree:true,attributeFilter:[\"href\"]});return()=>obs.disconnect();},[]);const setRef=node=>{wrapperRef.current=node;if(typeof ref===\"function\")ref(node);else if(ref)ref.current=node;};const fireAnalytics=()=>{captureUTMs();track(trackingId)// still emits framer:click for Framer's own analytics\n;const w=window;// Fire GA directly — don't depend on the framer:click forwarder\nif(w.gtag){w.gtag(\"event\",trackingId,{event_category:\"cta\",event_label:trackingId});}// Fire PostHog directly too while we're at it\nif(w.posthog){w.posthog.capture(trackingId);}if(w.fbq){w.fbq(\"track\",\"Lead\",{content_name:trackingId,content_category:\"cta\"});}};return /*#__PURE__*/_jsx(Component,{ref:setRef,...props,onClick:e=>{fireAnalytics();if(e.metaKey||e.ctrlKey||e.shiftKey||e.button===1){return;}const anchor=e.target?.closest?.(\"a\")||(wrapperRef.current?.tagName===\"A\"?wrapperRef.current:null)||wrapperRef.current?.querySelector?.(\"a\");const href=anchor?.getAttribute?.(\"href\");if(!href){props.onClick?.(e);return;}const rewritten=buildUrlWithUTMs(href);if(!rewritten){props.onClick?.(e);return;}e.preventDefault?.();e.stopPropagation?.();window.location.href=rewritten;}});});}// function trackClick(Component: any, trackingId: string) {\n//     return forwardRef((props: any, ref: any) => {\n//         const track = useTracking()\n//         const wrapperRef = useRef<HTMLElement | null>(null)\n//         useEffect(() => {\n//             captureUTMs()\n//         }, [])\n//         // Find the destination from the rendered <a> and rewrite its href so\n//         // cmd-click, middle-click, and right-click \"Copy link\" all get UTMs.\n//         useEffect(() => {\n//             const el = wrapperRef.current\n//             if (!el) return\n//             const applyHref = () => {\n//                 const anchors: HTMLAnchorElement[] = []\n//                 if (el.tagName === \"A\") anchors.push(el as HTMLAnchorElement)\n//                 el.querySelectorAll(\"a\").forEach((a) => anchors.push(a))\n//                 anchors.forEach((a) => {\n//                     // Strip any UTMs we previously appended so we don't double-append\n//                     const current = a.getAttribute(\"href\")\n//                     if (!current) return\n//                     const rewritten = buildUrlWithUTMs(current)\n//                     if (rewritten && rewritten !== current) a.href = rewritten\n//                 })\n//             }\n//             applyHref()\n//             const obs = new MutationObserver(applyHref)\n//             obs.observe(el, {\n//                 attributes: true,\n//                 subtree: true,\n//                 attributeFilter: [\"href\"],\n//             })\n//             return () => obs.disconnect()\n//         }, [])\n//         const setRef = (node: HTMLElement | null) => {\n//             wrapperRef.current = node\n//             if (typeof ref === \"function\") ref(node)\n//             else if (ref) ref.current = node\n//         }\n//         return (\n//             <Component\n//                 ref={setRef}\n//                 {...props}\n//                 onClick={(e: any) => {\n//                     captureUTMs()\n//                     track(trackingId)\n//                     // Modifier keys → let the browser use the rewritten href natively\n//                     if (\n//                         e.metaKey ||\n//                         e.ctrlKey ||\n//                         e.shiftKey ||\n//                         e.button === 1\n//                     ) {\n//                         return\n//                     }\n//                     // Find the destination on the anchor we clicked\n//                     const anchor =\n//                         (e.target as HTMLElement)?.closest?.(\"a\") ||\n//                         (wrapperRef.current?.tagName === \"A\"\n//                             ? wrapperRef.current\n//                             : null) ||\n//                         wrapperRef.current?.querySelector?.(\"a\")\n//                     const href = anchor?.getAttribute?.(\"href\")\n//                     if (!href) {\n//                         props.onClick?.(e)\n//                         return\n//                     }\n//                     const rewritten = buildUrlWithUTMs(href)\n//                     if (!rewritten) {\n//                         props.onClick?.(e)\n//                         return\n//                     }\n//                     // Bypass Framer's SPA router so UTMs make it into the URL\n//                     e.preventDefault?.()\n//                     e.stopPropagation?.()\n//                     window.location.href = rewritten\n//                 }}\n//             />\n//         )\n//     })\n// }\nexport function withSignUpCTA(Component){return trackClick(Component,\"sign-up-cta\");}export function withBookDemoCTA(Component){return trackClick(Component,\"book-demo-cta\");}// import { useTracking } from \"framer\"\n// import { ComponentType, forwardRef, useEffect, useRef } from \"react\"\n// const UTM_KEYS = [\n//     \"utm_source\",\n//     \"utm_medium\",\n//     \"utm_campaign\",\n//     \"utm_term\",\n//     \"utm_content\",\n//     \"gclid\",\n//     \"fbclid\",\n//     \"li_fat_id\",\n//     \"ttclid\",\n// ]\n// const STORE_KEY = \"swavy_attr\"\n// function captureUTMs() {\n//     if (typeof window === \"undefined\") return\n//     const params = new URLSearchParams(window.location.search)\n//     const found: Record<string, string> = {}\n//     UTM_KEYS.forEach((k) => {\n//         const v = params.get(k)\n//         if (v) found[k] = v\n//     })\n//     if (!Object.keys(found).length) return\n//     try {\n//         const existing = JSON.parse(sessionStorage.getItem(STORE_KEY) || \"{}\")\n//         sessionStorage.setItem(\n//             STORE_KEY,\n//             JSON.stringify({ ...found, ...existing })\n//         )\n//     } catch {}\n// }\n// function getStoredUTMs(): Record<string, string> {\n//     if (typeof window === \"undefined\") return {}\n//     try {\n//         return JSON.parse(sessionStorage.getItem(STORE_KEY) || \"{}\")\n//     } catch {\n//         return {}\n//     }\n// }\n// function buildUrlWithUTMs(destination: string): string {\n//     const url = new URL(destination, window.location.origin)\n//     const utms = getStoredUTMs()\n//     Object.entries(utms).forEach(([k, v]) => {\n//         if (!url.searchParams.has(k)) url.searchParams.set(k, v as string)\n//     })\n//     return url.toString()\n// }\n// function trackClick(Component: any, trackingId: string, destination: string) {\n//     return forwardRef((props: any, ref: any) => {\n//         const track = useTracking()\n//         const wrapperRef = useRef<HTMLElement | null>(null)\n//         useEffect(() => {\n//             captureUTMs()\n//         }, [])\n//         // Rewrite the href on the rendered <a> so cmd/ctrl-click, middle-click,\n//         // right-click \"Open in new tab\", and \"Copy link\" all get UTMs too.\n//         useEffect(() => {\n//             const el = wrapperRef.current\n//             if (!el) return\n//             const applyHref = () => {\n//                 const utms = getStoredUTMs()\n//                 if (!Object.keys(utms).length) return\n//                 const targetUrl = buildUrlWithUTMs(destination)\n//                 // The override wraps a Framer component whose root is (or contains) an <a>.\n//                 const anchors: HTMLAnchorElement[] = []\n//                 if (el.tagName === \"A\") anchors.push(el as HTMLAnchorElement)\n//                 el.querySelectorAll(\"a\").forEach((a) => anchors.push(a))\n//                 anchors.forEach((a) => {\n//                     a.href = targetUrl\n//                 })\n//             }\n//             applyHref()\n//             // Framer may re-render and reset href — keep watching.\n//             const obs = new MutationObserver(applyHref)\n//             obs.observe(el, {\n//                 attributes: true,\n//                 subtree: true,\n//                 attributeFilter: [\"href\"],\n//             })\n//             return () => obs.disconnect()\n//         }, [])\n//         const setRef = (node: HTMLElement | null) => {\n//             wrapperRef.current = node\n//             if (typeof ref === \"function\") ref(node)\n//             else if (ref) ref.current = node\n//         }\n//         return (\n//             <Component\n//                 ref={setRef}\n//                 {...props}\n//                 onClick={(e: any) => {\n//                     captureUTMs()\n//                     track(trackingId)\n//                     const utms = getStoredUTMs()\n//                     if (!Object.keys(utms).length) {\n//                         props.onClick?.(e)\n//                         return\n//                     }\n//                     // Let modifier-key clicks fall through to native anchor behavior\n//                     // (cmd/ctrl/shift/middle-click) — our href rewrite handles those.\n//                     if (\n//                         e.metaKey ||\n//                         e.ctrlKey ||\n//                         e.shiftKey ||\n//                         e.button === 1\n//                     ) {\n//                         return\n//                     }\n//                     // Normal click: bypass Framer's SPA router so UTMs make it into the URL.\n//                     e.preventDefault?.()\n//                     e.stopPropagation?.()\n//                     window.location.href = buildUrlWithUTMs(destination)\n//                 }}\n//             />\n//         )\n//     })\n// }\n// export function withSignUpCTA(Component): ComponentType {\n//     return trackClick(\n//         Component,\n//         \"sign-up-cta\",\n//         \"https://web.swavy.app/auth/signup\"\n//     )\n// }\n// export function withBookDemoCTA(Component): ComponentType {\n//     return trackClick(Component, \"book-demo-cta\", \"https://meetings-eu1.hubspot.com/swavy/demo?utm_medium=Website\")\n// }\n// import { useTracking } from \"framer\"\n// import { ComponentType, forwardRef } from \"react\"\n// // Shared logic — NOT exported, so Framer ignores it\n// function trackClick(Component: any, trackingId: string) {\n//     return forwardRef((props: any, ref) => {\n//         const track = useTracking()\n//         return (\n//             <Component\n//                 ref={ref}\n//                 {...props}\n//                 onClick={(e: any) => {\n//                     track(trackingId)\n//                     props.onClick?.(e)\n//                 }}\n//             />\n//         )\n//     })\n// }\n// // One explicit export per CTA — these show up in the Override dropdown\n// export function withSignUpCTA(Component): ComponentType {\n//     return trackClick(Component, \"sign-up-cta\")\n// }\n// export function withBookDemoCTA(Component): ComponentType {\n//     return trackClick(Component, \"book-demo-cta\")\n// }\n\nexport const __FramerMetadata__ = {\"exports\":{\"withSignUpCTA\":{\"type\":\"reactHoc\",\"name\":\"withSignUpCTA\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withBookDemoCTA\":{\"type\":\"reactHoc\",\"name\":\"withBookDemoCTA\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Tracking.map"],"mappings":"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"}