{
  "version": 3,
  "sources": ["ssg:https://framerusercontent.com/modules/75PCp93vyK27l7qLZqvI/6KVoHBcOdyHU7kcoIw5H/siteMetadata.js"],
  "sourcesContent": ["// Generated by Framer (400c93f)\nconst valuesByLocaleId={OrESh_VUl:{v0:\"Oddle | \u9910\u5EF3\u6210\u9577\u7684\u4E00\u7AD9\u5F0F\u89E3\u6C7A\u65B9\u6848\",v1:\"\u70BA\u9910\u5EF3\u800C\u5EFA\uFF0C\u4F86\u81EA\u9910\u98F2\u696D\u8005\u3002\u6211\u5011\u8CE6\u4E88\u60A8\u79D8\u5BC6\u6B66\u5668 \u2013 \u60A8\u7684\u5BA2\u6236\u6578\u64DA\uFF0C\u5E6B\u52A9\u60A8\u589E\u9577\u92B7\u552E\u4E26\u89F8\u53CA\u6700\u4F73\u5BA2\u6236\u3002\"}};function getLocalizedValue(key,locale){while(locale){const values=valuesByLocaleId[locale.id];if(values){const value=values[key];if(value)return value;}locale=locale.fallback;}}export default function metadata(params,activeLocale){return{customHTMLBodyEnd:\"<!-- update text us button-->\\n<script>\\n(function () {\\n    // Function to update <a> href based on the current locale\\n    function updateTextUsLink() {\\n        const locale = window.location.pathname.split(\\\"/\\\")[1] || \\\"sg\\\";\\n\\n        let productName = document.title.split(\\\" | \\\")[0]; // Split and take the first part\\n        \\n        if (/demo/i.test(document.title)) {\\n            productName = `${productName} Demo`; // Append \\\"Demo\\\" to the product name\\n        }\\n\\n        const links = {\\n            sg: `https://wa.me/6588501782?text=Hi%21%20I%20have%20questions%20about%20${productName}.`,\\n            my: `https://wa.me/6588501782?text=Hi%21%20I%20have%20questions%20about%20${productName}.`,\\n            tw: \\\"https://line.me/R/ti/p/@rkf5936k\\\",\\n        };\\n\\n        const anchors = document.querySelectorAll('a[aria-label=\\\"text-us\\\"]');\\n        anchors.forEach(anchor => {\\n            const newHref = links[locale] || links[\\\"sg\\\"];\\n            anchor.setAttribute(\\\"href\\\", newHref);\\n        });\\n    }\\n\\n    // Initial call to update the link\\n    updateTextUsLink();\\n\\n    // Listen for URL changes using popstate (for navigation events in SPAs)\\n    window.addEventListener(\\\"popstate\\\", updateTextUsLink);\\n\\n    // Observe DOM changes to detect dynamic <a> additions (optional for SPAs)\\n    const observer = new MutationObserver(() => updateTextUsLink());\\n    observer.observe(document.body, { childList: true, subtree: true });\\n})();\\n</script>\\n<!-- -->\\n\\n\\n<script>\\n  setTimeout(function () {\\n    const allowedSlugs = ['sg', 'tw', 'my', 'hk', 'au'];\\n    const pathParts = window.location.pathname.split('/');\\n    const currentSlug = pathParts[1];\\n\\n    if (!allowedSlugs.includes(currentSlug)) return;\\n\\n    document.querySelectorAll('a[href^=\\\"../\\\"]').forEach(link => {\\n      const href = link.getAttribute('href');\\n      const parts = href.split('/');\\n      if (allowedSlugs.includes(parts[1])) return;\\n\\n      const newHref = href.replace('../', `../${currentSlug}/`);\\n      link.setAttribute('href', newHref);\\n      console.log(`\u2705 Rewrote to: ${newHref}`);\\n    });\\n  }, 500); // adjust timing if needed\\n</script>\",customHTMLBodyStart:'<!-- Custom Script for Lead and Contact Tracking -->\\n<script>\\n(function () {\\n  // Keep track of the current path\\n  let previousPathname = window.location.pathname;\\n\\n  // Function to attach event listeners\\n  function attachEventListeners() {\\n    console.log(\"Attaching event listeners for forms, buttons, and contact actions...\");\\n\\n    // Attach to forms for Lead event\\n    const forms = document.querySelectorAll(\"form\");\\n    forms.forEach((form, index) => {\\n      if (!form.dataset.listenerAdded) {\\n        form.addEventListener(\"submit\", (event) => {\\n          console.log(`Form ${index + 1} submitted`);\\n          if (typeof fbq === \"function\") {\\n            fbq(\"track\", \"Lead\");\\n            console.log(`Lead event sent to Facebook Pixel for form ${index + 1}`);\\n          }\\n        });\\n        form.dataset.listenerAdded = true; // Mark as listener added\\n      }\\n    });\\n\\n    // Attach click listeners only to standalone buttons (not in forms) for Lead event\\n    const submitButtons = document.querySelectorAll(\\'button[type=\"submit\"], input[type=\"submit\"]\\');\\n    submitButtons.forEach((button, index) => {\\n      const formParent = button.closest(\"form\");\\n      if (!formParent && !button.dataset.listenerAdded) {\\n        button.addEventListener(\"click\", () => {\\n          console.log(`Submit button ${index + 1} clicked`);\\n          if (typeof fbq === \"function\") {\\n            fbq(\"track\", \"Lead\");\\n            console.log(`Lead event sent to Facebook Pixel for button ${index + 1}`);\\n          }\\n        });\\n        button.dataset.listenerAdded = true; // Mark as listener added\\n      }\\n    });\\n\\n    // Attach click listeners to buttons with \"Chat on Whatsapp\" or \"Text us\" for Contact event\\n    const contactButtons = document.querySelectorAll(\"button, a\");\\n    contactButtons.forEach((button, index) => {\\n      if (!button.dataset.contactListenerAdded) {\\n        if (\\n          button.textContent.trim().toLowerCase().includes(\"chat on whatsapp\") ||\\n          button.textContent.trim().toLowerCase().includes(\"text us\")\\n        ) {\\n          button.addEventListener(\"click\", () => {\\n            console.log(`Contact button ${index + 1} clicked: ${button.textContent}`);\\n            if (typeof fbq === \"function\") {\\n              fbq(\"track\", \"Contact\");\\n              console.log(`Contact event sent to Facebook Pixel for button: ${button.textContent}`);\\n            }\\n          });\\n          button.dataset.contactListenerAdded = true; // Mark as listener added\\n        }\\n      }\\n    });\\n  }\\n\\n  // Function to handle route changes\\n  function handleRouteChange() {\\n    const currentPathname = window.location.pathname;\\n    if (currentPathname !== previousPathname) {\\n      previousPathname = currentPathname;\\n      console.log(`Route changed to: ${currentPathname}`);\\n      attachEventListeners();\\n    }\\n  }\\n\\n  // Observe changes in the DOM to detect route changes\\n  const observer = new MutationObserver(handleRouteChange);\\n  observer.observe(document.body, { childList: true, subtree: true });\\n\\n  // Attach initial event listeners on page load\\n  document.addEventListener(\"DOMContentLoaded\", () => {\\n    console.log(\"DOM loaded, attaching initial event listeners...\");\\n    attachEventListeners();\\n  });\\n})();\\n</script>\\n<!-- End Custom Script -->\\n',customHTMLHeadEnd:\"<script>\\n// UTM Tracking Script for Framer SPA (Site Head)\\n\\n// Function to extract UTM parameters from the URL\\nfunction getUTMParameters() {\\n    const utmParams = {};\\n    const queryString = window.location.search.substring(1);\\n    const pairs = queryString.split('&');\\n\\n    for (let i = 0; i < pairs.length; i++) {\\n        const pair = pairs[i].split('=');\\n        if (pair[0].startsWith('utm_')) {\\n            utmParams[pair[0]] = decodeURIComponent(pair[1] || '');\\n        }\\n    }\\n    return utmParams;\\n}\\n\\n// Function to capture the referrer\\nfunction getReferrer() {\\n    const referrer = document.referrer;\\n    const currentDomain = window.location.hostname;\\n    if (referrer && !referrer.includes(currentDomain)) {\\n        return referrer;\\n    } else if (!referrer) {\\n        return \\\"direct entry\\\";\\n    }\\n    return null;\\n}\\n\\n// Function to track the current page URL\\nfunction getCurrentPageURL() {\\n    return window.location.href;\\n}\\n\\n// Function to set a cookie\\nfunction setCookie(name, value, days) {\\n    const date = new Date();\\n    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); // Cookie expiry in `days`\\n    const expires = \\\"expires=\\\" + date.toUTCString();\\n    document.cookie = `${name}=${encodeURIComponent(value)}; ${expires}; path=/`;\\n}\\n\\n// Function to get a cookie\\nfunction getCookie(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].trim();\\n        if (c.indexOf(nameEQ) === 0) return decodeURIComponent(c.substring(nameEQ.length, c.length));\\n    }\\n    return null;\\n}\\n\\n// Function to store attribution data in cookies\\nfunction storeAttributionData() {\\n    console.log(\\\"store attribution data\\\")\\n    const utmParams = getUTMParameters();\\n    const referrer = getReferrer();\\n    const pageURL = getCurrentPageURL();\\n    const isDirectVisit = Object.keys(utmParams).length === 0;\\n\\n    let existingData = {};\\n    const existingDataStr = getCookie('attribution_data');\\n    if (existingDataStr) {\\n        try {\\n            existingData = JSON.parse(existingDataStr);\\n        } catch (e) {\\n            console.error('Error parsing existing attribution data:', e);\\n        }\\n    }\\n\\n    // Update cookies only if UTM parameters exist or it's a direct visit\\n    if (!isDirectVisit || referrer) {\\n        const newData = {\\n            ...existingData,\\n            ...utmParams,\\n            referrer: referrer || existingData.referrer || \\\"direct entry\\\",\\n            page_url: pageURL,\\n        };\\n        setCookie('attribution_data', JSON.stringify(newData), 30); // Store for 30 days\\n        console.log(\\\"Attribution Data Stored:\\\", newData);\\n    }\\n}\\n\\n// Function to handle SPA route changes\\nfunction handleSPARouteChanges() {\\n    window.addEventListener('popstate', () => {\\n        console.log(\\\"Route changed (popstate)\\\");\\n        storeAttributionData();\\n    });\\n\\n    document.body.addEventListener('framer:navigation', () => {\\n        console.log(\\\"Route changed (Framer navigation)\\\");\\n        storeAttributionData();\\n    });\\n}\\n\\n// Initialize tracking logic\\nfunction initAttributionTracking() {\\n    storeAttributionData(); // Store attribution data on initial load\\n    handleSPARouteChanges(); // Watch for route changes in SPAs\\n}\\n\\n// Run the tracking logic after the page has fully loaded\\ndocument.addEventListener('DOMContentLoaded', initAttributionTracking);\\n\\n\\n</script>\",customHTMLHeadStart:\"<!-- Google Tag Manager -->\\n<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\\nnew Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\\nj=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-TM3W78RV');</script>\\n<!-- End Google Tag Manager -->\",description:getLocalizedValue(\"v1\",activeLocale)??\"Built for restaurants by restaurateurs. We empower you with the secret ingredient \u2013 your customer data, to grow your sales and reach your best customers.\",favicon:\"https://framerusercontent.com/assets/23pCD4VmidR4jgHEWt2rB4PcOVE.png\",robots:\"max-image-preview:large\",socialImage:\"https://framerusercontent.com/assets/8pD9DBsJ8XU4xfo0P4iuApKos.jpg\",title:getLocalizedValue(\"v0\",activeLocale)??\"Oddle | The All-in-One Solution for Restaurant Growth\"};}export const metadataVersion=1;\nexport const __FramerMetadata__ = {\"exports\":{\"metadataVersion\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],
  "mappings": "AACA,IAAMA,EAAiB,CAAC,UAAU,CAAC,GAAG,mFAAuB,GAAG,kRAAiD,CAAC,EAAE,SAASC,EAAkBC,EAAIC,EAAO,CAAC,KAAMA,GAAO,CAAC,IAAMC,EAAOJ,EAAiBG,EAAO,EAAE,EAAE,GAAGC,EAAO,CAAC,IAAMC,EAAMD,EAAOF,CAAG,EAAE,GAAGG,EAAM,OAAOA,CAAM,CAACF,EAAOA,EAAO,QAAS,CAAC,CAAgB,SAARG,EAA0BC,EAAOC,EAAa,CAAC,MAAM,CAAC,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAA0oE,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAmxG,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAu7G,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAA4a,YAAYP,EAAkB,KAAKO,CAAY,GAAG,iKAA4J,QAAQ,uEAAuE,OAAO,0BAA0B,YAAY,qEAAqE,MAAMP,EAAkB,KAAKO,CAAY,GAAG,uDAAuD,CAAE",
  "names": ["valuesByLocaleId", "getLocalizedValue", "key", "locale", "values", "value", "metadata", "params", "activeLocale"]
}
