{"id":31874,"date":"2025-03-20T17:35:17","date_gmt":"2025-03-20T17:35:17","guid":{"rendered":"https:\/\/alpeor.com\/?page_id=31874"},"modified":"2026-04-20T14:04:15","modified_gmt":"2026-04-20T14:04:15","slug":"luxury-spa-treatments","status":"publish","type":"page","link":"https:\/\/alpeor.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;https:\/\/alpeor.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>Signature Spa<br \/>Treatments<\/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(\"???? Initializing alpeor navigation \");\r\n        let sections = document.querySelectorAll(\".full-height-experience:not(.alpeor-footer)\");\r\n        console.log(\"???? 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        \/\/ \u2705 JP detection: \/jp OR <html lang=\"ja...\">\r\n        const pathSegs = window.location.pathname.split('\/').filter(Boolean);\r\n        const isJPPath = (pathSegs[0] || '').toLowerCase() === 'jp';\r\n        const htmlLang = (document.documentElement.getAttribute('lang') || '').toLowerCase();\r\n        const isJPLang = htmlLang.startsWith('ja');\r\n        const isJP = isJPPath || isJPLang;\r\n\r\n        \/\/ \u2705 JP labels mapped to SECTION IDS (ids stay EN)\r\n        const JP_LABELS_BY_ID = {\r\n            \"conscious-beauty\": \"\u30b3\u30f3\u30b7\u30e3\u30b9<br>\u30d3\u30e5\u30fc\u30c6\u30a3\u30fc\",\r\n            \"our-commitments\": \"\u79c1\u305f\u3061\u306e<br>\u30b3\u30df\u30c3\u30c8\u30e1\u30f3\u30c8\",\r\n            \"the-experience\": \"\u4f53\u9a13\",\r\n            \"collections\": \"\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\",\r\n            \"the-science\": \"\u30b5\u30a4\u30a8\u30f3\u30b9\",\r\n            \"rituals\": \"\u30ea\u30c1\u30e5\u30a2\u30eb\",\r\n            \"bestsellers\": \"\u30d9\u30b9\u30c8\u30bb\u30e9\u30fc\",\r\n            \"the-brand\": \"\u30d6\u30e9\u30f3\u30c9\",\r\n            \"signature\": \"\u30b7\u30b0\u30cd\u30c1\u30e3\u30fc\",\r\n            \"experience\": \"\u4f53\u9a13\",\r\n            \"spa-locator\": \"\u30b9\u30d1\u691c\u7d22\"\r\n        };\r\n\r\n        if (navContainer && sections.length > 0) {\r\n            console.log(\"????\ufe0f Building navigation dots\");\r\n            sections.forEach(function(section, index) {\r\n                let id = section.id;\r\n                if (id) {\r\n                    \/\/ === ORIGINAL label generation (EN) ===\r\n                    let formattedText = id.replace(\/-\/g, ' ').replace(\/\\b\\w\/g, c => c.toUpperCase());\r\n\r\n                    \/\/ \u2705 Keep original special breaks in EN mode\r\n                    if (!isJP) {\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\r\n                    \/\/ \u2705 JP override ONLY if JP and mapping exists\r\n                    if (isJP && JP_LABELS_BY_ID[id]) {\r\n                        formattedText = JP_LABELS_BY_ID[id];\r\n                    }\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(\"???? 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(\"???? 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        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(\"???? 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(\"???? 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 (\r\n                (currentIndex === sections.length - 1 && delta > 0) || \r\n                (currentIndex === 0 && delta < 0)\r\n            ) {\r\n                console.log(\"\u2705 At boundary, allow normal scroll\");\r\n                return;\r\n            }\r\n\r\n            if (scrollable && !atBottom && delta > 0) return;\r\n            if (scrollable && !atTop && delta < 0) return;\r\n\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(\"???? Boundary hit: bottom of scrollable section, snapping down\");\r\n                } else if (scrollable && atTop && delta < 0) {\r\n                    console.log(\"???? 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            const isHomePage = window.location.pathname === \"\/\" \r\n                               || document.body.classList.contains(\"home\"); \/\/ WP\/HTML flexibility\r\n\r\n            if (isHomePage) {\r\n                \/\/ \u2705 Homepage \u2192 old snap logic\r\n                window.addEventListener(\"wheel\", handleScroll, { passive: false });\r\n                console.log(\"???? Homepage scroll behavior applied\");\r\n            } else {\r\n                \/\/ \u2705 Other pages \u2192 hybrid logic\r\n                window.addEventListener(\"wheel\", function(e) {\r\n                    const currentSection = sections[currentIndex];\r\n                    const sectionHeight = currentSection.scrollHeight;\r\n                    const viewportHeight = window.innerHeight;\r\n\r\n                    if (sectionHeight <= viewportHeight) {\r\n                        window.addEventListener(\"wheel\", handleScroll, { passive: false });\r\n                    } else {\r\n                        \/\/ Big\/tall section \u2192 normal scroll but update nav\r\n                        sections.forEach((section, idx) => {\r\n                            const rect = section.getBoundingClientRect();\r\n                            if (rect.top <= viewportHeight * 0.4 && rect.bottom >= viewportHeight * 0.4) {\r\n                                if (currentIndex !== idx) {\r\n                                    currentIndex = idx;\r\n                                    updateNavigationDots(idx);\r\n                                    console.log(\"???? Updated currentIndex in tall section:\", idx);\r\n                                }\r\n                            }\r\n                        });\r\n                    }\r\n                }, { passive: false });\r\n\r\n                console.log(\"???? Inner page scroll behavior applied\");\r\n            }\r\n\r\n            \/\/ \u2705 Common key navigation\r\n            window.addEventListener(\"keydown\", handleKeyDown, { passive: false });\r\n            console.log(\"???? Scroll listeners added\");\r\n        }\r\n\r\n        function removeScrollListeners() {\r\n            window.removeEventListener(\"wheel\", handleScroll);\r\n            window.removeEventListener(\"keydown\", handleKeyDown);\r\n            console.log(\"???? 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(\"???? 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(\"???? 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(\"???? 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(\"???? 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; module_class=&#8221;nocssclass&#8221; _builder_version=&#8221;4.27.6&#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;]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.<\/p>\n<p>Alpeor\u2019s professional protocols have been developed to offer an exclusive, identical experience in our selection of spas and medispas around the world. Whether you opt for a brightening ritual to target skin radiance or an anti-aging ritual that supports your skin\u2019s youth-boosting processes, our luxury spa treatments will leave you with a deep sense of well-being and beautiful, glowing skin.[\/et_pb_text][et_pb_text content_tablet=&#8221;<\/p>\n<p>The kingdom of plants at the heart of science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>The kingdom of plants at the heart of 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;]<\/p>\n<p>Uplifting spa treatments at home<\/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;#2d2d2d&#8221; text_font_size=&#8221;16px&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>Prolong the soothing sensations and anti-aging effects of your luxury spa treatment by choosing a selection of our potent skincare products to take home with you. Our skilled skin therapists are on hand to advise you.<\/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>Contact our Beauty Advisor for a personalized skincare consultation<\/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>The kingdom of plants at the heart of science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>The kingdom of plants at the heart of 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: Alpeor\u2019s ultimate signature spa facial treatment<\/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>The kingdom of plants at the heart of science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>The kingdom of plants at the heart of 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;]<\/p>\n<p>The Experience<\/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; 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>Luxury Spa treatments for intense rejuvenation<\/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>Step into the magical world of Alpeor for a luxurious moment of deep-down cellular revitalization where indulgence reaches new heights. Our state-of-the-art luxury spa treatments for intense rejuvenation combine powerful Swiss Alpine plant-based formulas with advanced science tailored to the needs of every individual skin.<\/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;https:\/\/alpeor.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>The Spa<br \/>Experience<\/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;]<\/p>\n<p>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 &amp; skin experts and 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.<\/p>\n<p>[\/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;https:\/\/alpeor.com\/wp-content\/uploads\/2026\/03\/Alpeor-CHO-HD-26.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; force_fullwidth=&#8221;on&#8221; _builder_version=&#8221;4.27.6&#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; admin_label=&#8221;Section&#8221; module_id=&#8221;spa-locator&#8221; module_class=&#8221;full-height-experience&#8221; _builder_version=&#8221;4.27.6&#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; hover_enabled=&#8221;0&#8243; custom_css_main_element=&#8221;z-index: -1;&#8221; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;][et_pb_row make_equal=&#8221;on&#8221; custom_padding_last_edited=&#8221;on|phone&#8221; admin_label=&#8221;Row&#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>The kingdom of plants at the heart of science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>The kingdom of plants at the heart of 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>STORE &amp; SPA LOCATOR<\/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;600px&#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>Retail &amp; luxury <br \/>Spa destinations<\/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; admin_label=&#8221;Row&#8221; _builder_version=&#8221;4.27.6&#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; hover_enabled=&#8221;0&#8243; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;https:\/\/alpeor.com\/wp-content\/uploads\/2025\/05\/hotel-horlogers.jpg&#8221; background_size=&#8221;contain&#8221; hover_enabled=&#8221;0&#8243; global_colors_info=&#8221;{}&#8221; background__hover_enabled=&#8221;on|hover&#8221; background_image__hover=&#8221;https:\/\/alpeor.com\/wp-content\/uploads\/2025\/05\/hotel-horlogers-hover.jpg&#8221; background_enable_image__hover=&#8221;on&#8221; sticky_enabled=&#8221;0&#8243;][et_pb_image src=&#8221;https:\/\/alpeor.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; 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.6&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;https:\/\/alpeor.com\/wp-content\/uploads\/2026\/04\/Property-1Default.jpg&#8221; background_size=&#8221;contain&#8221; global_colors_info=&#8221;{}&#8221; background__hover_enabled=&#8221;on|hover&#8221; background_image__hover=&#8221;https:\/\/alpeor.com\/wp-content\/uploads\/2026\/04\/Property-1Variant2.jpg&#8221; background_enable_image__hover=&#8221;on&#8221;][et_pb_image src=&#8221;https:\/\/alpeor.com\/wp-content\/uploads\/2026\/04\/Property-1Default.jpg&#8221; alt=&#8221;hotel-horloger&#8221; title_text=&#8221;Property 1=Default&#8221; admin_label=&#8221;Image&#8221; _builder_version=&#8221;4.27.6&#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; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;https:\/\/alpeor.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;https:\/\/alpeor.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;https:\/\/alpeor.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; admin_label=&#8221;Row&#8221; _builder_version=&#8221;4.27.6&#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; hover_enabled=&#8221;0&#8243; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.6&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;https:\/\/alpeor.com\/wp-content\/uploads\/2025\/12\/GRAND-HOTEL-ZERMATTERHOF-Default.jpg&#8221; background_size=&#8221;contain&#8221; hover_enabled=&#8221;0&#8243; global_colors_info=&#8221;{}&#8221; background__hover_enabled=&#8221;on|hover&#8221; background_image__hover=&#8221;https:\/\/alpeor.com\/wp-content\/uploads\/2025\/12\/GRAND-HOTEL-ZERMATTERHOF-hover.jpg&#8221; background_enable_image__hover=&#8221;on&#8221; title_text=&#8221;GRAND-HOTEL-ZERMATTERHOF-hover&#8221; sticky_enabled=&#8221;0&#8243;][et_pb_image src=&#8221;https:\/\/alpeor.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; 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; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;https:\/\/alpeor.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;https:\/\/alpeor.com\/wp-content\/uploads\/2025\/03\/imperial-palace-hover.jpg&#8221; background_enable_image__hover=&#8221;on&#8221;][et_pb_image src=&#8221;https:\/\/alpeor.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.6&#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;https:\/\/alpeor.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;https:\/\/alpeor.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;https:\/\/alpeor.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>Find out more<\/h2>\n<p>[\/et_pb_text][et_pb_text module_class=&#8221;alpeor-pays-filter&#8221; _builder_version=&#8221;4.27.6&#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:\/\/alpeor.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:\/\/alpeor.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\">Perfume shops &amp; Selective stores<\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Pharmacie Plaza<\/h3><\/div><div class=\"alpeor-destination-address\">Rue du Cendrier 21, 1201, Gen\u00e8ve<\/div><div class=\"alpeor-destination-phone\">+41 22 732 36 11<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Drogerie &#038; Parfumerie Von Gr\u00fcnigen<\/h3><\/div><div class=\"alpeor-destination-address\">Promenade 20, 3780, Gstaad<\/div><div class=\"alpeor-destination-phone\">+41 33 744 15 82<\/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>Apotheke Portmann<\/h3><\/div><div class=\"alpeor-destination-address\">H\u00f6heweg 4, 3800, Interlaken<\/div><div class=\"alpeor-destination-phone\">+41 33 828 34 34<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Casagrande Luxury Lifestyle<\/h3><\/div><div class=\"alpeor-destination-address\">Grendelstrasse 19, 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>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>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 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>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>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>S\u0117idu Kosmetik<\/h3><\/div><div class=\"alpeor-destination-address\">Hertensteinstrasse 22, 6004, Luzern<\/div><div class=\"alpeor-destination-phone\">+41 41 410 88 22<\/div><\/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>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 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>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 Principale Centre Commercial Manor<\/h3><\/div><div class=\"alpeor-destination-address\">Route de Thonon 40, 1222, V\u00e9senaz<\/div><div class=\"alpeor-destination-phone\">+41 22 722 06 06<\/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 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>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>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>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>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><div class=\"alpeor-destination-category\"><div class=\"alpeor-destination-category-label\">Hotels &amp; Spas<\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>H\u00f4tel des Horlogers &#8211; 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 class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Grand Hotel Zermatterhof<\/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\">Bahnhofstrasse 55, 3920, Zermatt<\/div><div class=\"alpeor-destination-phone\">+41 27 966 66 00<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>H\u00f4tel Ch\u00e2teau d&#8217;Ouchy<\/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\">Place du Port, 1006, Lausanne<\/div><div class=\"alpeor-destination-phone\">+41 21 331 32 32<\/div><\/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>H\u00f4tel Beauregard<\/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\">90 Sent. du Bossonne, 74220 La Clusaz,<\/div><div class=\"alpeor-destination-phone\">+33 4 50 32 68 00<\/div><\/div><div class=\"alpeor-destination-element\"><div class=\"title-star-container\"><h3>Hotel Belvedere Locarno<\/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\">Via ai Monti 44, 6600, Locarno<\/div><div class=\"alpeor-destination-phone\">+41 91 751 03 63<\/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>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 &#038; 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&#039;h\u00f4tel Mirador 5, 1801, Le Mont P\u00e9lerin<\/div><div class=\"alpeor-destination-phone\">+41 21 925 17 70<\/div><\/div><\/div><div class=\"alpeor-destination-category\"><div class=\"alpeor-destination-category-label\">Clinics &amp; Beauty salons<\/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>\n","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(\"???? Initializing alpeor navigation \");\r\n        let sections = document.querySelectorAll(\".full-height-experience:not(.alpeor-footer)\");\r\n        console.log(\"???? 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        \/\/ \u2705 JP detection: \/jp OR <html lang=\"ja...\">\r\n        const pathSegs = window.location.pathname.split('\/').filter(Boolean);\r\n        const isJPPath = (pathSegs[0] || '').toLowerCase() === 'jp';\r\n        const htmlLang = (document.documentElement.getAttribute('lang') || '').toLowerCase();\r\n        const isJPLang = htmlLang.startsWith('ja');\r\n        const isJP = isJPPath || isJPLang;\r\n\r\n        \/\/ \u2705 JP labels mapped to SECTION IDS (ids stay EN)\r\n        const JP_LABELS_BY_ID = {\r\n            \"conscious-beauty\": \"\u30b3\u30f3\u30b7\u30e3\u30b9<br>\u30d3\u30e5\u30fc\u30c6\u30a3\u30fc\",\r\n            \"our-commitments\": \"\u79c1\u305f\u3061\u306e<br>\u30b3\u30df\u30c3\u30c8\u30e1\u30f3\u30c8\",\r\n            \"the-experience\": \"\u4f53\u9a13\",\r\n            \"collections\": \"\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\",\r\n            \"the-science\": \"\u30b5\u30a4\u30a8\u30f3\u30b9\",\r\n            \"rituals\": \"\u30ea\u30c1\u30e5\u30a2\u30eb\",\r\n            \"bestsellers\": \"\u30d9\u30b9\u30c8\u30bb\u30e9\u30fc\",\r\n            \"the-brand\": \"\u30d6\u30e9\u30f3\u30c9\",\r\n            \"signature\": \"\u30b7\u30b0\u30cd\u30c1\u30e3\u30fc\",\r\n            \"experience\": \"\u4f53\u9a13\",\r\n            \"spa-locator\": \"\u30b9\u30d1\u691c\u7d22\"\r\n        };\r\n\r\n        if (navContainer && sections.length > 0) {\r\n            console.log(\"????\ufe0f Building navigation dots\");\r\n            sections.forEach(function(section, index) {\r\n                let id = section.id;\r\n                if (id) {\r\n                    \/\/ === ORIGINAL label generation (EN) ===\r\n                    let formattedText = id.replace(\/-\/g, ' ').replace(\/\\b\\w\/g, c => c.toUpperCase());\r\n\r\n                    \/\/ \u2705 Keep original special breaks in EN mode\r\n                    if (!isJP) {\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\r\n                    \/\/ \u2705 JP override ONLY if JP and mapping exists\r\n                    if (isJP && JP_LABELS_BY_ID[id]) {\r\n                        formattedText = JP_LABELS_BY_ID[id];\r\n                    }\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(\"???? 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(\"???? 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        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(\"???? 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(\"???? 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 (\r\n                (currentIndex === sections.length - 1 && delta > 0) || \r\n                (currentIndex === 0 && delta < 0)\r\n            ) {\r\n                console.log(\"\u2705 At boundary, allow normal scroll\");\r\n                return;\r\n            }\r\n\r\n            if (scrollable && !atBottom && delta > 0) return;\r\n            if (scrollable && !atTop && delta < 0) return;\r\n\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(\"???? Boundary hit: bottom of scrollable section, snapping down\");\r\n                } else if (scrollable && atTop && delta < 0) {\r\n                    console.log(\"???? 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            const isHomePage = window.location.pathname === \"\/\" \r\n                               || document.body.classList.contains(\"home\"); \/\/ WP\/HTML flexibility\r\n\r\n            if (isHomePage) {\r\n                \/\/ \u2705 Homepage \u2192 old snap logic\r\n                window.addEventListener(\"wheel\", handleScroll, { passive: false });\r\n                console.log(\"???? Homepage scroll behavior applied\");\r\n            } else {\r\n                \/\/ \u2705 Other pages \u2192 hybrid logic\r\n                window.addEventListener(\"wheel\", function(e) {\r\n                    const currentSection = sections[currentIndex];\r\n                    const sectionHeight = currentSection.scrollHeight;\r\n                    const viewportHeight = window.innerHeight;\r\n\r\n                    if (sectionHeight <= viewportHeight) {\r\n                        window.addEventListener(\"wheel\", handleScroll, { passive: false });\r\n                    } else {\r\n                        \/\/ Big\/tall section \u2192 normal scroll but update nav\r\n                        sections.forEach((section, idx) => {\r\n                            const rect = section.getBoundingClientRect();\r\n                            if (rect.top <= viewportHeight * 0.4 && rect.bottom >= viewportHeight * 0.4) {\r\n                                if (currentIndex !== idx) {\r\n                                    currentIndex = idx;\r\n                                    updateNavigationDots(idx);\r\n                                    console.log(\"???? Updated currentIndex in tall section:\", idx);\r\n                                }\r\n                            }\r\n                        });\r\n                    }\r\n                }, { passive: false });\r\n\r\n                console.log(\"???? Inner page scroll behavior applied\");\r\n            }\r\n\r\n            \/\/ \u2705 Common key navigation\r\n            window.addEventListener(\"keydown\", handleKeyDown, { passive: false });\r\n            console.log(\"???? Scroll listeners added\");\r\n        }\r\n\r\n        function removeScrollListeners() {\r\n            window.removeEventListener(\"wheel\", handleScroll);\r\n            window.removeEventListener(\"keydown\", handleKeyDown);\r\n            console.log(\"???? 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(\"???? 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(\"???? 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(\"???? 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(\"???? 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>\n","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:\/\/alpeor.com\/fr\/wp-json\/wp\/v2\/pages\/31874","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alpeor.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/alpeor.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/alpeor.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alpeor.com\/fr\/wp-json\/wp\/v2\/comments?post=31874"}],"version-history":[{"count":99,"href":"https:\/\/alpeor.com\/fr\/wp-json\/wp\/v2\/pages\/31874\/revisions"}],"predecessor-version":[{"id":46757,"href":"https:\/\/alpeor.com\/fr\/wp-json\/wp\/v2\/pages\/31874\/revisions\/46757"}],"wp:attachment":[{"href":"https:\/\/alpeor.com\/fr\/wp-json\/wp\/v2\/media?parent=31874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}