{"version":3,"file":"shared-lib.BVsyrJQf.mjs","names":[],"sources":["https:/framerusercontent.com/modules/9fb3fifHivgI1PWEgd41/LvB7T1Pj18o7YsL4lAOr/siteMetadata.js"],"sourcesContent":["// Generated by Framer (94ad37d)\nexport default function metadata(params,activeLocale){return{customHTMLBodyEnd:'<script>\\n  // Disable right-click anywhere on the page\\n  document.addEventListener(\\'contextmenu\\', event => event.preventDefault());\\n</script>\\n<script>\\n  (function () {\\n    // Decide which keys we treat as tracking\\n    function isTrackingKey(key) {\\n      return (\\n        key.startsWith(\"utm_\") ||\\n        key === \"fpr\" ||          // FirstPromoter\\n        key === \"gclid\" ||\\n        key === \"fbclid\"\\n      );\\n    }\\n\\n    const currentUrl = new URL(window.location.href);\\n    const currentParams = currentUrl.searchParams;\\n\\n    // --- 1. CAPTURE UTMs WHEN THEY EXIST ON THE URL ---\\n    const currentHasTracking = Array.from(currentParams.keys()).some(isTrackingKey);\\n\\n    if (currentHasTracking) {\\n      // Store the full query string, including \"?\"\\n      const search = window.location.search;\\n      localStorage.setItem(\"utm_params\", search);\\n\\n      // Store fpr separately as backup / for other tools\\n      const fpr = currentParams.get(\"fpr\");\\n      if (fpr) {\\n        localStorage.setItem(\"fpr\", fpr);\\n        document.cookie =\\n          \"fpr=\" +\\n          encodeURIComponent(fpr) +\\n          \";domain=.centerfy.ai;path=/;max-age=31536000\";\\n      }\\n    }\\n\\n    // --- 2. RESTORE UTMs ON PAGES THAT DON\\'T HAVE THEM ---\\n    const storedSearch = localStorage.getItem(\"utm_params\");\\n    if (storedSearch) {\\n      const storedParams = new URLSearchParams(storedSearch);\\n      const pageHasTracking = Array.from(currentParams.keys()).some(isTrackingKey);\\n\\n      if (!pageHasTracking) {\\n        // Merge stored tracking params into the current URL (keep non-tracking params)\\n        storedParams.forEach((value, key) => {\\n          if (isTrackingKey(key) && !currentParams.get(key)) {\\n            currentParams.set(key, value);\\n          }\\n        });\\n\\n        const newSearch = \"?\" + currentParams.toString();\\n        if (newSearch !== window.location.search) {\\n          currentUrl.search = newSearch;\\n          window.history.replaceState({}, \"\", currentUrl.toString());\\n        }\\n      }\\n    }\\n\\n    // --- 3. APPEND UTMs TO INTERNAL LINKS SITE-WIDE ---\\n    const utmSearch = localStorage.getItem(\"utm_params\");\\n    if (!utmSearch) return;\\n\\n    const utmParams = new URLSearchParams(utmSearch);\\n\\n    document.addEventListener(\"click\", function (event) {\\n      const anchor = event.target.closest(\"a\");\\n      if (!anchor) return;\\n\\n      const href = anchor.getAttribute(\"href\");\\n      if (!href) return;\\n\\n      // Ignore hash-only / mailto / tel links here, we handle special hash case below\\n      if (\\n        href.startsWith(\"mailto:\") ||\\n        href.startsWith(\"tel:\")\\n      ) {\\n        return;\\n      }\\n\\n      const targetUrl = new URL(href, window.location.origin);\\n\\n      // Only modify internal links\\n      if (targetUrl.origin !== window.location.origin) {\\n        return;\\n      }\\n\\n      // SPECIAL CASE: links to home pricing section (/#pricing or https://centerfy.ai/#pricing)\\n      const isHomePricing =\\n        targetUrl.pathname === \"/\" && targetUrl.hash === \"#pricing\";\\n\\n      if (isHomePricing) {\\n        event.preventDefault();\\n\\n        // Start from current stored utms\\n        const merged = new URL(window.location.origin + \"/\");\\n        const mergedParams = new URLSearchParams(utmParams.toString());\\n\\n        // If current URL has non-tracking params you want to keep, merge them too\\n        const currentParamsNow = new URLSearchParams(window.location.search);\\n        currentParamsNow.forEach((value, key) => {\\n          if (!isTrackingKey(key)) {\\n            mergedParams.set(key, value);\\n          }\\n        });\\n\\n        merged.search = mergedParams.toString() ? \"?\" + mergedParams.toString() : \"\";\\n        merged.hash = \"#pricing\";\\n\\n        window.location.href = merged.toString();\\n        return;\\n      }\\n\\n      // For all other internal links:\\n\\n      // If target already has tracking, don\\'t touch it\\n      const targetHasTracking = Array.from(targetUrl.searchParams.keys()).some(\\n        isTrackingKey\\n      );\\n      if (targetHasTracking) {\\n        return;\\n      }\\n\\n      // Merge stored tracking params into target\\n      utmParams.forEach((value, key) => {\\n        if (isTrackingKey(key) && !targetUrl.searchParams.get(key)) {\\n          targetUrl.searchParams.set(key, value);\\n        }\\n      });\\n\\n      const finalHref =\\n        targetUrl.pathname +\\n        (targetUrl.searchParams.toString()\\n          ? \"?\" + targetUrl.searchParams.toString()\\n          : \"\") +\\n        targetUrl.hash;\\n\\n      // Update href before navigation so default click uses updated URL\\n      anchor.setAttribute(\"href\", finalHref);\\n    });\\n  })();\\n</script>\\n',customHTMLBodyStart:'<style>\\n  @keyframes slideUp {\\n    from { transform: translateY(100%); }\\n    to   { transform: translateY(0); }\\n  }\\n\\n  .discount-banner {\\n    position: fixed;\\n    bottom: -100px;\\n    left: 0;\\n    width: 100%;\\n    background-color: #DA0001;\\n    color: white;\\n    font-family: \\'Montserrat\\', sans-serif;\\n    font-size: 14px;\\n    display: flex;\\n    align-items: center;\\n    justify-content: center;\\n    text-align: center;\\n    box-shadow: 0 -2px 5px rgba(0,0,0,0.2);\\n    padding: 8px 15px;\\n    gap: 10px;\\n    flex-wrap: wrap;\\n    z-index: 9999;\\n    visibility: hidden;\\n    transition: bottom 0.3s ease;\\n  }\\n\\n  .discount-banner.show {\\n    visibility: visible;\\n    bottom: 0;\\n    animation: slideUp 0.5s ease-out;\\n  }\\n\\n  .discount-banner span {\\n    flex: 1;\\n    min-width: 200px;\\n    max-width: 600px;\\n  }\\n\\n  .discount-banner button {\\n    background-color: white;\\n    color: #1690D5;\\n    border: none;\\n    padding: 6px 12px;\\n    font-size: 13px;\\n    font-family: \\'Montserrat\\', sans-serif;\\n    cursor: pointer;\\n    border-radius: 4px;\\n    white-space: nowrap;\\n  }\\n\\n  @media (max-width: 768px) {\\n    .discount-banner { display: none !important; }\\n  }\\n</style>\\n\\n<div class=\"discount-banner\" id=\"discountBanner\" style=\"display:none\">\\n  <strong>\\n    <span>\\n      🔥 [Extended] Cyber Week 50% OFF Site-Wide — Use code \"50OFF\" at checkout.\\n      Special offer ends in: <span id=\"timer\"></span> 🔥\\n    </span>\\n  </strong>\\n  <button id=\"discountBannerClose\">Ok! Got it</button>\\n</div>\\n\\n<script>\\n(function () {\\n  if (window.__discountBannerInit) return;\\n  window.__discountBannerInit = true;\\n\\n  // Hide on both paths\\n  const EXCLUDE_REGEX = /(\\\\/lifetime-deal|\\\\/case-studies-testimonials|\\\\/faqs|\\\\/chart)(?:\\\\/|$|\\\\?|#)/i;\\n\\n  let timerInterval = null;\\n  let lastHref = location.href;\\n\\n  function isExcludedPage() {\\n    return EXCLUDE_REGEX.test((location.href || \"\").toLowerCase());\\n  }\\n\\n  // ⭐ Evergreen: countdown to midnight EST, 2 days from \"now\"\\n  function getEvergreenEndTimestamp() {\\n    const now = new Date();\\n\\n    // \"Now\" in EST\\n    const estNow = new Date(\\n      now.toLocaleString(\"en-US\", { timeZone: \"America/New_York\" })\\n    );\\n\\n    // Midnight EST two calendar days from today\\n    const estMidnightInTwoDays = new Date(\\n      estNow.getFullYear(),\\n      estNow.getMonth(),\\n      estNow.getDate() + 2,\\n      0, 0, 0, 0\\n    );\\n\\n    // Duration from estNow -> that midnight, applied to actual \"now\"\\n    const diffMs = estMidnightInTwoDays.getTime() - estNow.getTime();\\n    return now.getTime() + diffMs;\\n  }\\n\\n  // Shared cookie helpers (across *.centerfy.ai)\\n  function setSharedCookie(name, value, days) {\\n    let expires = \"\";\\n    if (days) {\\n      const date = new Date();\\n      date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\\n      expires = \"; expires=\" + date.toUTCString();\\n    }\\n    document.cookie =\\n      name + \"=\" + encodeURIComponent(value) +\\n      expires +\\n      \"; path=/; domain=.centerfy.ai; SameSite=Lax; Secure\";\\n  }\\n\\n  function getSharedCookie(name) {\\n    const nameEQ = name + \"=\";\\n    const ca = document.cookie.split(\";\");\\n    for (let i = 0; i < ca.length; i++) {\\n      let c = ca[i];\\n      while (c.charAt(0) === \" \") c = c.substring(1);\\n      if (c.indexOf(nameEQ) === 0) {\\n        return decodeURIComponent(c.substring(nameEQ.length));\\n      }\\n    }\\n    return null;\\n  }\\n\\n  function startTimer() {\\n    const timerDisplay = document.getElementById(\"timer\");\\n    if (!timerDisplay) return;\\n\\n    const STORAGE_KEY = \"discountEvergreenEnd\";\\n    let storedEnd = getSharedCookie(STORAGE_KEY);\\n    let endTime;\\n\\n    if (!storedEnd) {\\n      // No timer yet, start a fresh 2-days-to-midnight-EST window\\n      endTime = getEvergreenEndTimestamp();\\n      setSharedCookie(STORAGE_KEY, endTime, 10);\\n    } else {\\n      endTime = Number(storedEnd);\\n      // If invalid or expired, reset\\n      if (isNaN(endTime) || endTime <= Date.now()) {\\n        endTime = getEvergreenEndTimestamp();\\n        setSharedCookie(STORAGE_KEY, endTime, 10);\\n      }\\n    }\\n\\n    function updateTimer() {\\n      const now = Date.now();\\n      let remaining = endTime - now;\\n\\n      // If expired, immediately reset to a new 2-days-to-midnight-EST cycle\\n      if (remaining <= 0) {\\n        endTime = getEvergreenEndTimestamp();\\n        setSharedCookie(STORAGE_KEY, endTime, 10);\\n        remaining = endTime - now;\\n      }\\n\\n      const days = Math.floor(remaining / 86400000);\\n      const hours = Math.floor((remaining / 3600000) % 24);\\n      const minutes = Math.floor((remaining / 60000) % 60);\\n      const seconds = Math.floor((remaining / 1000) % 60);\\n\\n      timerDisplay.textContent =\\n        (days > 0 ? days + \"d \" : \"\") +\\n        hours + \"h \" + minutes + \"m \" + seconds + \"s\";\\n    }\\n\\n    updateTimer();\\n    clearInterval(timerInterval);\\n    timerInterval = setInterval(updateTimer, 1000);\\n  }\\n\\n  function showBanner() {\\n    const banner = document.getElementById(\"discountBanner\");\\n    if (!banner) return;\\n    banner.style.display = \"\";\\n    banner.classList.add(\"show\");\\n    startTimer();\\n  }\\n\\n  function hideBanner() {\\n    const banner = document.getElementById(\"discountBanner\");\\n    if (!banner) return;\\n\\n    banner.classList.remove(\"show\");\\n    banner.style.visibility = \"hidden\";\\n    banner.style.bottom = \"-100px\";\\n\\n    if (timerInterval) {\\n      clearInterval(timerInterval);\\n      timerInterval = null;\\n    }\\n  }\\n\\n  function resetBannerForRoute() {\\n    const banner = document.getElementById(\"discountBanner\");\\n\\n    if (isExcludedPage()) {\\n      hideBanner();\\n      if (banner) banner.style.display = \"none\";\\n      return;\\n    }\\n\\n    if (banner) banner.style.display = \"\";\\n    setTimeout(showBanner, 4000);\\n  }\\n\\n  function hookHistory(cb) {\\n    const push = history.pushState;\\n    const replace = history.replaceState;\\n\\n    history.pushState = function () {\\n      const ret = push.apply(this, arguments);\\n      cb();\\n      return ret;\\n    };\\n    history.replaceState = function () {\\n      const ret = replace.apply(this, arguments);\\n      cb();\\n      return ret;\\n    };\\n\\n    window.addEventListener(\"popstate\", cb);\\n  }\\n\\n  function onRouteChange() {\\n    const currentHref = location.href;\\n    if (currentHref === lastHref) return;\\n    lastHref = currentHref;\\n    hideBanner();\\n    resetBannerForRoute();\\n  }\\n\\n  document\\n    .getElementById(\"discountBannerClose\")\\n    ?.addEventListener(\"click\", () => {\\n      const banner = document.getElementById(\"discountBanner\");\\n      if (banner) banner.style.display = \"none\";\\n      hideBanner();\\n    });\\n\\n  resetBannerForRoute();\\n  hookHistory(onRouteChange);\\n\\n  setInterval(() => {\\n    if (location.href !== lastHref) onRouteChange();\\n  }, 500);\\n})();\\n</script>\\n',customHTMLHeadEnd:\"<!-- Meta Pixel Code -->\\n<script>\\n!function(f,b,e,v,n,t,s)\\n{if(f.fbq)return;n=f.fbq=function(){n.callMethod?\\nn.callMethod.apply(n,arguments):n.queue.push(arguments)};\\nif(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\\nn.queue=[];t=b.createElement(e);t.async=!0;\\nt.src=v;s=b.getElementsByTagName(e)[0];\\ns.parentNode.insertBefore(t,s)}(window, document,'script',\\n'https://connect.facebook.net/en_US/fbevents.js');\\nfbq('init', '632099089290671');\\nfbq('track', 'PageView');\\n</script>\\n<noscript></noscript>\",customHTMLHeadStart:'<!-- Start of Async ProveSource Code --><script>!function(o,i){window.provesrc&&window.console&&console.error&&console.error(\"ProveSource is included twice in this page.\"),window.provesrc={dq:[],display:function(){this.dq.push(arguments)}},o._provesrcAsyncInit=function(){window.provesrc.init({apiKey:\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50SWQiOiI2N2EzNDRjYWI2ODQwMmZiNjZjNWE0YjgiLCJpYXQiOjE3Mzg3NTMyMjZ9.3vy7nh5wo25VKTQ7uz8Id_XZbbNUEfMBHvHBWSPzXxM\",v:\"0.0.4\"})};var r=i.createElement(\"script\");r.type=\"text/javascript\",r.async=!0,r[\"ch\"+\"ar\"+\"set\"]=\"UTF-8\",r.src=\"https://cdn.provesrc.com/provesrc.js\";var e=i.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)}(window,document);</script><!-- End of Async ProveSource Code -->\\n<!-- Lucky orange start -->\\n<script async=\"\" defer=\"\" src=\"https://tools.luckyorange.com/core/lo.js?site-id=7069f477\">\\n</script>\\n<!-- Lucky orange end -->\\n<!-- first promoter tag start-->\\n<script>(function(w){w.fpr=w.fpr||function(){w.fpr.q = w.fpr.q||[];w.fpr.q[arguments[0]==\\'set\\'?\\'unshift\\':\\'push\\'](arguments);};})(window);\\nfpr(\"init\", {cid:\"mqnknrfe\"}); \\nfpr(\"click\");\\n</script>\\n<script src=\"https://cdn.firstpromoter.com/fpr.js\" async=\"\"></script>\\n\\n<script>\\n  function getParam(param){\\n    return new URLSearchParams(window.location.search).get(param);\\n  }\\n  fpr(\"referral\",{email: getParam(\"email\")})\\n</script>\\n\\n<!-- first promoter tag end -->\\n',description:\"Transform your business with Centerfy AI! Automate lead qualification, appointment scheduling & follow-ups. Scale your company with the most advanced AI voice platform on the market.\",favicon:\"https://framerusercontent.com/assets/EIjjscxXdK6XbpX9Ekr6IlXt2o.svg\",robots:\"max-image-preview:large\",socialImage:\"https://framerusercontent.com/assets/BPXIcNO8bADTSxm9Iu4H8B8fsts.png\",title:\"Centerfy™ AI Voice & Chat CRM For Businesses & Agencies\"};}export const metadataVersion=1;\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"metadataVersion\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"oDACA,SAAwB,EAAS,EAAO,EAAa,CAAC,MAAM,CAAC,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAymJ,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAA8tN,kBAAkB;;;;;;;;;;;;;uBAA4gB,oBAAoB;;;;;;;;;;;;;;;;;;;;EAAu5C,YAAY,yLAAyL,QAAQ,sEAAsE,OAAO,0BAA0B,YAAY,uEAAuE,MAAM,0DAA0D"}