{"id":31874,"date":"2025-03-20T17:35:17","date_gmt":"2025-03-20T17:35:17","guid":{"rendered":"https:\/\/alpeorv2.aif-staging.com\/?page_id=31874"},"modified":"2025-11-13T09:47:58","modified_gmt":"2025-11-13T09:47:58","slug":"luxury-spa-treatments","status":"publish","type":"page","link":"https:\/\/alpeorv2.aif-staging.com\/fr\/luxury-spa-treatments\/","title":{"rendered":"L'exp\u00e9rience"},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; custom_padding_last_edited=&#8221;on|phone&#8221; module_id=&#8221;signature&#8221; module_class=&#8221;full-height-experience&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_color=&#8221;#FFFFFF&#8221; background_enable_image=&#8221;off&#8221; custom_margin=&#8221;||||false|false&#8221; custom_padding=&#8221;0px||0px||false|false&#8221; custom_padding_tablet=&#8221;0px||0px||true|false&#8221; custom_padding_phone=&#8221;0px||0px||true|false&#8221; custom_css_main_element=&#8221;z-index: 0;&#8221; global_colors_info=&#8221;{}&#8221; custom_css_main_element_last_edited=&#8221;on|desktop&#8221; custom_css_main_element_tablet=&#8221;z-index: 0;||&#8221; custom_css_main_element_phone=&#8221;z-index: 0;||&#8221;][et_pb_row make_equal=&#8221;on&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/the-alpeor-spa-experience-suisse.jpg&#8221; width=&#8221;100%&#8221; width_tablet=&#8221;70%&#8221; width_phone=&#8221;70%&#8221; width_last_edited=&#8221;on|tablet&#8221; max_width=&#8221;1920px&#8221; max_width_tablet=&#8221;1080px&#8221; max_width_phone=&#8221;1080px&#8221; max_width_last_edited=&#8221;on|tablet&#8221; custom_margin=&#8221;0px||0px||false|false&#8221; custom_padding=&#8221;0px||0px||false|false&#8221; custom_css_main_element=&#8221;height: 100%;||z-index: 0;&#8221; global_colors_info=&#8221;{}&#8221; custom_css_main_element_last_edited=&#8221;off|desktop&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_enable_image=&#8221;off&#8221; custom_css_main_element=&#8221;height: calc(100vh &#8211; 100px);&#8221; global_colors_info=&#8221;{}&#8221; custom_css_main_element_last_edited=&#8221;on|desktop&#8221; custom_css_main_element_tablet=&#8221;height: 100vh;&#8221; custom_css_main_element_phone=&#8221;height: 100vh;&#8221;][et_pb_text module_class=&#8221;section-title-alpeor&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;Freight Disp Pro Italic||||||||&#8221; text_font_size=&#8221;24px&#8221; header_text_align=&#8221;center&#8221; header_text_color=&#8221;#FFFFFF&#8221; header_font_size=&#8221;70px&#8221; header_2_font_size=&#8221;80px&#8221; header_2_letter_spacing=&#8221;1px&#8221; text_orientation=&#8221;center&#8221; custom_margin=&#8221;70px||10px||false|false&#8221; custom_margin_tablet=&#8221;70px||10px||false|false&#8221; custom_margin_phone=&#8221;50px||||false|false&#8221; custom_margin_last_edited=&#8221;on|phone&#8221; header_font_size_tablet=&#8221;70px&#8221; header_font_size_phone=&#8221;50px&#8221; header_font_size_last_edited=&#8221;on|phone&#8221; header_2_font_size_tablet=&#8221;60px&#8221; header_2_font_size_phone=&#8221;45px&#8221; header_2_font_size_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h1>Nos soins<br \/>signature Spa<\/h1>\n<p>[\/et_pb_text][et_pb_code _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;]    <div id=\"alpeor-navigation-container\">\r\n        <div id=\"alpeor-navigation\"><\/div>\r\n    <\/div>\r\n\r\n    <script>\r\n    document.addEventListener(\"DOMContentLoaded\", function () {\r\n        console.log(\"\ud83d\udfe2 Initializing alpeor navigation \");\r\n        let sections = document.querySelectorAll(\".full-height-experience:not(.alpeor-footer)\");\r\n        console.log(\"\ud83d\udccb Found sections:\", sections.length);\r\n        let currentIndex = 0;\r\n        window.currentIndex = currentIndex;\r\n        let isScrolling = false;\r\n        let isLocked = false;\r\n        let isNavigating = false;\r\n        let targetIndex = null;\r\n        let lastScrollTime = 0;\r\n        const scrollCooldown = 800;\r\n        let lastWheelTime = 0;\r\n        const wheelDebounce = 250;\r\n        let scrollQueue = [];\r\n\r\n        let navContainer = document.getElementById('alpeor-navigation');\r\n        let dotWrappers = [];\r\n        let dotSize = 15;\r\n        let nextLabelVisible = null;\r\n\r\n        if (navContainer && sections.length > 0) {\r\n            console.log(\"\ud83d\udee0\ufe0f Building navigation dots\");\r\n            sections.forEach(function(section, index) {\r\n                let id = section.id;\r\n                if (id) {\r\n                    let formattedText = id.replace(\/-\/g, ' ').replace(\/\\b\\w\/g, c => c.toUpperCase());\r\n                    if (formattedText.toLowerCase() === 'conscious beauty') formattedText = 'Conscious<br>Beauty';\r\n                    if (formattedText.toLowerCase() === 'our commitments') formattedText = 'Our<br>Commitments';\r\n\r\n                    let dotWrapper = document.createElement('div');\r\n                    dotWrapper.classList.add('navigation-dot-wrapper');\r\n\r\n                    let link = document.createElement('a');\r\n                    link.href = 'javascript:void(0)';\r\n                    link.classList.add('navigation-link');\r\n                    link.dataset.section = id;\r\n\r\n                    let dot = document.createElement('div');\r\n                    dot.classList.add('navigation-dot');\r\n\r\n                    let label = document.createElement('span');\r\n                    label.classList.add('navigation-label');\r\n                    label.innerHTML = formattedText;\r\n\r\n                    link.appendChild(dot);\r\n                    link.appendChild(label);\r\n                    dotWrapper.appendChild(link);\r\n                    navContainer.appendChild(dotWrapper);\r\n\r\n                    dotWrappers.push(dotWrapper);\r\n                }\r\n            });\r\n\r\n            for (let i = 0; i < dotWrappers.length - 1; i++) {\r\n                let segment = document.createElement('div');\r\n                segment.classList.add('navigation-segment');\r\n                navContainer.appendChild(segment);\r\n            }\r\n\r\n            let totalHeight = navContainer.offsetHeight;\r\n            let spaceBetween = totalHeight \/ (dotWrappers.length - 1);\r\n\r\n            dotWrappers.forEach((wrapper, index) => {\r\n                let position = index * spaceBetween;\r\n                wrapper.style.position = 'absolute';\r\n                wrapper.style.top = position + 'px';\r\n\r\n                if (index < dotWrappers.length - 1) {\r\n                    let segment = document.querySelectorAll('.navigation-segment')[index];\r\n                    segment.style.position = 'absolute';\r\n                    segment.style.top = (position + dotSize) + 'px';\r\n                    segment.style.height = (spaceBetween - dotSize) + 'px';\r\n                }\r\n            });\r\n\r\n            let visibleIndex = getVisibleSectionIndex();\r\n            window.currentIndex = visibleIndex;\r\n            updateNavigationDots(visibleIndex);\r\n            console.log(\"\u2705 Navigation initialized, visibleIndex:\", visibleIndex);\r\n        } else {\r\n            console.error(\"\u274c No navContainer or sections found\");\r\n        }\r\n\r\n        function updateNavigationDots(index) {\r\n            let activeSection = sections[index];\r\n            if (!activeSection || !activeSection.id) {\r\n                console.warn(\"\u26a0\ufe0f Invalid active section at index:\", index);\r\n                return;\r\n            }\r\n\r\n            if (isNavigating && index !== targetIndex) {\r\n                console.log(\"\ud83d\udd07 Suppressing dot update during navigation:\", { currentIndex: index, targetIndex });\r\n                return;\r\n            }\r\n\r\n            let id = activeSection.id;\r\n\r\n            document.querySelectorAll('.navigation-dot').forEach(dot => {\r\n                dot.style.backgroundColor = 'transparent';\r\n                dot.style.pointerEvents = 'auto';\r\n                dot.style.opacity = '1';\r\n            });\r\n            document.querySelectorAll('.navigation-label').forEach(label => label.style.opacity = '0');\r\n            document.querySelectorAll('.navigation-link').forEach(link => link.style.pointerEvents = 'auto');\r\n            document.querySelectorAll('.navigation-dot-wrapper').forEach(w => w.classList.remove('next-active'));\r\n\r\n            let activeLink = document.querySelector('.navigation-link[data-section=\"' + id + '\"]');\r\n            if (!activeLink) {\r\n                console.warn(\"\u26a0\ufe0f No active link for section:\", id);\r\n                return;\r\n            }\r\n\r\n            let activeDot = activeLink.querySelector('.navigation-dot');\r\n            let activeLabel = activeLink.querySelector('.navigation-label');\r\n\r\n            if (activeDot) {\r\n                activeDot.style.backgroundColor = '#C6A992';\r\n                activeDot.style.pointerEvents = 'none';\r\n                activeDot.style.opacity = '1';\r\n            }\r\n            if (activeLabel) activeLabel.style.opacity = '0';\r\n\r\n            activeLink.style.pointerEvents = 'none';\r\n\r\n            let wrapper = activeLink.closest('.navigation-dot-wrapper');\r\n            let nextWrapper = wrapper ? wrapper.nextElementSibling : null;\r\n\r\n            if (nextWrapper && nextWrapper.classList.contains('navigation-dot-wrapper')) {\r\n                let nextDot = nextWrapper.querySelector('.navigation-dot');\r\n                let nextLabel = nextWrapper.querySelector('.navigation-label');\r\n                if (nextDot && nextLabel) {\r\n                    nextDot.style.opacity = '0';\r\n                    nextLabel.style.opacity = '1';\r\n                    nextWrapper.classList.add('next-active');\r\n                    nextLabelVisible = nextLabel;\r\n                }\r\n            } else {\r\n                nextLabelVisible = null;\r\n            }\r\n\r\n            console.log(\"\u2705 Dot updated for index:\", index);\r\n        }\r\n\r\n        function disableUserInputs() {\r\n            isLocked = true;\r\n            removeScrollListeners();\r\n            window.addEventListener(\"touchmove\", preventDefault, { passive: false });\r\n            window.addEventListener(\"wheel\", preventDefault, { passive: false });\r\n            window.addEventListener(\"keydown\", preventDefault, { passive: false });\r\n            window.addEventListener(\"click\", preventDefault, { passive: false });\r\n            document.querySelectorAll('.navigation-link').forEach(link => {\r\n                link.style.pointerEvents = 'none';\r\n            });\r\n        }\r\n\r\n        function enableUserInputs() {\r\n            isLocked = false;\r\n            if (window.innerWidth >= 1024) {\r\n                addScrollListeners();\r\n            }\r\n            window.removeEventListener(\"touchmove\", preventDefault);\r\n            window.removeEventListener(\"wheel\", preventDefault);\r\n            window.removeEventListener(\"keydown\", preventDefault);\r\n            window.removeEventListener(\"click\", preventDefault);\r\n            document.querySelectorAll('.navigation-link').forEach(link => {\r\n                link.style.pointerEvents = 'auto';\r\n            });\r\n            document.body.style.overflow = '';\r\n        }\r\n\r\n        function preventDefault(e) {\r\n            if (isScrolling || isLocked) {\r\n                const target = e.target.closest('.full-height-experience');\r\n                const footer = document.querySelector(\".alpeor-footer\");\r\n                if (target && target.scrollHeight > target.clientHeight && !isAtBoundary(target)) {\r\n                    console.log(\"\u2705 Allowing internal section scrolling\");\r\n                    return; \/\/ Allow internal scrolling\r\n                }\r\n                if (footer && footer.getBoundingClientRect().top <= window.innerHeight + 100) {\r\n                    console.log(\"\u2705 Allowing footer scrolling\");\r\n                    return; \/\/ Allow footer scrolling\r\n                }\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n                console.log(\"\ud83d\uded1 Event blocked:\", e.type);\r\n            }\r\n        }\r\n\r\n        function isAtBoundary(section) {\r\n            const atBottom = section.scrollTop + section.clientHeight >= section.scrollHeight - 5;\r\n            const atTop = section.scrollTop <= 5;\r\n            return atBottom || atTop;\r\n        }\r\n\r\n        function isScrollable(section) {\r\n            return section.scrollHeight > section.clientHeight + 1;\r\n        }\r\n\r\n        function scrollToSection(index) {\r\n    if (index < 0 || index >= sections.length) return;\r\n\r\n    if (isScrolling || isLocked) {\r\n        scrollQueue = [index];\r\n        return;\r\n    }\r\n\r\n    const now = Date.now();\r\n    if (now - lastScrollTime < scrollCooldown) return;\r\n    lastScrollTime = now;\r\n\r\n    isScrolling = true;\r\n    disableUserInputs();\r\n\r\n    let offsetAdjustment = (index > 0 && window.innerWidth >= 1024) ? -21 : 0;\r\n    const targetTop = sections[index].offsetTop - offsetAdjustment;\r\n    const startTop = window.scrollY;\r\n    const distance = targetTop - startTop;\r\n    const duration = 800; \/\/ smoothness duration in ms\r\n    const easing = t => t < 0.5\r\n        ? 4 * t * t * t\r\n        : 1 - Math.pow(-2 * t + 2, 3) \/ 2; \/\/ easeInOutCubic\r\n\r\n    let startTime = null;\r\n\r\n    function animateScroll(timestamp) {\r\n        if (!startTime) startTime = timestamp;\r\n        const elapsed = timestamp - startTime;\r\n        const progress = Math.min(elapsed \/ duration, 1);\r\n        const eased = easing(progress);\r\n\r\n        window.scrollTo(0, startTop + distance * eased);\r\n\r\n        if (elapsed < duration) {\r\n            requestAnimationFrame(animateScroll);\r\n        } else {\r\n            isScrolling = false;\r\n            isNavigating = false;\r\n            targetIndex = null;\r\n            enableUserInputs();\r\n            updateNavigationDots(index);\r\n\r\n            if (scrollQueue.length > 0) {\r\n                const nextIndex = scrollQueue.shift();\r\n                isNavigating = true;\r\n                targetIndex = nextIndex;\r\n                scrollToSection(nextIndex);\r\n            }\r\n        }\r\n    }\r\n\r\n    requestAnimationFrame(animateScroll);\r\n}\r\n\r\n\r\n        function handleScroll(event) {\r\n            const now = Date.now();\r\n            if (now - lastWheelTime < wheelDebounce || isScrolling || isLocked || window.innerWidth < 1024 || window.justNavigated) {\r\n                console.log(\"\ud83d\uded1 Scroll blocked:\", { isScrolling, isLocked, isMobile: window.innerWidth < 1024, justNavigated: window.justNavigated });\r\n                event.preventDefault();\r\n                event.stopPropagation();\r\n                return;\r\n            }\r\n            lastWheelTime = now;\r\n\r\n            \/\/ Sync currentIndex with visible section\r\n            currentIndex = getVisibleSectionIndex();\r\n            window.currentIndex = currentIndex;\r\n\r\n            const footer = document.querySelector(\".alpeor-footer\");\r\n            if (footer && footer.getBoundingClientRect().top <= window.innerHeight + 100) {\r\n                console.log(\"\u2705 Footer near or in view, allowing free scroll\");\r\n                return;\r\n            }\r\n\r\n            let section = sections[currentIndex];\r\n            let scrollable = isScrollable(section);\r\n            let atBottom = section.scrollTop + section.clientHeight >= section.scrollHeight - 5;\r\n            let atTop = section.scrollTop <= 5;\r\n\r\n            console.log(\"\ud83d\udccf Scroll position:\", {\r\n                scrollTop: section.scrollTop,\r\n                clientHeight: section.clientHeight,\r\n                scrollHeight: section.scrollHeight,\r\n                atTop,\r\n                atBottom,\r\n                isScrollable: scrollable\r\n            });\r\n\r\n            const deltaThreshold = 10;\r\n            let delta = Math.abs(event.deltaY) > deltaThreshold ? Math.sign(event.deltaY) : 0;\r\n\r\n            \/*if (scrollable && !atBottom && delta > 0) {\r\n                console.log(\"\ud83d\udd04 Scrolling inside section (down)\", {\r\n                    scrollTop: section.scrollTop,\r\n                    clientHeight: section.clientHeight,\r\n                    scrollHeight: section.scrollHeight\r\n                });\r\n                return;\r\n            }\r\n            if (scrollable && !atTop && delta < 0) {\r\n                console.log(\"\ud83d\udd04 Scrolling inside section (up)\", {\r\n                    scrollTop: section.scrollTop,\r\n                    clientHeight: section.clientHeight,\r\n                    scrollHeight: section.scrollHeight\r\n                });\r\n                return;\r\n            }*\/\r\n\t\t\t\r\n\t\t\tif (\r\n\t\t\t\t(currentIndex === sections.length - 1 && delta > 0) || \r\n\t\t\t\t(currentIndex === 0 && delta < 0)\r\n\t\t\t) {\r\n\t\t\t\tconsole.log(\"\u2705 At boundary, allow normal scroll\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (scrollable && !atBottom && delta > 0) return;\r\n\t\t\tif (scrollable && !atTop && delta < 0) return;\r\n\t\t\t\r\n            if (delta !== 0) {\r\n                event.preventDefault();\r\n                event.stopPropagation();\r\n\r\n                if (scrollable && atBottom && delta > 0) {\r\n                    console.log(\"\ud83d\udd04 Boundary hit: bottom of scrollable section, snapping down\");\r\n                } else if (scrollable && atTop && delta < 0) {\r\n                    console.log(\"\ud83d\udd04 Boundary hit: top of scrollable section, snapping up\");\r\n                }\r\n\r\n                currentIndex += delta > 0 ? 1 : -1;\r\n                currentIndex = Math.max(0, Math.min(currentIndex, sections.length - 1));\r\n                window.currentIndex = currentIndex;\r\n                scrollToSection(currentIndex);\r\n            }\r\n        }\r\n\r\n        function handleKeyDown(event) {\r\n            if (isScrolling || isLocked) return;\r\n\r\n            currentIndex = window.currentIndex;\r\n            let section = sections[currentIndex];\r\n            let scrollable = isScrollable(section);\r\n            let atBottom = section.scrollTop + section.clientHeight >= section.scrollHeight - 5;\r\n            let atTop = section.scrollTop <= 5;\r\n\r\n            if ((event.key === \"ArrowDown\" && (!scrollable || atBottom)) ||\r\n                (event.key === \"ArrowUp\" && (!scrollable || atTop))) {\r\n                currentIndex += (event.key === \"ArrowDown\") ? 1 : -1;\r\n                currentIndex = Math.max(0, Math.min(currentIndex, sections.length - 1));\r\n                window.currentIndex = currentIndex;\r\n                scrollToSection(currentIndex);\r\n            }\r\n        }\r\n\r\n        function addScrollListeners() {\r\n\t\t\tconst isHomePage = window.location.pathname === \"\/\" \r\n\t\t\t\t\t\t\t   || document.body.classList.contains(\"home\"); \/\/ WP\/HTML flexibility\r\n\r\n\t\t\tif (isHomePage) {\r\n\t\t\t\t\/\/ \u2705 Homepage \u2192 old snap logic\r\n\t\t\t\twindow.addEventListener(\"wheel\", handleScroll, { passive: false });\r\n\t\t\t\tconsole.log(\"\ud83c\udfe0 Homepage scroll behavior applied\");\r\n\t\t\t} else {\r\n\t\t\t\t\/\/ \u2705 Other pages \u2192 hybrid logic\r\n\t\t\t\twindow.addEventListener(\"wheel\", function(e) {\r\n\t\t\t\t\tconst currentSection = sections[currentIndex];\r\n\t\t\t\t\tconst sectionHeight = currentSection.scrollHeight;\r\n\t\t\t\t\tconst viewportHeight = window.innerHeight;\r\n\r\n\t\t\t\t\tif (sectionHeight <= viewportHeight) {\r\n\t\t\t\t\t\t\/*console.log('test section');\r\n\t\t\t\t\t\t\/\/ Small section \u2192 snap\r\n\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\tif (e.deltaY > 0) {\r\n\t\t\t\t\t\t\tscrollToSection(currentIndex + 1);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tscrollToSection(currentIndex - 1);\r\n\t\t\t\t\t\t}*\/\r\n\t\t\t\t\t\twindow.addEventListener(\"wheel\", handleScroll, { passive: false });\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\/\/ Big\/tall section \u2192 normal scroll but update nav\r\n\t\t\t\t\t\tsections.forEach((section, idx) => {\r\n\t\t\t\t\t\t\tconst rect = section.getBoundingClientRect();\r\n\t\t\t\t\t\t\tif (rect.top <= viewportHeight * 0.4 && rect.bottom >= viewportHeight * 0.4) {\r\n\t\t\t\t\t\t\t\tif (currentIndex !== idx) {\r\n\t\t\t\t\t\t\t\t\tcurrentIndex = idx;\r\n\t\t\t\t\t\t\t\t\tupdateNavigationDots(idx);\r\n\t\t\t\t\t\t\t\t\tconsole.log(\"\ud83d\udd04 Updated currentIndex in tall section:\", idx);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}, { passive: false });\r\n\r\n\t\t\t\tconsole.log(\"\ud83d\udcc4 Inner page scroll behavior applied\");\r\n\t\t\t}\r\n\r\n\t\t\t\/\/ \u2705 Common key navigation\r\n\t\t\twindow.addEventListener(\"keydown\", handleKeyDown, { passive: false });\r\n\t\t\tconsole.log(\"\ud83d\udfe2 Scroll listeners added\");\r\n\t\t}\r\n\r\n\r\n\r\n        function removeScrollListeners() {\r\n            window.removeEventListener(\"wheel\", handleScroll);\r\n            window.removeEventListener(\"keydown\", handleKeyDown);\r\n            console.log(\"\ud83d\udfe1 Scroll listeners removed\");\r\n        }\r\n\r\n        window.addEventListener('load', () => {\r\n            if (window.innerWidth >= 1024) {\r\n                addScrollListeners();\r\n            }\r\n        });\r\n\r\n        const observer = new IntersectionObserver((entries) => {\r\n            entries.forEach(entry => {\r\n                console.log(\"\ud83d\udc40 IntersectionObserver triggered:\", {\r\n                    index: Array.from(sections).indexOf(entry.target),\r\n                    isIntersecting: entry.isIntersecting\r\n                });\r\n                if (entry.isIntersecting) {\r\n                    const index = Array.from(sections).indexOf(entry.target);\r\n                    window.currentIndex = index;\r\n                    updateNavigationDots(index);\r\n                    console.log(\"\ud83d\udc40 IntersectionObserver updated currentIndex:\", index);\r\n                }\r\n            });\r\n        }, {\r\n            threshold: window.innerWidth < 1024 ? 0.3 : 0.6\r\n        });\r\n\r\n        sections.forEach(section => observer.observe(section));\r\n\r\n        document.querySelectorAll('.navigation-link').forEach(link => {\r\n            link.addEventListener('click', function(event) {\r\n                event.preventDefault();\r\n\r\n                const sectionId = this.dataset.section;\r\n                const target = document.getElementById(sectionId);\r\n                if (!target) return;\r\n\r\n                const index = Array.from(sections).indexOf(target);\r\n                if (index === -1) return;\r\n\r\n                isNavigating = true;\r\n                targetIndex = index;\r\n                scrollToSection(index);\r\n                window.currentIndex = index;\r\n                console.log(\"\ud83d\udd17 Navigation link clicked, navigating to index:\", index, { isNavigating });\r\n            });\r\n        });\r\n\r\n        function getVisibleSectionIndex() {\r\n            let maxVisibleHeight = 0;\r\n            let minTopDistance = Infinity;\r\n            let visibleIndex = 0;\r\n\r\n            sections.forEach((section, index) => {\r\n                const rect = section.getBoundingClientRect();\r\n                const visibleHeight = Math.min(rect.bottom, window.innerHeight) - Math.max(rect.top, 0);\r\n                const isMobile = window.innerWidth < 1024;\r\n\r\n                console.log(\"\ud83d\udd0d Section visibility:\", {\r\n                    index,\r\n                    visibleHeight,\r\n                    sectionHeight: rect.height,\r\n                    rectTop: rect.top,\r\n                    isMobile\r\n                });\r\n\r\n                if (isMobile) {\r\n                    \/\/ Mobile\/tablet: Prioritize largest visible height or closest to viewport top\r\n                    if (visibleHeight > maxVisibleHeight || (visibleHeight === maxVisibleHeight && Math.abs(rect.top) < minTopDistance)) {\r\n                        maxVisibleHeight = visibleHeight;\r\n                        minTopDistance = Math.abs(rect.top);\r\n                        visibleIndex = index;\r\n                    }\r\n                } else {\r\n                    \/\/ Desktop: Use ratio-based visibility\r\n                    const ratio = Math.max(0, visibleHeight \/ rect.height);\r\n                    if (ratio > maxVisibleHeight) {\r\n                        maxVisibleHeight = ratio;\r\n                        visibleIndex = index;\r\n                    }\r\n                }\r\n            });\r\n\r\n            return visibleIndex;\r\n        }\r\n    });\r\n    <\/script>\r\n    [\/et_pb_code][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_2,1_2&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; width=&#8221;70%&#8221; custom_margin=&#8221;40px||40px||true|false&#8221; custom_margin_tablet=&#8221;40px||0px||false|false&#8221; custom_margin_phone=&#8221;40px||0px||false|false&#8221; custom_margin_last_edited=&#8221;on|tablet&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_2&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_body_font||||||||&#8221; text_text_color=&#8221;#2d2d2d&#8221; text_font_size=&#8221;16px&#8221; width=&#8221;100%&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>Bienvenue dans l\u2019univers de soins exclusifs Alpeor. Vivez un somptueux voyage jusqu\u2019aux cimes enneig\u00e9es et pr\u00e9serv\u00e9es des Alpes suisses l\u00e0 o\u00f9 fleurissent nos pr\u00e9cieuses plantes alpines\u2026 une v\u00e9ritable invitation au l\u00e2cher-prise, dans un \u00e9crin luxueux qui semble comme hors du temps.<\/p>\n<p>Les protocoles professionnels d\u2019Alpeor ont \u00e9t\u00e9 \u00e9tudi\u00e9s pour faire de chaque soin et partout dans le monde une parenth\u00e8se enchant\u00e9e de bien-\u00eatre et de revitalisation ultime.  Que vous choisissiez un soin \u00e9claircissant ciblant l\u2019\u00e9clat du teint ou un soin anti-\u00e2ge d\u2019exception, nos Expertes Beaut\u00e9 allieront la parfaite ma\u00eetrise du geste \u00e0 l\u2019\u00e9veil des sens pour vous offrir une profonde sensation de bien-\u00eatre et une peau \u00e9clatante de beaut\u00e9.<\/p>\n<p>[\/et_pb_text][et_pb_text content_tablet=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_last_edited=&#8221;off|tablet&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_heading_font||on||||||&#8221; text_text_color=&#8221;#195852&#8243; text_font_size=&#8221;30px&#8221; text_line_height=&#8221;1em&#8221; custom_margin=&#8221;||20px||false|false&#8221; custom_padding=&#8221;||||false|false&#8221; text_orientation_tablet=&#8221;&#8221; text_orientation_phone=&#8221;left&#8221; text_orientation_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]Uplifting spa treatments at home[\/et_pb_text][et_pb_text _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_body_font||||||||&#8221; text_text_color=&#8221;#2d2d2d&#8221; text_font_size=&#8221;16px&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>Prolongez la sensation de bien-\u00eatre et les effets anti-\u00e2ge de votre soin spa en emportant chez vous une s\u00e9lection de nos produits. Nos Expertes Beaut\u00e9 vous conseillent sur votre rituel de soins personnalis\u00e9, parfaitement adapt\u00e9 aux attentes et envies du moment.<\/p>\n<p>[\/et_pb_text][et_pb_text module_class=&#8221;description-alpeor&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;Freight Disp Pro Italic||||||||&#8221; text_font_size=&#8221;24px&#8221; text_letter_spacing=&#8221;1px&#8221; text_line_height=&#8221;1.4em&#8221; header_2_font_size=&#8221;80px&#8221; max_width=&#8221;300px&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>Contactez notre conseill\u00e8re beaut\u00e9 pour une consultation personnalis\u00e9e sur les soins de la peau.<\/p>\n<p>[\/et_pb_text][et_pb_button button_text=&#8221;We are here for you&#8221; module_class=&#8221;contact-form-alpeor&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_button=&#8221;on&#8221; button_text_size=&#8221;17px&#8221; button_text_color=&#8221;#ffffff&#8221; button_bg_color=&#8221;#195852&#8243; button_border_width=&#8221;1px&#8221; button_border_color=&#8221;#195852&#8243; button_border_radius=&#8221;1px&#8221; button_use_icon=&#8221;off&#8221; custom_padding=&#8221;8px|25px|8px|25px|true|true&#8221; global_colors_info=&#8221;{}&#8221; button_text_color__hover_enabled=&#8221;on|desktop&#8221; button_text_color__hover=&#8221;#195852&#8243; button_bg_color__hover_enabled=&#8221;on|desktop&#8221; button_bg_color__hover=&#8221;#FFFFFF&#8221; button_bg_enable_color__hover=&#8221;on&#8221;][\/et_pb_button][\/et_pb_column][et_pb_column type=&#8221;1_2&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_color=&#8221;#195852&#8243; custom_padding=&#8221;5%|8%|5%|5%|true|false&#8221; custom_padding_tablet=&#8221;10%|10%|10%|10%|true|true&#8221; custom_padding_phone=&#8221;10%||||false|false&#8221; custom_padding_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_text content_tablet=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_last_edited=&#8221;off|tablet&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_heading_font||on||||||&#8221; text_text_color=&#8221;#FFFFFF&#8221; text_font_size=&#8221;30px&#8221; text_line_height=&#8221;1em&#8221; custom_margin=&#8221;||20px||false|false&#8221; custom_padding=&#8221;||||false|false&#8221; text_orientation_tablet=&#8221;&#8221; text_orientation_phone=&#8221;left&#8221; text_orientation_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>Premium Ultitude : le soin visage anti-\u00e2ge ultime, sign\u00e9 Alpeor<\/p>\n<p>[\/et_pb_text][et_pb_text _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_body_font||||||||&#8221; text_text_color=&#8221;#FFFFFF&#8221; text_font_size=&#8221;16px&#8221; global_colors_info=&#8221;{}&#8221;]Enjoy an expert luxury spa treatment for intense rejuvenation, infused with the rich botanical powers of Iris and Narcissus, and enhanced with a firming exclusive facial massage. Skin elasticity is visibly improved for total youthful radiance. Cellular vitality is boosted and the cells\u2019 natural renewal process is optimized.[\/et_pb_text][et_pb_text _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;Freight Disp Pro Italic||||||||&#8221; text_text_color=&#8221;#FFFFFF&#8221; text_font_size=&#8221;24px&#8221; text_letter_spacing=&#8221;1px&#8221; text_line_height=&#8221;1.4em&#8221; header_2_font_size=&#8221;80px&#8221; global_colors_info=&#8221;{}&#8221;]Get in touch for more information about our spa treatments:[\/et_pb_text][et_pb_button button_text=&#8221;We are here for you&#8221; module_class=&#8221;contact-form-alpeor&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_button=&#8221;on&#8221; button_text_size=&#8221;17px&#8221; button_text_color=&#8221;#195852&#8243; button_bg_color=&#8221;#FFFFFF&#8221; button_border_width=&#8221;1px&#8221; button_border_color=&#8221;#FFFFFF&#8221; button_border_radius=&#8221;1px&#8221; button_use_icon=&#8221;off&#8221; custom_padding=&#8221;8px|25px|8px|25px|true|true&#8221; global_colors_info=&#8221;{}&#8221; button_text_color__hover_enabled=&#8221;on|hover&#8221; button_text_color__hover=&#8221;#FFFFFF&#8221; button_bg_color__hover_enabled=&#8221;on|desktop&#8221; button_bg_color__hover=&#8221;#195852&#8243; button_bg_enable_color__hover=&#8221;on&#8221;][\/et_pb_button][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8221;1&#8243; custom_padding_last_edited=&#8221;on|phone&#8221; module_id=&#8221;experience&#8221; module_class=&#8221;full-height-experience&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_margin=&#8221;||||false|false&#8221; custom_padding=&#8221;0px||0px||false|false&#8221; custom_padding_tablet=&#8221;0px||0px||true|false&#8221; custom_padding_phone=&#8221;0px||0px||false|false&#8221; custom_css_main_element=&#8221;z-index: -1;&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row column_structure=&#8221;1_2,1_2&#8243; make_equal=&#8221;on&#8221; custom_padding_last_edited=&#8221;on|tablet&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; width=&#8221;100%&#8221; width_tablet=&#8221;70%&#8221; width_phone=&#8221;70%&#8221; width_last_edited=&#8221;on|tablet&#8221; max_width=&#8221;1920px&#8221; max_width_tablet=&#8221;1080px&#8221; max_width_phone=&#8221;1080px&#8221; max_width_last_edited=&#8221;on|tablet&#8221; custom_margin=&#8221;0px||0px||false|false&#8221; custom_padding=&#8221;50px||||false|false&#8221; custom_padding_tablet=&#8221;30px||||false|false&#8221; custom_padding_phone=&#8221;20px||||false|false&#8221; custom_css_main_element=&#8221;height: 100%;||z-index: 0;&#8221; global_colors_info=&#8221;{}&#8221; custom_css_main_element_last_edited=&#8221;off|desktop&#8221;][et_pb_column type=&#8221;1_2&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_padding=&#8221;|||15%|false|false&#8221; custom_padding_tablet=&#8221;|||0%|false|false&#8221; custom_padding_phone=&#8221;|||0%|false|false&#8221; custom_padding_last_edited=&#8221;on|tablet&#8221; custom_css_main_element=&#8221;height: 85vh;||display: flex;||flex-direction: column;||justify-content: center;||&#8221; global_colors_info=&#8221;{}&#8221; custom_css_main_element_last_edited=&#8221;on|desktop&#8221; custom_css_main_element_tablet=&#8221;display: flex;||flex-direction: column;||justify-content: center;&#8221; custom_css_main_element_phone=&#8221;display: flex;||flex-direction: column;||justify-content: center;&#8221;][et_pb_text content_tablet=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_last_edited=&#8221;off|tablet&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_heading_font||on||||||&#8221; text_text_color=&#8221;#195852&#8243; text_font_size=&#8221;30px&#8221; text_line_height=&#8221;1em&#8221; custom_margin=&#8221;||10px||false|false&#8221; custom_padding=&#8221;||||false|false&#8221; text_orientation_tablet=&#8221;&#8221; text_orientation_phone=&#8221;left&#8221; text_orientation_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]The Experience[\/et_pb_text][et_pb_text module_class=&#8221;section-title-alpeor&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;Freight Disp Pro Italic||||||||&#8221; text_font_size=&#8221;24px&#8221; header_2_font_size=&#8221;80px&#8221; header_2_letter_spacing=&#8221;1px&#8221; custom_margin=&#8221;||10px||false|false&#8221; header_2_font_size_tablet=&#8221;60px&#8221; header_2_font_size_phone=&#8221;45px&#8221; header_2_font_size_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2>Des soins spa de luxe pour une jeunesse pr\u00e9serv\u00e9e et durablement prolong\u00e9e<\/h2>\n<p>[\/et_pb_text][et_pb_text module_class=&#8221;description-alpeor&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;Freight Disp Pro Italic||||||||&#8221; text_font_size=&#8221;24px&#8221; text_letter_spacing=&#8221;1px&#8221; text_line_height=&#8221;1.6em&#8221; header_2_font_size=&#8221;80px&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>Pousser les portes de l\u2019univers magique des soins spa by Alpeor, c\u2019est la promesse d\u2019exp\u00e9rimenter un rituel beaut\u00e9 o\u00f9 bien-\u00eatre et revitalisation atteignent de nouveaux sommets. Les accords parfaits des formules \u00e0 base de plantes alpines suisses, des textures et de la gestuelle offrent une odyss\u00e9e exceptionnelle o\u00f9 chaque instant c\u00e9l\u00e8bre l\u2019\u00e9veil des sens, l\u2019\u00e9clat et la jeunesse de la peau.<\/p>\n<p>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;1_2&#8243; module_class=&#8221;empty-to-display&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/spa-massage-en-suisse-geneve-lausanne.jpg&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_2,1_2&#8243; make_equal=&#8221;on&#8221; custom_padding_last_edited=&#8221;on|phone&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; width=&#8221;70%&#8221; custom_margin=&#8221;40px||40px||true|false&#8221; custom_margin_tablet=&#8221;0px||0px||false|false&#8221; custom_margin_phone=&#8221;40px||0px||false|false&#8221; custom_margin_last_edited=&#8221;on|tablet&#8221; custom_padding_tablet=&#8221;&#8221; custom_padding_phone=&#8221;0px||||false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_2&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_css_main_element=&#8221;display: flex;||align-items: center&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_text module_class=&#8221;section-title-alpeor&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;Freight Disp Pro Italic||||||||&#8221; text_font_size=&#8221;24px&#8221; header_2_font_size=&#8221;80px&#8221; header_2_letter_spacing=&#8221;1px&#8221; custom_margin=&#8221;||10px||false|false&#8221; header_2_font_size_tablet=&#8221;60px&#8221; header_2_font_size_phone=&#8221;45px&#8221; header_2_font_size_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2>L\u2019exp\u00e9rience<br \/>Spa<\/h2>\n<p>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;1_2&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_padding=&#8221;15px||||false|false&#8221; custom_padding_tablet=&#8221;0px||||false|false&#8221; custom_padding_phone=&#8221;0px||||false|false&#8221; custom_padding_last_edited=&#8221;on|tablet&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_body_font||||||||&#8221; text_text_color=&#8221;#2d2d2d&#8221; text_font_size=&#8221;16px&#8221; global_colors_info=&#8221;{}&#8221;]Every Alpeor luxury spa treatment is a sensory delight, filled with the regenerating energy of the Swiss Alps. Immerse yourself in luxurious spa rituals, developed by our spa and skin experts &#038; experience a variety of face and body treatments designed to meet the highest expectations of skin revitalization and total relaxation.<\/p>\n<p>Breathe deeply and let our high-tech products and advanced anti-aging protocols wash over you\u2026 A blissful avalanche of wellbeing and skin rejuvenation to increase tissue oxygenation, plump, firm, lift, brighten, and smooth, infusing skin with new life and radiance.[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row module_class=&#8221;plain-photo&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; width=&#8221;100%&#8221; max_width=&#8221;1920px&#8221; custom_margin_tablet=&#8221;100px||||false|false&#8221; custom_margin_phone=&#8221;40px||||false|false&#8221; custom_margin_last_edited=&#8221;on|phone&#8221; custom_padding=&#8221;0px||0px||false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_css_main_element=&#8221;z-index: 1 !important;&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_image src=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/spa-de-luxe-suisse-luxury-spa-switzerland.jpg&#8221; alt=&#8221;spa-de-luxe-suisse-luxury-spa-switzerland&#8221; title_text=&#8221;spa-de-luxe-suisse-luxury-spa-switzerland&#8221; align=&#8221;center&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; module_alignment=&#8221;center&#8221; custom_css_main_element=&#8221;width: 100% !important;&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_image][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8221;1&#8243; custom_padding_last_edited=&#8221;on|phone&#8221; module_id=&#8221;spa-locator&#8221; module_class=&#8221;full-height-experience&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_margin=&#8221;||||false|false&#8221; custom_padding=&#8221;0px||0px||false|false&#8221; custom_padding_tablet=&#8221;0px||0px||true|false&#8221; custom_padding_phone=&#8221;0px||0px||false|false&#8221; custom_css_main_element=&#8221;z-index: -1;&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row make_equal=&#8221;on&#8221; custom_padding_last_edited=&#8221;on|phone&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; width=&#8221;100%&#8221; width_tablet=&#8221;70%&#8221; width_phone=&#8221;70%&#8221; width_last_edited=&#8221;on|tablet&#8221; max_width=&#8221;1920px&#8221; max_width_tablet=&#8221;1080px&#8221; max_width_phone=&#8221;1080px&#8221; max_width_last_edited=&#8221;on|tablet&#8221; custom_margin=&#8221;0px||0px||false|false&#8221; custom_padding=&#8221;50px||||false|false&#8221; custom_padding_tablet=&#8221;50px||||false|false&#8221; custom_padding_phone=&#8221;40px||||false|false&#8221; custom_css_main_element=&#8221;z-index: 0;&#8221; border_width_top=&#8221;0px&#8221; border_color_top=&#8221;#c6a992&#8243; global_colors_info=&#8221;{}&#8221; custom_css_main_element_last_edited=&#8221;off|desktop&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_padding=&#8221;|||15%|false|false&#8221; custom_padding_tablet=&#8221;|||0%|false|false&#8221; custom_padding_phone=&#8221;|||0%|false|false&#8221; custom_padding_last_edited=&#8221;on|tablet&#8221; custom_css_main_element=&#8221;||&#8221; global_colors_info=&#8221;{}&#8221; custom_css_main_element_last_edited=&#8221;off|desktop&#8221; custom_css_main_element_tablet=&#8221;display: flex;||flex-direction: column;||justify-content: center;&#8221; custom_css_main_element_phone=&#8221;display: flex;||flex-direction: column;||justify-content: center;&#8221;][et_pb_text content_tablet=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_last_edited=&#8221;off|tablet&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_heading_font||on||||||&#8221; text_text_color=&#8221;#195852&#8243; text_font_size=&#8221;30px&#8221; text_line_height=&#8221;1em&#8221; module_alignment=&#8221;left&#8221; custom_margin=&#8221;||10px||false|false&#8221; custom_padding=&#8221;||||false|false&#8221; text_orientation_tablet=&#8221;&#8221; text_orientation_phone=&#8221;left&#8221; text_orientation_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>LOCALISATEUR DE MAGASINS ET DE SPAS<\/p>\n<p>[\/et_pb_text][et_pb_text module_class=&#8221;section-title-alpeor&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;Freight Disp Pro Italic||||||||&#8221; text_font_size=&#8221;24px&#8221; header_2_font_size=&#8221;80px&#8221; header_2_letter_spacing=&#8221;1px&#8221; max_width=&#8221;400px&#8221; module_alignment=&#8221;left&#8221; custom_margin=&#8221;||10px||false|false&#8221; header_2_font_size_tablet=&#8221;60px&#8221; header_2_font_size_phone=&#8221;45px&#8221; header_2_font_size_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2>Produits et destinations spa de luxe<\/h2>\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_3,1_3,1_3&#8243; make_equal=&#8221;on&#8221; custom_padding_last_edited=&#8221;on|tablet&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; width=&#8221;70%&#8221; width_tablet=&#8221;70%&#8221; width_phone=&#8221;70%&#8221; width_last_edited=&#8221;on|tablet&#8221; max_width_tablet=&#8221;1080px&#8221; max_width_phone=&#8221;1080px&#8221; max_width_last_edited=&#8221;on|tablet&#8221; custom_padding=&#8221;||||false|false&#8221; custom_padding_tablet=&#8221;0px||||false|false&#8221; custom_padding_phone=&#8221;0px||||false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/05\/hotel-horlogers.jpg&#8221; background_size=&#8221;contain&#8221; global_colors_info=&#8221;{}&#8221; background__hover_enabled=&#8221;on|hover&#8221; background_image__hover=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/05\/hotel-horlogers-hover.jpg&#8221; background_enable_image__hover=&#8221;on&#8221;][et_pb_image src=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/05\/hotel-horlogers.jpg&#8221; alt=&#8221;hotel-horlogers&#8221; title_text=&#8221;hotel-horlogers&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; hover_enabled=&#8221;0&#8243; custom_css_main_element=&#8221;opacity: 0;||&#8221; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;][\/et_pb_image][\/et_pb_column][et_pb_column type=&#8221;1_3&#8243; admin_label=&#8221;Column&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/11\/Property-1Variant2.jpg&#8221; background_size=&#8221;contain&#8221; global_colors_info=&#8221;{}&#8221; background__hover_enabled=&#8221;on|hover&#8221; background_image__hover=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/05\/Le-mirador-hover.jpg&#8221; background_enable_image__hover=&#8221;on&#8221;][et_pb_image alt=&#8221;hotel-horloger&#8221; title_text=&#8221;Property 1=Default&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; hover_enabled=&#8221;0&#8243; custom_css_main_element=&#8221;opacity: 0;||&#8221; global_colors_info=&#8221;{}&#8221; src=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/11\/Property-1Default.jpg&#8221; sticky_enabled=&#8221;0&#8243;][\/et_pb_image][\/et_pb_column][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/grand-hotel-bella-tola.jpg&#8221; background_size=&#8221;contain&#8221; global_colors_info=&#8221;{}&#8221; background__hover_enabled=&#8221;on|hover&#8221; background_image__hover=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/grand-hotel-bella-tola-hover.jpg&#8221; background_enable_image__hover=&#8221;on&#8221;][et_pb_image src=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/hotel-horloger.jpg&#8221; alt=&#8221;hotel-horloger&#8221; title_text=&#8221;hotel-horloger&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_css_main_element=&#8221;opacity: 0;||&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_image][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_3,1_3,1_3&#8243; make_equal=&#8221;on&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; width=&#8221;70%&#8221; width_tablet=&#8221;70%&#8221; width_phone=&#8221;70%&#8221; width_last_edited=&#8221;on|tablet&#8221; max_width_tablet=&#8221;1080px&#8221; max_width_phone=&#8221;1080px&#8221; max_width_last_edited=&#8221;on|tablet&#8221; custom_margin=&#8221;0px||||false|false&#8221; custom_padding=&#8221;0px||||false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/badrutts-palace.jpg&#8221; background_size=&#8221;contain&#8221; global_colors_info=&#8221;{}&#8221; background__hover_enabled=&#8221;on|hover&#8221; background_image__hover=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/badrutts-palace-hover.jpg&#8221; background_enable_image__hover=&#8221;on&#8221;][et_pb_image src=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/hotel-horloger.jpg&#8221; alt=&#8221;hotel-horloger&#8221; title_text=&#8221;hotel-horloger&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_css_main_element=&#8221;opacity: 0;||&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_image][\/et_pb_column][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/imperial-palace.jpg&#8221; background_size=&#8221;contain&#8221; global_colors_info=&#8221;{}&#8221; background__hover_enabled=&#8221;on|hover&#8221; background_image__hover=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/imperial-palace-hover.jpg&#8221; background_enable_image__hover=&#8221;on&#8221;][et_pb_image src=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/hotel-horloger.jpg&#8221; alt=&#8221;hotel-horloger&#8221; title_text=&#8221;hotel-horloger&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_css_main_element=&#8221;opacity: 0;||&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_image][\/et_pb_column][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/au-coeur-du-village.jpg&#8221; background_size=&#8221;contain&#8221; global_colors_info=&#8221;{}&#8221; background__hover_enabled=&#8221;on|hover&#8221; background_image__hover=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/au-coeur-du-village-hover.jpg&#8221; background_enable_image__hover=&#8221;on&#8221;][et_pb_image src=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/hotel-horloger.jpg&#8221; alt=&#8221;hotel-horloger&#8221; title_text=&#8221;hotel-horloger&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_css_main_element=&#8221;opacity: 0;||&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_image][\/et_pb_column][\/et_pb_row][et_pb_row make_equal=&#8221;on&#8221; module_class=&#8221;alp-filter-row&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; width=&#8221;70%&#8221; width_tablet=&#8221;70%&#8221; width_phone=&#8221;70%&#8221; width_last_edited=&#8221;on|tablet&#8221; max_width_tablet=&#8221;1080px&#8221; max_width_phone=&#8221;1080px&#8221; max_width_last_edited=&#8221;on|tablet&#8221; custom_margin=&#8221;||100px||false|false&#8221; custom_margin_tablet=&#8221;|||30px|false|false&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_text module_class=&#8221;section-title-alpeor&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;Freight Disp Pro Italic||||||||&#8221; text_font_size=&#8221;24px&#8221; header_2_font_size=&#8221;80px&#8221; header_2_letter_spacing=&#8221;1px&#8221; custom_margin=&#8221;|||30px|false|false&#8221; custom_margin_tablet=&#8221;|||30px|false|false&#8221; custom_margin_phone=&#8221;|||0px|false|false&#8221; custom_margin_last_edited=&#8221;on|phone&#8221; custom_padding=&#8221;||30px||false|false&#8221; custom_padding_tablet=&#8221;||10px||false|false&#8221; custom_padding_phone=&#8221;||10px||false|false&#8221; custom_padding_last_edited=&#8221;on|tablet&#8221; header_2_font_size_tablet=&#8221;60px&#8221; header_2_font_size_phone=&#8221;45px&#8221; header_2_font_size_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2>En savoir plus<\/h2>\n<p>[\/et_pb_text][et_pb_text module_class=&#8221;alpeor-pays-filter&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_margin_tablet=&#8221;&#8221; custom_margin_phone=&#8221;20px||0px||false|false&#8221; custom_margin_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_text][et_pb_code _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_margin_tablet=&#8221;&#8221; custom_margin_phone=&#8221;0px||||false|false&#8221; custom_margin_last_edited=&#8221;on|phone&#8221; custom_padding_tablet=&#8221;&#8221; custom_padding_phone=&#8221;0px||||false|false&#8221; custom_padding_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<div class=\"alpeor-destination-list\"><script>\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n    const paysFilterContainer = document.querySelector(\".alpeor-pays-filter\");\r\n    if (!paysFilterContainer) return;\r\n\r\n    fetch(\"https:\/\/alpeorv2.aif-staging.com\/wp-admin\/admin-ajax.php?action=alpeor_get_all_pays\")\r\n        .then(response => response.json())\r\n        .then(data => {\r\n            if (data.length > 0) {\r\n                data.forEach(pays => {\r\n                    const btn = document.createElement(\"button\");\r\n                    btn.classList.add(\"alpeor-filter-btn\");\r\n                    btn.textContent = pays;\r\n                    btn.dataset.pays = pays;\r\n                    paysFilterContainer.appendChild(btn);\r\n                });\r\n            }\r\n        });\r\n});\r\n<\/script><script>\r\ndocument.addEventListener(\"click\", function(e) {\r\n    if (e.target.matches(\".alpeor-filter-btn\")) {\r\n        e.preventDefault();\r\n\r\n        \/\/ Mettre \u00e0 jour la classe active\r\n        document.querySelectorAll(\".alpeor-filter-btn\").forEach(btn => {\r\n            btn.classList.remove(\"selected\");\r\n        });\r\n        e.target.classList.add(\"selected\");\r\n\r\n        const pays = e.target.dataset.pays;\r\n        const destinationList = document.querySelector(\".alpeor-destination-list\");\r\n\r\n        const formData = new FormData();\r\n        formData.append(\"action\", \"alpeor_filter_destinations\");\r\n        formData.append(\"pays_filter\", pays);\r\n\r\n        fetch(\"https:\/\/alpeorv2.aif-staging.com\/wp-admin\/admin-ajax.php\", {\r\n            method: \"POST\",\r\n            body: formData\r\n        })\r\n        .then(res => res.text())\r\n        .then(html => {\r\n            destinationList.innerHTML = html;\r\n        });\r\n    }\r\n});\r\n<\/script><div class=\"alpeor-destination-category\"><div class=\"alpeor-destination-category-label\">Parfumeries et magasins s\u00e9lectifs<\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Taizo Parfumerie<\/h3><\/div><div class=\"alpeor-destination-address\">120 Rue d&#039;Antibe, 6400, Cannes<\/div><div class=\"alpeor-destination-phone\">+33 4 93 39 57 58<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Parfumerie Werlen<\/h3><\/div><div class=\"alpeor-destination-address\">Av. de la Gare 22, 1920, Martigny<\/div><div class=\"alpeor-destination-phone\">+41 27 722 66 16<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Pharmacie Croix de Coeur<\/h3><\/div><div class=\"alpeor-destination-address\">Rte des Creux 4, 1936, Verbier<\/div><div class=\"alpeor-destination-phone\">+41 27 771 39 90<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Pharmacie du Jazz<\/h3><\/div><div class=\"alpeor-destination-address\">Grand Rue 5, 1820, Montreux<\/div><div class=\"alpeor-destination-phone\">+41 21 963 09 09<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Pharmacie M\u00e9tro Ouchy<\/h3><\/div><div class=\"alpeor-destination-address\">Place de la Navigation 6, 1006, Lausanne<\/div><div class=\"alpeor-destination-phone\">+41 21 612 03 03<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Pharmacie Principale Chavannes<\/h3><\/div><div class=\"alpeor-destination-address\">Chemin Industriel 1, 1279, Chavannes-de-Bogis<\/div><div class=\"alpeor-destination-phone\">+41 22 776 72 70<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Pharmacie Principale La Praille<\/h3><\/div><div class=\"alpeor-destination-address\">Route des Jeunes 10, 1212, Grand-Lancy<\/div><div class=\"alpeor-destination-phone\">+41 22 827 02 80<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Drogerie Stebler<\/h3><\/div><div class=\"alpeor-destination-address\">Quaderstrasse 8, 7000, Chur<\/div><div class=\"alpeor-destination-phone\">+41 81 252 36 62<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Pharmacie Testa Grigia<\/h3><\/div><div class=\"alpeor-destination-address\">Bahnhofstrasse 21, 3920, Zermatt<\/div><div class=\"alpeor-destination-phone\">+41 27 966 49 49<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Pharmacie Principale Conf\u00e9d\u00e9ration<\/h3><\/div><div class=\"alpeor-destination-address\">Passage de la Monnaie 3, 1204, Gen\u00e8ve<\/div><div class=\"alpeor-destination-phone\">+41 22 318 66 60<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Pharmacie de Cologny<\/h3><\/div><div class=\"alpeor-destination-address\">Place du Manoir 20, 1223, Cologny<\/div><div class=\"alpeor-destination-phone\">+41 22 735 35 84<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Casagrande<\/h3><\/div><div class=\"alpeor-destination-address\">Grendelstrasse 6, 6004, Luzern<\/div><div class=\"alpeor-destination-phone\">+41 41 418 60 77<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Parf\u00fcmerie Hyazinth<\/h3><\/div><div class=\"alpeor-destination-address\">Falknerstrasse 17, 4001, Basel<\/div><div class=\"alpeor-destination-phone\">+41 61 261 65 64<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Swiss Luxury Store<\/h3><\/div><div class=\"alpeor-destination-address\">Grundstrasse 54, 3818, Grindelwald<\/div><div class=\"alpeor-destination-phone\">+41 33 853 85 85<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>DROPA Drogerie Apotheke Interlaken Ost<\/h3><\/div><div class=\"alpeor-destination-address\">Untere B\u00f6nigstrasse 12, 3800, Interlaken<\/div><div class=\"alpeor-destination-phone\">+41 33 823 80 30<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Pharmacieplus Fleury<\/h3><\/div><div class=\"alpeor-destination-address\">Rue Centrale 123, 1884, Villars-sur-Ollon<\/div><div class=\"alpeor-destination-phone\">+41 24 495 11 22<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Parf\u00fcmerie Osswald<\/h3><\/div><div class=\"alpeor-destination-address\">Bahnhofstrasse 17, 8001, Z\u00fcrich<\/div><div class=\"alpeor-destination-phone\">+41 44 211 20 30<\/div><\/div><\/div><div class=\"alpeor-destination-category\"><div class=\"alpeor-destination-category-label\">H\u00f4tels et spas<\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>H\u00f4tel Spa au C\u0153ur du Village<\/h3><div class=\"alpeor-destination-stars\"><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><\/div><\/div><div class=\"alpeor-destination-address\">26 Mont\u00e9e du Ch\u00e2teau, 74220, La Clusaz<\/div><div class=\"alpeor-destination-phone\">+33 4 50 01 50 01<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Imp\u00e9rial Palace<\/h3><div class=\"alpeor-destination-stars\"><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><\/div><\/div><div class=\"alpeor-destination-address\">All\u00e9e de l&#039;Imp\u00e9rial, 74000, Annecy<\/div><div class=\"alpeor-destination-phone\">+33 4 50 09 30 00<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Hotel Badrutt&#8217;s Palace<\/h3><div class=\"alpeor-destination-stars\"><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><\/div><\/div><div class=\"alpeor-destination-address\">Via Serlas 27, 7500, St. Moritz<\/div><div class=\"alpeor-destination-phone\">+41 81 837 26 25<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Beatus Wellness- &#038; Spa-Hotel<\/h3><div class=\"alpeor-destination-stars\"><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><\/div><\/div><div class=\"alpeor-destination-address\">Seestrasse 300, 2658, Merligen<\/div><div class=\"alpeor-destination-phone\">+41 33 252 81 74<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Wellness &#038; Spa Hotel Ermitage<\/h3><div class=\"alpeor-destination-stars\"><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><\/div><\/div><div class=\"alpeor-destination-address\">Dorfstrasse 46, 3778, Sch\u00f6nried<\/div><div class=\"alpeor-destination-phone\">+41 33 748 60 60<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Grand H\u00f4tel Bella Tola &#038; St-Luc<\/h3><div class=\"alpeor-destination-stars\"><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><\/div><\/div><div class=\"alpeor-destination-address\">Route Principale 8, 3961, St-Luc<\/div><div class=\"alpeor-destination-phone\">+41 27 475 14 44<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Le Mirador Resort &amp; Spa by Alpeor<\/h3><div class=\"alpeor-destination-stars\"><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><\/div><\/div><div class=\"alpeor-destination-address\">Chemin de l'h\u00f4tel Mirador 5, 1801, Le Mont Pelerin<\/div><div class=\"alpeor-destination-phone\">+41 21 925 17 70<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>H\u00f4tel des Horlogers - Spa by Alpeor<\/h3><div class=\"alpeor-destination-stars\"><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><span style=\"color: #C6A992;\">&#9733;<\/span><\/div><\/div><div class=\"alpeor-destination-address\">Route de France 8, 1348, Le Brassus<\/div><div class=\"alpeor-destination-phone\">+41 21 845 08 45<\/div><\/div><\/div><div class=\"alpeor-destination-category\"><div class=\"alpeor-destination-category-label\">Cliniques et salons de beaut\u00e9<\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Skin Premium Lounge<\/h3><\/div><div class=\"alpeor-destination-address\">Witikonerstrasse 3, 8032, Z\u00fcrich<\/div><div class=\"alpeor-destination-phone\">+41 44 382 31 71<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Art cosmetics Yvonne<\/h3><\/div><div class=\"alpeor-destination-address\">Bahnhofstrasse 10, 3900, Brig<\/div><div class=\"alpeor-destination-phone\">+41 27 923 10 10<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Madreperla Cosmetica<\/h3><\/div><div class=\"alpeor-destination-address\">Theaterplatz 4, 5400, Baden<\/div><div class=\"alpeor-destination-phone\">+41 56 282 48 00<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Votre Beaut\u00e9 Cosmetic<\/h3><\/div><div class=\"alpeor-destination-address\">Gerechtigkeitsgasse 57 3011 Bern<\/div><div class=\"alpeor-destination-phone\">+41 31 351 81 00<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Lumi&#8217;Art Esth\u00e9tique<\/h3><\/div><div class=\"alpeor-destination-address\">Rue de Vevey 42, 1630, Bulle<\/div><div class=\"alpeor-destination-phone\">+41 26 565 42 40<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Belle Cosmetic<\/h3><\/div><div class=\"alpeor-destination-address\">Ringstrasse 22, 5452, Oberrohrdorf<\/div><div class=\"alpeor-destination-phone\">+41 56 496 60 00<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Institut R\u00eave de Douceur<\/h3><\/div><div class=\"alpeor-destination-address\">Route des H\u00f4tels 24, 1884, Villars-sur-Ollon<\/div><div class=\"alpeor-destination-phone\">+41 76 483 50 98<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Istituto di bellezza Via Nassa<\/h3><\/div><div class=\"alpeor-destination-address\">Piazzetta San Carlo 2, 6900, Lugano<\/div><div class=\"alpeor-destination-phone\">+41 91 923 86 45<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Clinique Les Alpes<\/h3><\/div><div class=\"alpeor-destination-address\">Route de Sonloup 37, 1833, Les Avants<\/div><div class=\"alpeor-destination-phone\">+41 58 360 55 20<\/div><\/div><\/div><\/div>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>","protected":false},"excerpt":{"rendered":"<p>Signature SpaTreatments    <div id=\"alpeor-navigation-container\">\r\n        <div id=\"alpeor-navigation\"><\/div>\r\n    <\/div>\r\n\r\n    <script>\r\n    document.addEventListener(\"DOMContentLoaded\", function () {\r\n        console.log(\"\ud83d\udfe2 Initializing alpeor navigation \");\r\n        let sections = document.querySelectorAll(\".full-height-experience:not(.alpeor-footer)\");\r\n        console.log(\"\ud83d\udccb Found sections:\", sections.length);\r\n        let currentIndex = 0;\r\n        window.currentIndex = currentIndex;\r\n        let isScrolling = false;\r\n        let isLocked = false;\r\n        let isNavigating = false;\r\n        let targetIndex = null;\r\n        let lastScrollTime = 0;\r\n        const scrollCooldown = 800;\r\n        let lastWheelTime = 0;\r\n        const wheelDebounce = 250;\r\n        let scrollQueue = [];\r\n\r\n        let navContainer = document.getElementById('alpeor-navigation');\r\n        let dotWrappers = [];\r\n        let dotSize = 15;\r\n        let nextLabelVisible = null;\r\n\r\n        if (navContainer && sections.length > 0) {\r\n            console.log(\"\ud83d\udee0\ufe0f Building navigation dots\");\r\n            sections.forEach(function(section, index) {\r\n                let id = section.id;\r\n                if (id) {\r\n                    let formattedText = id.replace(\/-\/g, ' ').replace(\/\\b\\w\/g, c => c.toUpperCase());\r\n                    if (formattedText.toLowerCase() === 'conscious beauty') formattedText = 'Conscious<br>Beauty';\r\n                    if (formattedText.toLowerCase() === 'our commitments') formattedText = 'Our<br>Commitments';\r\n\r\n                    let dotWrapper = document.createElement('div');\r\n                    dotWrapper.classList.add('navigation-dot-wrapper');\r\n\r\n                    let link = document.createElement('a');\r\n                    link.href = 'javascript:void(0)';\r\n                    link.classList.add('navigation-link');\r\n                    link.dataset.section = id;\r\n\r\n                    let dot = document.createElement('div');\r\n                    dot.classList.add('navigation-dot');\r\n\r\n                    let label = document.createElement('span');\r\n                    label.classList.add('navigation-label');\r\n                    label.innerHTML = formattedText;\r\n\r\n                    link.appendChild(dot);\r\n                    link.appendChild(label);\r\n                    dotWrapper.appendChild(link);\r\n                    navContainer.appendChild(dotWrapper);\r\n\r\n                    dotWrappers.push(dotWrapper);\r\n                }\r\n            });\r\n\r\n            for (let i = 0; i < dotWrappers.length - 1; i++) {\r\n                let segment = document.createElement('div');\r\n                segment.classList.add('navigation-segment');\r\n                navContainer.appendChild(segment);\r\n            }\r\n\r\n            let totalHeight = navContainer.offsetHeight;\r\n            let spaceBetween = totalHeight \/ (dotWrappers.length - 1);\r\n\r\n            dotWrappers.forEach((wrapper, index) => {\r\n                let position = index * spaceBetween;\r\n                wrapper.style.position = 'absolute';\r\n                wrapper.style.top = position + 'px';\r\n\r\n                if (index < dotWrappers.length - 1) {\r\n                    let segment = document.querySelectorAll('.navigation-segment')[index];\r\n                    segment.style.position = 'absolute';\r\n                    segment.style.top = (position + dotSize) + 'px';\r\n                    segment.style.height = (spaceBetween - dotSize) + 'px';\r\n                }\r\n            });\r\n\r\n            let visibleIndex = getVisibleSectionIndex();\r\n            window.currentIndex = visibleIndex;\r\n            updateNavigationDots(visibleIndex);\r\n            console.log(\"\u2705 Navigation initialized, visibleIndex:\", visibleIndex);\r\n        } else {\r\n            console.error(\"\u274c No navContainer or sections found\");\r\n        }\r\n\r\n        function updateNavigationDots(index) {\r\n            let activeSection = sections[index];\r\n            if (!activeSection || !activeSection.id) {\r\n                console.warn(\"\u26a0\ufe0f Invalid active section at index:\", index);\r\n                return;\r\n            }\r\n\r\n            if (isNavigating && index !== targetIndex) {\r\n                console.log(\"\ud83d\udd07 Suppressing dot update during navigation:\", { currentIndex: index, targetIndex });\r\n                return;\r\n            }\r\n\r\n            let id = activeSection.id;\r\n\r\n            document.querySelectorAll('.navigation-dot').forEach(dot => {\r\n                dot.style.backgroundColor = 'transparent';\r\n                dot.style.pointerEvents = 'auto';\r\n                dot.style.opacity = '1';\r\n            });\r\n            document.querySelectorAll('.navigation-label').forEach(label => label.style.opacity = '0');\r\n            document.querySelectorAll('.navigation-link').forEach(link => link.style.pointerEvents = 'auto');\r\n            document.querySelectorAll('.navigation-dot-wrapper').forEach(w => w.classList.remove('next-active'));\r\n\r\n            let activeLink = document.querySelector('.navigation-link[data-section=\"' + id + '\"]');\r\n            if (!activeLink) {\r\n                console.warn(\"\u26a0\ufe0f No active link for section:\", id);\r\n                return;\r\n            }\r\n\r\n            let activeDot = activeLink.querySelector('.navigation-dot');\r\n            let activeLabel = activeLink.querySelector('.navigation-label');\r\n\r\n            if (activeDot) {\r\n                activeDot.style.backgroundColor = '#C6A992';\r\n                activeDot.style.pointerEvents = 'none';\r\n                activeDot.style.opacity = '1';\r\n            }\r\n            if (activeLabel) activeLabel.style.opacity = '0';\r\n\r\n            activeLink.style.pointerEvents = 'none';\r\n\r\n            let wrapper = activeLink.closest('.navigation-dot-wrapper');\r\n            let nextWrapper = wrapper ? wrapper.nextElementSibling : null;\r\n\r\n            if (nextWrapper && nextWrapper.classList.contains('navigation-dot-wrapper')) {\r\n                let nextDot = nextWrapper.querySelector('.navigation-dot');\r\n                let nextLabel = nextWrapper.querySelector('.navigation-label');\r\n                if (nextDot && nextLabel) {\r\n                    nextDot.style.opacity = '0';\r\n                    nextLabel.style.opacity = '1';\r\n                    nextWrapper.classList.add('next-active');\r\n                    nextLabelVisible = nextLabel;\r\n                }\r\n            } else {\r\n                nextLabelVisible = null;\r\n            }\r\n\r\n            console.log(\"\u2705 Dot updated for index:\", index);\r\n        }\r\n\r\n        function disableUserInputs() {\r\n            isLocked = true;\r\n            removeScrollListeners();\r\n            window.addEventListener(\"touchmove\", preventDefault, { passive: false });\r\n            window.addEventListener(\"wheel\", preventDefault, { passive: false });\r\n            window.addEventListener(\"keydown\", preventDefault, { passive: false });\r\n            window.addEventListener(\"click\", preventDefault, { passive: false });\r\n            document.querySelectorAll('.navigation-link').forEach(link => {\r\n                link.style.pointerEvents = 'none';\r\n            });\r\n        }\r\n\r\n        function enableUserInputs() {\r\n            isLocked = false;\r\n            if (window.innerWidth >= 1024) {\r\n                addScrollListeners();\r\n            }\r\n            window.removeEventListener(\"touchmove\", preventDefault);\r\n            window.removeEventListener(\"wheel\", preventDefault);\r\n            window.removeEventListener(\"keydown\", preventDefault);\r\n            window.removeEventListener(\"click\", preventDefault);\r\n            document.querySelectorAll('.navigation-link').forEach(link => {\r\n                link.style.pointerEvents = 'auto';\r\n            });\r\n            document.body.style.overflow = '';\r\n        }\r\n\r\n        function preventDefault(e) {\r\n            if (isScrolling || isLocked) {\r\n                const target = e.target.closest('.full-height-experience');\r\n                const footer = document.querySelector(\".alpeor-footer\");\r\n                if (target && target.scrollHeight > target.clientHeight && !isAtBoundary(target)) {\r\n                    console.log(\"\u2705 Allowing internal section scrolling\");\r\n                    return; \/\/ Allow internal scrolling\r\n                }\r\n                if (footer && footer.getBoundingClientRect().top <= window.innerHeight + 100) {\r\n                    console.log(\"\u2705 Allowing footer scrolling\");\r\n                    return; \/\/ Allow footer scrolling\r\n                }\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n                console.log(\"\ud83d\uded1 Event blocked:\", e.type);\r\n            }\r\n        }\r\n\r\n        function isAtBoundary(section) {\r\n            const atBottom = section.scrollTop + section.clientHeight >= section.scrollHeight - 5;\r\n            const atTop = section.scrollTop <= 5;\r\n            return atBottom || atTop;\r\n        }\r\n\r\n        function isScrollable(section) {\r\n            return section.scrollHeight > section.clientHeight + 1;\r\n        }\r\n\r\n        function scrollToSection(index) {\r\n    if (index < 0 || index >= sections.length) return;\r\n\r\n    if (isScrolling || isLocked) {\r\n        scrollQueue = [index];\r\n        return;\r\n    }\r\n\r\n    const now = Date.now();\r\n    if (now - lastScrollTime < scrollCooldown) return;\r\n    lastScrollTime = now;\r\n\r\n    isScrolling = true;\r\n    disableUserInputs();\r\n\r\n    let offsetAdjustment = (index > 0 && window.innerWidth >= 1024) ? -21 : 0;\r\n    const targetTop = sections[index].offsetTop - offsetAdjustment;\r\n    const startTop = window.scrollY;\r\n    const distance = targetTop - startTop;\r\n    const duration = 800; \/\/ smoothness duration in ms\r\n    const easing = t => t < 0.5\r\n        ? 4 * t * t * t\r\n        : 1 - Math.pow(-2 * t + 2, 3) \/ 2; \/\/ easeInOutCubic\r\n\r\n    let startTime = null;\r\n\r\n    function animateScroll(timestamp) {\r\n        if (!startTime) startTime = timestamp;\r\n        const elapsed = timestamp - startTime;\r\n        const progress = Math.min(elapsed \/ duration, 1);\r\n        const eased = easing(progress);\r\n\r\n        window.scrollTo(0, startTop + distance * eased);\r\n\r\n        if (elapsed < duration) {\r\n            requestAnimationFrame(animateScroll);\r\n        } else {\r\n            isScrolling = false;\r\n            isNavigating = false;\r\n            targetIndex = null;\r\n            enableUserInputs();\r\n            updateNavigationDots(index);\r\n\r\n            if (scrollQueue.length > 0) {\r\n                const nextIndex = scrollQueue.shift();\r\n                isNavigating = true;\r\n                targetIndex = nextIndex;\r\n                scrollToSection(nextIndex);\r\n            }\r\n        }\r\n    }\r\n\r\n    requestAnimationFrame(animateScroll);\r\n}\r\n\r\n\r\n        function handleScroll(event) {\r\n            const now = Date.now();\r\n            if (now - lastWheelTime < wheelDebounce || isScrolling || isLocked || window.innerWidth < 1024 || window.justNavigated) {\r\n                console.log(\"\ud83d\uded1 Scroll blocked:\", { isScrolling, isLocked, isMobile: window.innerWidth < 1024, justNavigated: window.justNavigated });\r\n                event.preventDefault();\r\n                event.stopPropagation();\r\n                return;\r\n            }\r\n            lastWheelTime = now;\r\n\r\n            \/\/ Sync currentIndex with visible section\r\n            currentIndex = getVisibleSectionIndex();\r\n            window.currentIndex = currentIndex;\r\n\r\n            const footer = document.querySelector(\".alpeor-footer\");\r\n            if (footer && footer.getBoundingClientRect().top <= window.innerHeight + 100) {\r\n                console.log(\"\u2705 Footer near or in view, allowing free scroll\");\r\n                return;\r\n            }\r\n\r\n            let section = sections[currentIndex];\r\n            let scrollable = isScrollable(section);\r\n            let atBottom = section.scrollTop + section.clientHeight >= section.scrollHeight - 5;\r\n            let atTop = section.scrollTop <= 5;\r\n\r\n            console.log(\"\ud83d\udccf Scroll position:\", {\r\n                scrollTop: section.scrollTop,\r\n                clientHeight: section.clientHeight,\r\n                scrollHeight: section.scrollHeight,\r\n                atTop,\r\n                atBottom,\r\n                isScrollable: scrollable\r\n            });\r\n\r\n            const deltaThreshold = 10;\r\n            let delta = Math.abs(event.deltaY) > deltaThreshold ? Math.sign(event.deltaY) : 0;\r\n\r\n            \/*if (scrollable && !atBottom && delta > 0) {\r\n                console.log(\"\ud83d\udd04 Scrolling inside section (down)\", {\r\n                    scrollTop: section.scrollTop,\r\n                    clientHeight: section.clientHeight,\r\n                    scrollHeight: section.scrollHeight\r\n                });\r\n                return;\r\n            }\r\n            if (scrollable && !atTop && delta < 0) {\r\n                console.log(\"\ud83d\udd04 Scrolling inside section (up)\", {\r\n                    scrollTop: section.scrollTop,\r\n                    clientHeight: section.clientHeight,\r\n                    scrollHeight: section.scrollHeight\r\n                });\r\n                return;\r\n            }*\/\r\n\t\t\t\r\n\t\t\tif (\r\n\t\t\t\t(currentIndex === sections.length - 1 && delta > 0) || \r\n\t\t\t\t(currentIndex === 0 && delta < 0)\r\n\t\t\t) {\r\n\t\t\t\tconsole.log(\"\u2705 At boundary, allow normal scroll\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (scrollable && !atBottom && delta > 0) return;\r\n\t\t\tif (scrollable && !atTop && delta < 0) return;\r\n\t\t\t\r\n            if (delta !== 0) {\r\n                event.preventDefault();\r\n                event.stopPropagation();\r\n\r\n                if (scrollable && atBottom && delta > 0) {\r\n                    console.log(\"\ud83d\udd04 Boundary hit: bottom of scrollable section, snapping down\");\r\n                } else if (scrollable && atTop && delta < 0) {\r\n                    console.log(\"\ud83d\udd04 Boundary hit: top of scrollable section, snapping up\");\r\n                }\r\n\r\n                currentIndex += delta > 0 ? 1 : -1;\r\n                currentIndex = Math.max(0, Math.min(currentIndex, sections.length - 1));\r\n                window.currentIndex = currentIndex;\r\n                scrollToSection(currentIndex);\r\n            }\r\n        }\r\n\r\n        function handleKeyDown(event) {\r\n            if (isScrolling || isLocked) return;\r\n\r\n            currentIndex = window.currentIndex;\r\n            let section = sections[currentIndex];\r\n            let scrollable = isScrollable(section);\r\n            let atBottom = section.scrollTop + section.clientHeight >= section.scrollHeight - 5;\r\n            let atTop = section.scrollTop <= 5;\r\n\r\n            if ((event.key === \"ArrowDown\" && (!scrollable || atBottom)) ||\r\n                (event.key === \"ArrowUp\" && (!scrollable || atTop))) {\r\n                currentIndex += (event.key === \"ArrowDown\") ? 1 : -1;\r\n                currentIndex = Math.max(0, Math.min(currentIndex, sections.length - 1));\r\n                window.currentIndex = currentIndex;\r\n                scrollToSection(currentIndex);\r\n            }\r\n        }\r\n\r\n        function addScrollListeners() {\r\n\t\t\tconst isHomePage = window.location.pathname === \"\/\" \r\n\t\t\t\t\t\t\t   || document.body.classList.contains(\"home\"); \/\/ WP\/HTML flexibility\r\n\r\n\t\t\tif (isHomePage) {\r\n\t\t\t\t\/\/ \u2705 Homepage \u2192 old snap logic\r\n\t\t\t\twindow.addEventListener(\"wheel\", handleScroll, { passive: false });\r\n\t\t\t\tconsole.log(\"\ud83c\udfe0 Homepage scroll behavior applied\");\r\n\t\t\t} else {\r\n\t\t\t\t\/\/ \u2705 Other pages \u2192 hybrid logic\r\n\t\t\t\twindow.addEventListener(\"wheel\", function(e) {\r\n\t\t\t\t\tconst currentSection = sections[currentIndex];\r\n\t\t\t\t\tconst sectionHeight = currentSection.scrollHeight;\r\n\t\t\t\t\tconst viewportHeight = window.innerHeight;\r\n\r\n\t\t\t\t\tif (sectionHeight <= viewportHeight) {\r\n\t\t\t\t\t\t\/*console.log('test section');\r\n\t\t\t\t\t\t\/\/ Small section \u2192 snap\r\n\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\tif (e.deltaY > 0) {\r\n\t\t\t\t\t\t\tscrollToSection(currentIndex + 1);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tscrollToSection(currentIndex - 1);\r\n\t\t\t\t\t\t}*\/\r\n\t\t\t\t\t\twindow.addEventListener(\"wheel\", handleScroll, { passive: false });\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\/\/ Big\/tall section \u2192 normal scroll but update nav\r\n\t\t\t\t\t\tsections.forEach((section, idx) => {\r\n\t\t\t\t\t\t\tconst rect = section.getBoundingClientRect();\r\n\t\t\t\t\t\t\tif (rect.top <= viewportHeight * 0.4 && rect.bottom >= viewportHeight * 0.4) {\r\n\t\t\t\t\t\t\t\tif (currentIndex !== idx) {\r\n\t\t\t\t\t\t\t\t\tcurrentIndex = idx;\r\n\t\t\t\t\t\t\t\t\tupdateNavigationDots(idx);\r\n\t\t\t\t\t\t\t\t\tconsole.log(\"\ud83d\udd04 Updated currentIndex in tall section:\", idx);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}, { passive: false });\r\n\r\n\t\t\t\tconsole.log(\"\ud83d\udcc4 Inner page scroll behavior applied\");\r\n\t\t\t}\r\n\r\n\t\t\t\/\/ \u2705 Common key navigation\r\n\t\t\twindow.addEventListener(\"keydown\", handleKeyDown, { passive: false });\r\n\t\t\tconsole.log(\"\ud83d\udfe2 Scroll listeners added\");\r\n\t\t}\r\n\r\n\r\n\r\n        function removeScrollListeners() {\r\n            window.removeEventListener(\"wheel\", handleScroll);\r\n            window.removeEventListener(\"keydown\", handleKeyDown);\r\n            console.log(\"\ud83d\udfe1 Scroll listeners removed\");\r\n        }\r\n\r\n        window.addEventListener('load', () => {\r\n            if (window.innerWidth >= 1024) {\r\n                addScrollListeners();\r\n            }\r\n        });\r\n\r\n        const observer = new IntersectionObserver((entries) => {\r\n            entries.forEach(entry => {\r\n                console.log(\"\ud83d\udc40 IntersectionObserver triggered:\", {\r\n                    index: Array.from(sections).indexOf(entry.target),\r\n                    isIntersecting: entry.isIntersecting\r\n                });\r\n                if (entry.isIntersecting) {\r\n                    const index = Array.from(sections).indexOf(entry.target);\r\n                    window.currentIndex = index;\r\n                    updateNavigationDots(index);\r\n                    console.log(\"\ud83d\udc40 IntersectionObserver updated currentIndex:\", index);\r\n                }\r\n            });\r\n        }, {\r\n            threshold: window.innerWidth < 1024 ? 0.3 : 0.6\r\n        });\r\n\r\n        sections.forEach(section => observer.observe(section));\r\n\r\n        document.querySelectorAll('.navigation-link').forEach(link => {\r\n            link.addEventListener('click', function(event) {\r\n                event.preventDefault();\r\n\r\n                const sectionId = this.dataset.section;\r\n                const target = document.getElementById(sectionId);\r\n                if (!target) return;\r\n\r\n                const index = Array.from(sections).indexOf(target);\r\n                if (index === -1) return;\r\n\r\n                isNavigating = true;\r\n                targetIndex = index;\r\n                scrollToSection(index);\r\n                window.currentIndex = index;\r\n                console.log(\"\ud83d\udd17 Navigation link clicked, navigating to index:\", index, { isNavigating });\r\n            });\r\n        });\r\n\r\n        function getVisibleSectionIndex() {\r\n            let maxVisibleHeight = 0;\r\n            let minTopDistance = Infinity;\r\n            let visibleIndex = 0;\r\n\r\n            sections.forEach((section, index) => {\r\n                const rect = section.getBoundingClientRect();\r\n                const visibleHeight = Math.min(rect.bottom, window.innerHeight) - Math.max(rect.top, 0);\r\n                const isMobile = window.innerWidth < 1024;\r\n\r\n                console.log(\"\ud83d\udd0d Section visibility:\", {\r\n                    index,\r\n                    visibleHeight,\r\n                    sectionHeight: rect.height,\r\n                    rectTop: rect.top,\r\n                    isMobile\r\n                });\r\n\r\n                if (isMobile) {\r\n                    \/\/ Mobile\/tablet: Prioritize largest visible height or closest to viewport top\r\n                    if (visibleHeight > maxVisibleHeight || (visibleHeight === maxVisibleHeight && Math.abs(rect.top) < minTopDistance)) {\r\n                        maxVisibleHeight = visibleHeight;\r\n                        minTopDistance = Math.abs(rect.top);\r\n                        visibleIndex = index;\r\n                    }\r\n                } else {\r\n                    \/\/ Desktop: Use ratio-based visibility\r\n                    const ratio = Math.max(0, visibleHeight \/ rect.height);\r\n                    if (ratio > maxVisibleHeight) {\r\n                        maxVisibleHeight = ratio;\r\n                        visibleIndex = index;\r\n                    }\r\n                }\r\n            });\r\n\r\n            return visibleIndex;\r\n        }\r\n    });\r\n    <\/script>\r\n    When you step into a Spa by Alpeor you are transported to the fresh, reviving summits of the Swiss Alps where you can enjoy a choice of targeted spa face treatments and body care rituals to suit your needs. Alpeor\u2019s professional protocols have been developed to offer an exclusive, identical experience in our selection [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"class_list":["post-31874","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/pages\/31874","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/comments?post=31874"}],"version-history":[{"count":65,"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/pages\/31874\/revisions"}],"predecessor-version":[{"id":34359,"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/pages\/31874\/revisions\/34359"}],"wp:attachment":[{"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/media?parent=31874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}