{"version":3,"file":"siteMetadata.CG1pf7ys.mjs","names":[],"sources":["https:/framerusercontent.com/modules/lmSsv4JB2BcI7xVpo3Tg/r7sVTsWWicDdQwDDHhGw/siteMetadata.js"],"sourcesContent":["// Generated by Framer (861d57e)\nexport default function metadata(params,activeLocale){return{customHTMLBodyEnd:\"<!-- Google Tag Manager (noscript) -->\\n<noscript><iframe src=\\\"https://www.googletagmanager.com/ns.html?id=GTM-NTMQ3LF\\\" height=\\\"0\\\" width=\\\"0\\\" style=\\\"display:none;visibility:hidden\\\"></iframe></noscript>\\n<!-- End Google Tag Manager (noscript) -->\\n\\n\\n<div id=\\\"global-call-button\\\" style=\\\"position:fixed;bottom:24px;right:24px;z-index:9999;animation:slideUp 0.4s cubic-bezier(0.25,0.46,0.45,0.94);transition:transform 0.3s ease, opacity 0.3s ease;\\\">\\n  <a href=\\\"tel:3604649780\\\" style=\\\"display:flex;align-items:center;justify-content:center;background:#2592AC;color:#fff;text-decoration:none;padding:16px 32px;border-radius:8px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Inter',sans-serif;font-weight:500;font-size:15px;letter-spacing:-0.01em;box-shadow:0 4px 12px rgba(37,146,172,0.15);transition:all 0.2s cubic-bezier(0.25,0.46,0.45,0.94);border:none;cursor:pointer;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);\\\" onmouseover=\\\"this.style.background='#1f7e94';this.style.transform='translateY(-2px)';this.style.boxShadow='0 8px 20px rgba(37,146,172,0.25)'\\\" onmouseout=\\\"this.style.background='#2592AC';this.style.transform='translateY(0)';this.style.boxShadow='0 4px 12px rgba(37,146,172,0.15)'\\\">\\n    <svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" style=\\\"margin-right:10px;\\\">\\n      <path d=\\\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\\\" fill=\\\"white\\\"></path>\\n    </svg>\\n    <span class=\\\"btn-text\\\">Call Now</span>\\n  </a>\\n</div>\\n\\n<style>\\n@keyframes slideUp {\\n  from { opacity: 0; transform: translateY(60px); }\\n  to   { opacity: 1; transform: translateY(0); }\\n}\\n\\n#global-call-button a {\\n  min-width: 140px;\\n  padding: 16px 32px;\\n  border-radius: 8px;\\n  justify-content: center;\\n}\\n\\n@media (min-width: 1200px) {\\n  #global-call-button {\\n    bottom: 32px;\\n    right: 32px;\\n  }\\n  #global-call-button a {\\n    padding: 18px 36px;\\n    font-size: 16px;\\n  }\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  #global-call-button {\\n    animation: none;\\n  }\\n  #global-call-button a {\\n    transition: none;\\n  }\\n}\\n\\n#global-call-button a:focus {\\n  outline: 2px solid #2592AC;\\n  outline-offset: 2px;\\n}\\n</style>\\n\\n<script>\\ndocument.addEventListener('DOMContentLoaded', function () {\\n  const callButton = document.getElementById('global-call-button');\\n  callButton.style.opacity = '0';\\n  setTimeout(() => {\\n    callButton.style.opacity = '1';\\n  }, 300);\\n});\\n\\ndocument.getElementById('global-call-button').addEventListener('click', function (e) {\\n  if ('vibrate' in navigator) {\\n    navigator.vibrate(50);\\n  }\\n});\\n\\nif (window.innerWidth > 768) {\\n  let lastScrollTop = 0;\\n  let scrollTimeout;\\n  const callButton = document.getElementById('global-call-button');\\n\\n  window.addEventListener('scroll', function () {\\n    clearTimeout(scrollTimeout);\\n    scrollTimeout = setTimeout(() => {\\n      let scrollTop = window.pageYOffset || document.documentElement.scrollTop;\\n      if (scrollTop > lastScrollTop && scrollTop > 200) {\\n        callButton.style.transform = 'scale(0.85)';\\n        callButton.style.opacity = '0.8';\\n      } else {\\n        callButton.style.transform = 'scale(1)';\\n        callButton.style.opacity = '1';\\n      }\\n      lastScrollTop = scrollTop;\\n    }, 10);\\n  }, { passive: true });\\n}\\n</script>\\n\",customHTMLHeadEnd:\"<script nowprocket=\\\"\\\" nitro-exclude=\\\"\\\" type=\\\"text/javascript\\\" id=\\\"sa-dynamic-optimization\\\" data-uuid=\\\"f82cb24f-8da8-4e8e-83fa-8ee4d498ee89\\\" src=\\\"data:text/javascript;base64,dmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3NjcmlwdC5zZXRBdHRyaWJ1dGUoIm5vd3Byb2NrZXQiLCAiIik7c2NyaXB0LnNldEF0dHJpYnV0ZSgibml0cm8tZXhjbHVkZSIsICIiKTtzY3JpcHQuc3JjID0gImh0dHBzOi8vZGFzaGJvYXJkLnNlYXJjaGF0bGFzLmNvbS9zY3JpcHRzL2R5bmFtaWNfb3B0aW1pemF0aW9uLmpzIjtzY3JpcHQuZGF0YXNldC51dWlkID0gImY4MmNiMjRmLThkYTgtNGU4ZS04M2ZhLThlZTRkNDk4ZWU4OSI7c2NyaXB0LmlkID0gInNhLWR5bmFtaWMtb3B0aW1pemF0aW9uLWxvYWRlciI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOw==\\\"></script>\\n\\n<!-- 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-NTMQ3LF');</script>\\n<!-- End Google Tag Manager -->\\n\\n<script>\\n// Visitor Tracking Script\\nclass VisitorTracker {\\n    constructor() {\\n        this.startTime = this.getOrSetStartTime();\\n        this.pageVisits = this.getOrSetPageVisits();\\n        this.isReturning = this.checkReturningVisitor();\\n        this.setupTracking();\\n    }\\n\\n    // Get or set the initial start time from sessionStorage\\n    getOrSetStartTime() {\\n        let startTime = sessionStorage.getItem('visitorStartTime');\\n        if (!startTime) {\\n            startTime = Date.now();\\n            sessionStorage.setItem('visitorStartTime', startTime);\\n        }\\n        return parseInt(startTime);\\n    }\\n\\n    // Get or set the page visits from sessionStorage\\n    getOrSetPageVisits() {\\n        let visits = new Set();\\n        try {\\n            const storedVisits = JSON.parse(sessionStorage.getItem('pageVisits') || '[]');\\n            visits = new Set(storedVisits);\\n        } catch (e) {\\n            console.error('Error parsing stored page visits:', e);\\n        }\\n        return visits;\\n    }\\n\\n    // Check if this is a returning visitor using localStorage\\n    checkReturningVisitor() {\\n        const lastVisit = localStorage.getItem('lastVisit');\\n        const isReturning = !!lastVisit;\\n        localStorage.setItem('lastVisit', Date.now());\\n        return isReturning;\\n    }\\n\\n    // Calculate time spent on site\\n    getTimeOnSite() {\\n        const timeSpent = Math.floor((Date.now() - this.startTime) / 1000); // in seconds\\n        return timeSpent;\\n    }\\n\\n    // Track page visits\\n    trackPageVisit() {\\n        // Get full URL information\\n        const currentPath = window.location.pathname + window.location.search;\\n        const timestamp = new Date().toISOString();\\n        \\n        // Add new visit with timestamp\\n        this.pageVisits.add(JSON.stringify({\\n            path: currentPath,\\n            timestamp: timestamp,\\n            fullUrl: window.location.href\\n        }));\\n\\n        // Store updated visits in sessionStorage\\n        sessionStorage.setItem('pageVisits', JSON.stringify(Array.from(this.pageVisits)));\\n        \\n        // Log for debugging\\n        console.log('Page visit tracked:', currentPath);\\n        \\n        return Array.from(this.pageVisits).map(visit => JSON.parse(visit));\\n    }\\n\\n    // Get user's browser information\\n    getUserBrowserInfo() {\\n        return {\\n            userAgent: navigator.userAgent,\\n            language: navigator.language,\\n            platform: navigator.platform,\\n            screenWidth: window.screen.width,\\n            screenHeight: window.screen.height,\\n            timezone: Intl.DateTimeFormat().resolvedOptions().timeZone\\n        };\\n    }\\n\\n    // Get all tracking data as an object\\n    getTrackingData() {\\n        const visits = Array.from(this.pageVisits).map(visit => {\\n            try {\\n                return JSON.parse(visit);\\n            } catch (e) {\\n                return visit;\\n            }\\n        });\\n\\n        return {\\n            currentURL: window.location.href,\\n            referrer: document.referrer,\\n            timeOnSite: this.getTimeOnSite(),\\n            pagesVisited: visits,\\n            totalPagesVisited: visits.length,\\n            isReturning: this.isReturning,\\n            browserInfo: this.getUserBrowserInfo(),\\n            lastUpdated: new Date().toISOString(),\\n            sessionStartTime: new Date(this.startTime).toISOString()\\n        };\\n    }\\n\\n    // Update the user_data hidden field\\n    updateFormField() {\\n        const userDataField = document.querySelector('input[name=\\\"user_data\\\"]');\\n        if (userDataField) {\\n            const trackingData = this.getTrackingData();\\n            userDataField.value = JSON.stringify(trackingData);\\n            console.log('Updated user_data field:', trackingData);\\n        } else {\\n            console.error('Could not find hidden field with name \\\"user_data\\\"');\\n        }\\n    }\\n\\n    // Setup tracking events\\n    setupTracking() {\\n        // Track initial page load\\n        this.trackPageVisit();\\n\\n        // Update form field every 2 seconds and check for URL changes\\n        let lastUrl = location.href;\\n        setInterval(() => {\\n            // Check if URL has changed\\n            if (location.href !== lastUrl) {\\n                lastUrl = location.href;\\n                this.trackPageVisit();\\n            }\\n            this.updateFormField();\\n        }, 2000);\\n\\n        // Track page visibility changes\\n        document.addEventListener('visibilitychange', () => {\\n            if (document.visibilityState === 'hidden') {\\n                this.trackPageVisit();\\n                this.updateFormField();\\n            }\\n        });\\n\\n        // Track pushState and replaceState\\n        const originalPushState = history.pushState;\\n        const originalReplaceState = history.replaceState;\\n        \\n        history.pushState = function() {\\n            originalPushState.apply(this, arguments);\\n            window.visitorTracker.trackPageVisit();\\n            window.visitorTracker.updateFormField();\\n        };\\n        \\n        history.replaceState = function() {\\n            originalReplaceState.apply(this, arguments);\\n            window.visitorTracker.trackPageVisit();\\n            window.visitorTracker.updateFormField();\\n        };\\n\\n        // Listen for popstate events\\n        window.addEventListener('popstate', () => {\\n            this.trackPageVisit();\\n            this.updateFormField();\\n        });\\n\\n        // Track all click events that might be navigation\\n        document.addEventListener('click', (e) => {\\n            // Give a small delay to allow for navigation to complete\\n            setTimeout(() => {\\n                this.trackPageVisit();\\n                this.updateFormField();\\n            }, 100);\\n        });\\n    }\\n}\\n\\n// Ensure the hidden field exists\\nfunction ensureHiddenField() {\\n    let userDataField = document.querySelector('input[name=\\\"user_data\\\"]');\\n    \\n    if (!userDataField) {\\n        userDataField = document.createElement('input');\\n        userDataField.type = 'hidden';\\n        userDataField.name = 'user_data';\\n        \\n        // Find any form on the page\\n        const form = document.querySelector('form');\\n        if (form) {\\n            form.appendChild(userDataField);\\n            console.log('Created and attached user_data hidden field to form');\\n        } else {\\n            console.error('No form found on page to attach user_data field');\\n        }\\n    }\\n}\\n\\n// Initialize tracking\\ndocument.addEventListener('DOMContentLoaded', () => {\\n    ensureHiddenField();\\n    window.visitorTracker = new VisitorTracker();\\n});\\n</script>\\n\",description:\"Experience better hearing and an improved quality of life with South Sound Audiology’s personalized hearing care. Our expert audiologists are here to help you along with your Hearing Health Journey here at South Sound Audiology\",favicon:\"https://framerusercontent.com/assets/L9E7IoA7ouYoirBofEim8WlOY.png\",robots:\"max-image-preview:large\",socialImage:\"https://framerusercontent.com/assets/bftqEMylWvFAmdMHO7qKJY4sUrA.png\",title:\"South Sound Audiology | The Most Caring, Trustworthy, and Experienced Local Audiologist in Lacey, WA\"};}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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAugH,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAypP,YAAY,sOAAsO,QAAQ,qEAAqE,OAAO,0BAA0B,YAAY,uEAAuE,MAAM,sGAAuG,CAAE"}