{"version":3,"file":"shared-lib.HTTCvGLa.mjs","names":[],"sources":["https:/framerusercontent.com/modules/aimKGykWOTtkXUOvlFnc/exRUIWQ5bO8gy5tYMW9O/siteMetadata.js"],"sourcesContent":["// Generated by Framer (98b71dc)\nexport default function metadata(params,activeLocale){return{customHTMLBodyEnd:\"<script>\\n    // 从 Cookie 中提取 GA4 client_id（即 user_pseudo_id）\\n    function getGA4ClientId() {\\n      const cookie = document.cookie.match(/_ga=(.+?);/);\\n      if (cookie) {\\n        // Cookie 格式：GA1.2.XXXXXX.YYYYYY → 提取最后两部分\\n        return cookie[1].split('.').slice(-2).join('.');\\n      }\\n      return ''; // 降级处理\\n    }\\n\\n\\n     // 获取UTM参数并保存到localStorage\\n    // function saveUtmParams() {\\n    //   const urlParams = new URLSearchParams(window.location.search);\\n    //   const utmParams = {\\n    //     utm_source: urlParams.get('utm_source'),\\n    //     utm_medium: urlParams.get('utm_medium'),\\n    //     utm_campaign: urlParams.get('utm_campaign'),\\n    //     utm_term: urlParams.get('utm_term'),\\n    //     utm_content: urlParams.get('utm_content')\\n    //   };\\n    //\\n    //   // 如果有UTM参数则保存\\n    //   if (utmParams.utm_source) {\\n    //     localStorage.setItem('utm_params', JSON.stringify(utmParams));\\n    //   }\\n    // }\\n    //\\n    // // 在页面加载时保存UTM参数\\n    // document.addEventListener('DOMContentLoaded', function() {\\n    //   saveUtmParams();\\n    // });\\n\\n\\n\\n\\n\\n\\n      document.getElementById('registration-form').addEventListener('submit', async function(e) {\\n        e.preventDefault();\\n\\n        // 获取UTM参数（优先从URL获取，其次从localStorage）\\n\\n      const urlParams = new URLSearchParams(window.location.search);\\n      let utmParams = {};\\n\\n      try {\\n        utmParams = JSON.parse(localStorage.getItem('utm_params')) || {};\\n      } catch (e) {\\n        console.error('解析UTM缓存失败:', e);\\n      }\\n\\n\\n      const finalUtm = {\\n      utm_source: urlParams.get('utm_source') || utmParams.utm_source || '',\\n      utm_medium: urlParams.get('utm_medium') || utmParams.utm_medium || '',\\n      utm_campaign: urlParams.get('utm_campaign') || utmParams.utm_campaign || '',\\n      utm_term: urlParams.get('utm_term') || utmParams.utm_term || '',\\n      utm_content: urlParams.get('utm_content') || utmParams.utm_content || '',\\n      };\\n\\n\\n      // 将UTM参数添加到表单\\n      for (const [key, value] of Object.entries(finalUtm)) {\\n\\n        const hiddenField = document.createElement('input');\\n        hiddenField.type = 'hidden';\\n        hiddenField.name = key;\\n        hiddenField.value = value;\\n        this.appendChild(hiddenField);\\n\\n      }\\n\\n\\n\\n\\n        // 将 client_id 添加到表单数据中\\n        const gaClientId = await getGA4ClientId();\\n        // 将 client_id 添加到表单数据中\\n        const hiddenField = document.createElement('input');\\n        hiddenField.type = 'hidden';\\n        hiddenField.name = 'user_pseudo_id';\\n        hiddenField.value = gaClientId;\\n        this.appendChild(hiddenField);\\n\\n        const submitButton = this.querySelector('button[type=\\\"submit\\\"]');\\n        const originalButtonText = submitButton.textContent;\\n        submitButton.disabled = true;\\n        submitButton.textContent = 'Submitting...';\\n\\n\\n\\n  \\n        // 正确获取所有元素（确保ID存在）\\n        const nameInput = document.getElementById('name');\\n        const emailInput = document.getElementById('email');\\n        const cellInput = document.getElementById('cellphone');\\n        const consentCheckbox = document.getElementById('consent');\\n  \\n        // 清除旧错误\\n        clearAllErrors();\\n\\n        // 客户端验证逻辑\\n        let isValid = true;\\n  \\n        // 验证姓名（使用!!确保布尔值）\\n        if (!nameInput.value.trim()) {\\n          showError(nameInput, 'Name is required');\\n          isValid = false;\\n        }\\n  \\n        // 邮箱验证\\n        const emailRegex = /^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/;\\n        if (!emailRegex.test(emailInput.value.trim())) {\\n          showError(emailInput, 'Please enter a valid email');\\n          isValid = false;\\n        }\\n  \\n        // 手机号验证\\n        // const phoneRegex = /^\\\\d{10,15}$/;\\n        // if (!phoneRegex.test(cellInput.value.trim())) {\\n        //   showError(cellInput, 'Invalid phone number (10-15 digits)');\\n        //   isValid = false;\\n        // }\\n  \\n        // 同意条款验证\\n        if (!consentCheckbox.checked) {\\n          showError(consentCheckbox, 'You must agree to the terms');\\n          isValid = false;\\n        }\\n  \\n        if (!isValid) return;\\n        const formData = new FormData(this);\\n  \\n        try {\\n          // 发送请求...\\n          const response = await fetch(this.action, {\\n            method: this.method,\\n            body: formData,\\n            headers: {\\n              'Accept': 'application/json'\\n            }\\n          });\\n  \\n          if (!response.ok) {\\n            // 处理服务器返回的详细错误\\n            const errorData = await response.json();\\n            errorData.detail.errors.forEach(err => {\\n              const fieldMap = {\\n                'name': nameInput,\\n                'email': emailInput,\\n                'cellphone': cellInput,\\n                'consent': consentCheckbox.checked\\n              };\\n              showError(fieldMap[err.field] || null, err.message);\\n            });\\n            submitButton.disabled = false;\\n            submitButton.textContent = originalButtonText;\\n            return;\\n          }\\n\\n          // 提交成功后清除保存的UTM参数\\n          localStorage.removeItem('utm_params');\\n          window.location.href = 'thanks.html';\\n        } catch (error) {\\n          console.error(error);\\n          // showError(null, `error message: ${error.message}`);\\n        }\\n      });\\n  \\n      // 显示错误提示\\n     function showError(inputElement, message) {\\n        // 创建错误元素\\n    const errorDiv = document.createElement('div');\\n    errorDiv.className = 'error-message';\\n    errorDiv.textContent = message;\\n  \\n    // 清除旧错误\\n    if (inputElement) {\\n      // 找到最近的父级容器\\n      const container = inputElement.parentElement;\\n  \\n      // 插入到输入框之后\\n      container.insertBefore(errorDiv, inputElement.nextSibling);\\n  \\n      // 添加错误状态\\n      inputElement.classList.add('error-state');\\n    } else {\\n      // 全局错误插入到表单顶部\\n      const form = document.getElementById('registration-form');\\n      form.insertBefore(errorDiv, form.firstChild);\\n    }\\n      }\\n  \\n      // 清除所有错误提示\\n      function clearAllErrors() {\\n         // 移除所有错误提示\\n      document.querySelectorAll('.error-message').forEach(el => el.remove());\\n  \\n      // 清除输入框错误状态\\n      document.querySelectorAll('.error-state').forEach(el => {\\n        el.classList.remove('error-state');\\n      });\\n      }\\n</script>\\n\",customHTMLHeadStart:\"<!-- Google Tag Manager -->\\n    <script async=\\\"\\\" src=\\\"https://www.googletagmanager.com/gtm.js?id=GTM-WB4SFVZ3\\\"></script><script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\\n    new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\\n    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\\n    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\\n    })(window,document,'script','dataLayer','GTM-WB4SFVZ3');</script>\\n    <!-- End Google Tag Manager -->\\n\\n    <meta name=\\\"facebook-domain-verification\\\" content=\\\"lp0ht7jw0qbyspzjc8tzrrthyc3k8o\\\">\",description:\"Unlimited data. 24/7 vet care. One plan made just for cat moms.\",favicon:\"https://framerusercontent.com/assets/4xdlNGwcv8E1UAmAzx1nhs4joU.png\",robots:\"max-image-preview:large\",title:\"Meow Mobile\"};}export const metadataVersion=1;\nexport const __FramerMetadata__ = {\"exports\":{\"metadataVersion\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"2DACA,SAAwB,EAAS,EAAO,EAAa,CAAC,MAAM,CAAC,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAgrM,oBAAoB;;;;;;;;yFAA+nB,YAAY,kEAAkE,QAAQ,sEAAsE,OAAO,0BAA0B,MAAM,cAAc"}