{"id":31784,"date":"2025-03-20T13:11:36","date_gmt":"2025-03-20T13:11:36","guid":{"rendered":"https:\/\/alpeorv2.aif-staging.com\/?page_id=31784"},"modified":"2025-10-09T20:20:38","modified_gmt":"2025-10-09T20:20:38","slug":"about-our-swiss-brand","status":"publish","type":"page","link":"https:\/\/alpeorv2.aif-staging.com\/fr\/about-our-swiss-brand\/","title":{"rendered":"La marque"},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; custom_padding_last_edited=&#8221;on|phone&#8221; module_id=&#8221;our-story&#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; 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;][et_pb_row _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/la-marque-alpeor-brand-suisse-cosmetique.png&#8221; background_size=&#8221;contain&#8221; width=&#8221;100%&#8221; width_tablet=&#8221;90%&#8221; width_phone=&#8221;90%&#8221; width_last_edited=&#8221;on|tablet&#8221; max_width=&#8221;1920px&#8221; module_alignment=&#8221;center&#8221; min_height=&#8221;450px&#8221; min_height_tablet=&#8221;450px&#8221; min_height_phone=&#8221;200px&#8221; min_height_last_edited=&#8221;on|phone&#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_code _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;]    <div id=\"alpeor-navigation-container\">\r\n        <div id=\"alpeor-navigation\"><\/div>\r\n    <\/div>\r\n\r\n    <script>\r\n    document.addEventListener(\"DOMContentLoaded\", function () {\r\n        console.log(\"\ud83d\udfe2 Initializing alpeor navigation \");\r\n        let sections = document.querySelectorAll(\".full-height-experience:not(.alpeor-footer)\");\r\n        console.log(\"\ud83d\udccb Found sections:\", sections.length);\r\n        let currentIndex = 0;\r\n        window.currentIndex = currentIndex;\r\n        let isScrolling = false;\r\n        let isLocked = false;\r\n        let isNavigating = false;\r\n        let targetIndex = null;\r\n        let lastScrollTime = 0;\r\n        const scrollCooldown = 800;\r\n        let lastWheelTime = 0;\r\n        const wheelDebounce = 250;\r\n        let scrollQueue = [];\r\n\r\n        let navContainer = document.getElementById('alpeor-navigation');\r\n        let dotWrappers = [];\r\n        let dotSize = 15;\r\n        let nextLabelVisible = null;\r\n\r\n        if (navContainer && sections.length > 0) {\r\n            console.log(\"\ud83d\udee0\ufe0f Building navigation dots\");\r\n            sections.forEach(function(section, index) {\r\n                let id = section.id;\r\n                if (id) {\r\n                    let formattedText = id.replace(\/-\/g, ' ').replace(\/\\b\\w\/g, c => c.toUpperCase());\r\n                    if (formattedText.toLowerCase() === 'conscious beauty') formattedText = 'Conscious<br>Beauty';\r\n                    if (formattedText.toLowerCase() === 'our commitments') formattedText = 'Our<br>Commitments';\r\n\r\n                    let dotWrapper = document.createElement('div');\r\n                    dotWrapper.classList.add('navigation-dot-wrapper');\r\n\r\n                    let link = document.createElement('a');\r\n                    link.href = 'javascript:void(0)';\r\n                    link.classList.add('navigation-link');\r\n                    link.dataset.section = id;\r\n\r\n                    let dot = document.createElement('div');\r\n                    dot.classList.add('navigation-dot');\r\n\r\n                    let label = document.createElement('span');\r\n                    label.classList.add('navigation-label');\r\n                    label.innerHTML = formattedText;\r\n\r\n                    link.appendChild(dot);\r\n                    link.appendChild(label);\r\n                    dotWrapper.appendChild(link);\r\n                    navContainer.appendChild(dotWrapper);\r\n\r\n                    dotWrappers.push(dotWrapper);\r\n                }\r\n            });\r\n\r\n            for (let i = 0; i < dotWrappers.length - 1; i++) {\r\n                let segment = document.createElement('div');\r\n                segment.classList.add('navigation-segment');\r\n                navContainer.appendChild(segment);\r\n            }\r\n\r\n            let totalHeight = navContainer.offsetHeight;\r\n            let spaceBetween = totalHeight \/ (dotWrappers.length - 1);\r\n\r\n            dotWrappers.forEach((wrapper, index) => {\r\n                let position = index * spaceBetween;\r\n                wrapper.style.position = 'absolute';\r\n                wrapper.style.top = position + 'px';\r\n\r\n                if (index < dotWrappers.length - 1) {\r\n                    let segment = document.querySelectorAll('.navigation-segment')[index];\r\n                    segment.style.position = 'absolute';\r\n                    segment.style.top = (position + dotSize) + 'px';\r\n                    segment.style.height = (spaceBetween - dotSize) + 'px';\r\n                }\r\n            });\r\n\r\n            let visibleIndex = getVisibleSectionIndex();\r\n            window.currentIndex = visibleIndex;\r\n            updateNavigationDots(visibleIndex);\r\n            console.log(\"\u2705 Navigation initialized, visibleIndex:\", visibleIndex);\r\n        } else {\r\n            console.error(\"\u274c No navContainer or sections found\");\r\n        }\r\n\r\n        function updateNavigationDots(index) {\r\n            let activeSection = sections[index];\r\n            if (!activeSection || !activeSection.id) {\r\n                console.warn(\"\u26a0\ufe0f Invalid active section at index:\", index);\r\n                return;\r\n            }\r\n\r\n            if (isNavigating && index !== targetIndex) {\r\n                console.log(\"\ud83d\udd07 Suppressing dot update during navigation:\", { currentIndex: index, targetIndex });\r\n                return;\r\n            }\r\n\r\n            let id = activeSection.id;\r\n\r\n            document.querySelectorAll('.navigation-dot').forEach(dot => {\r\n                dot.style.backgroundColor = 'transparent';\r\n                dot.style.pointerEvents = 'auto';\r\n                dot.style.opacity = '1';\r\n            });\r\n            document.querySelectorAll('.navigation-label').forEach(label => label.style.opacity = '0');\r\n            document.querySelectorAll('.navigation-link').forEach(link => link.style.pointerEvents = 'auto');\r\n            document.querySelectorAll('.navigation-dot-wrapper').forEach(w => w.classList.remove('next-active'));\r\n\r\n            let activeLink = document.querySelector('.navigation-link[data-section=\"' + id + '\"]');\r\n            if (!activeLink) {\r\n                console.warn(\"\u26a0\ufe0f No active link for section:\", id);\r\n                return;\r\n            }\r\n\r\n            let activeDot = activeLink.querySelector('.navigation-dot');\r\n            let activeLabel = activeLink.querySelector('.navigation-label');\r\n\r\n            if (activeDot) {\r\n                activeDot.style.backgroundColor = '#C6A992';\r\n                activeDot.style.pointerEvents = 'none';\r\n                activeDot.style.opacity = '1';\r\n            }\r\n            if (activeLabel) activeLabel.style.opacity = '0';\r\n\r\n            activeLink.style.pointerEvents = 'none';\r\n\r\n            let wrapper = activeLink.closest('.navigation-dot-wrapper');\r\n            let nextWrapper = wrapper ? wrapper.nextElementSibling : null;\r\n\r\n            if (nextWrapper && nextWrapper.classList.contains('navigation-dot-wrapper')) {\r\n                let nextDot = nextWrapper.querySelector('.navigation-dot');\r\n                let nextLabel = nextWrapper.querySelector('.navigation-label');\r\n                if (nextDot && nextLabel) {\r\n                    nextDot.style.opacity = '0';\r\n                    nextLabel.style.opacity = '1';\r\n                    nextWrapper.classList.add('next-active');\r\n                    nextLabelVisible = nextLabel;\r\n                }\r\n            } else {\r\n                nextLabelVisible = null;\r\n            }\r\n\r\n            console.log(\"\u2705 Dot updated for index:\", index);\r\n        }\r\n\r\n        function disableUserInputs() {\r\n            isLocked = true;\r\n            removeScrollListeners();\r\n            window.addEventListener(\"touchmove\", preventDefault, { passive: false });\r\n            window.addEventListener(\"wheel\", preventDefault, { passive: false });\r\n            window.addEventListener(\"keydown\", preventDefault, { passive: false });\r\n            window.addEventListener(\"click\", preventDefault, { passive: false });\r\n            document.querySelectorAll('.navigation-link').forEach(link => {\r\n                link.style.pointerEvents = 'none';\r\n            });\r\n        }\r\n\r\n        function enableUserInputs() {\r\n            isLocked = false;\r\n            if (window.innerWidth >= 1024) {\r\n                addScrollListeners();\r\n            }\r\n            window.removeEventListener(\"touchmove\", preventDefault);\r\n            window.removeEventListener(\"wheel\", preventDefault);\r\n            window.removeEventListener(\"keydown\", preventDefault);\r\n            window.removeEventListener(\"click\", preventDefault);\r\n            document.querySelectorAll('.navigation-link').forEach(link => {\r\n                link.style.pointerEvents = 'auto';\r\n            });\r\n            document.body.style.overflow = '';\r\n        }\r\n\r\n        function preventDefault(e) {\r\n            if (isScrolling || isLocked) {\r\n                const target = e.target.closest('.full-height-experience');\r\n                const footer = document.querySelector(\".alpeor-footer\");\r\n                if (target && target.scrollHeight > target.clientHeight && !isAtBoundary(target)) {\r\n                    console.log(\"\u2705 Allowing internal section scrolling\");\r\n                    return; \/\/ Allow internal scrolling\r\n                }\r\n                if (footer && footer.getBoundingClientRect().top <= window.innerHeight + 100) {\r\n                    console.log(\"\u2705 Allowing footer scrolling\");\r\n                    return; \/\/ Allow footer scrolling\r\n                }\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n                console.log(\"\ud83d\uded1 Event blocked:\", e.type);\r\n            }\r\n        }\r\n\r\n        function isAtBoundary(section) {\r\n            const atBottom = section.scrollTop + section.clientHeight >= section.scrollHeight - 5;\r\n            const atTop = section.scrollTop <= 5;\r\n            return atBottom || atTop;\r\n        }\r\n\r\n        function isScrollable(section) {\r\n            return section.scrollHeight > section.clientHeight + 1;\r\n        }\r\n\r\n        function scrollToSection(index) {\r\n    if (index < 0 || index >= sections.length) return;\r\n\r\n    if (isScrolling || isLocked) {\r\n        scrollQueue = [index];\r\n        return;\r\n    }\r\n\r\n    const now = Date.now();\r\n    if (now - lastScrollTime < scrollCooldown) return;\r\n    lastScrollTime = now;\r\n\r\n    isScrolling = true;\r\n    disableUserInputs();\r\n\r\n    let offsetAdjustment = (index > 0 && window.innerWidth >= 1024) ? -21 : 0;\r\n    const targetTop = sections[index].offsetTop - offsetAdjustment;\r\n    const startTop = window.scrollY;\r\n    const distance = targetTop - startTop;\r\n    const duration = 800; \/\/ smoothness duration in ms\r\n    const easing = t => t < 0.5\r\n        ? 4 * t * t * t\r\n        : 1 - Math.pow(-2 * t + 2, 3) \/ 2; \/\/ easeInOutCubic\r\n\r\n    let startTime = null;\r\n\r\n    function animateScroll(timestamp) {\r\n        if (!startTime) startTime = timestamp;\r\n        const elapsed = timestamp - startTime;\r\n        const progress = Math.min(elapsed \/ duration, 1);\r\n        const eased = easing(progress);\r\n\r\n        window.scrollTo(0, startTop + distance * eased);\r\n\r\n        if (elapsed < duration) {\r\n            requestAnimationFrame(animateScroll);\r\n        } else {\r\n            isScrolling = false;\r\n            isNavigating = false;\r\n            targetIndex = null;\r\n            enableUserInputs();\r\n            updateNavigationDots(index);\r\n\r\n            if (scrollQueue.length > 0) {\r\n                const nextIndex = scrollQueue.shift();\r\n                isNavigating = true;\r\n                targetIndex = nextIndex;\r\n                scrollToSection(nextIndex);\r\n            }\r\n        }\r\n    }\r\n\r\n    requestAnimationFrame(animateScroll);\r\n}\r\n\r\n\r\n        function handleScroll(event) {\r\n            const now = Date.now();\r\n            if (now - lastWheelTime < wheelDebounce || isScrolling || isLocked || window.innerWidth < 1024 || window.justNavigated) {\r\n                console.log(\"\ud83d\uded1 Scroll blocked:\", { isScrolling, isLocked, isMobile: window.innerWidth < 1024, justNavigated: window.justNavigated });\r\n                event.preventDefault();\r\n                event.stopPropagation();\r\n                return;\r\n            }\r\n            lastWheelTime = now;\r\n\r\n            \/\/ Sync currentIndex with visible section\r\n            currentIndex = getVisibleSectionIndex();\r\n            window.currentIndex = currentIndex;\r\n\r\n            const footer = document.querySelector(\".alpeor-footer\");\r\n            if (footer && footer.getBoundingClientRect().top <= window.innerHeight + 100) {\r\n                console.log(\"\u2705 Footer near or in view, allowing free scroll\");\r\n                return;\r\n            }\r\n\r\n            let section = sections[currentIndex];\r\n            let scrollable = isScrollable(section);\r\n            let atBottom = section.scrollTop + section.clientHeight >= section.scrollHeight - 5;\r\n            let atTop = section.scrollTop <= 5;\r\n\r\n            console.log(\"\ud83d\udccf Scroll position:\", {\r\n                scrollTop: section.scrollTop,\r\n                clientHeight: section.clientHeight,\r\n                scrollHeight: section.scrollHeight,\r\n                atTop,\r\n                atBottom,\r\n                isScrollable: scrollable\r\n            });\r\n\r\n            const deltaThreshold = 10;\r\n            let delta = Math.abs(event.deltaY) > deltaThreshold ? Math.sign(event.deltaY) : 0;\r\n\r\n            \/*if (scrollable && !atBottom && delta > 0) {\r\n                console.log(\"\ud83d\udd04 Scrolling inside section (down)\", {\r\n                    scrollTop: section.scrollTop,\r\n                    clientHeight: section.clientHeight,\r\n                    scrollHeight: section.scrollHeight\r\n                });\r\n                return;\r\n            }\r\n            if (scrollable && !atTop && delta < 0) {\r\n                console.log(\"\ud83d\udd04 Scrolling inside section (up)\", {\r\n                    scrollTop: section.scrollTop,\r\n                    clientHeight: section.clientHeight,\r\n                    scrollHeight: section.scrollHeight\r\n                });\r\n                return;\r\n            }*\/\r\n\t\t\t\r\n\t\t\tif (\r\n\t\t\t\t(currentIndex === sections.length - 1 && delta > 0) || \r\n\t\t\t\t(currentIndex === 0 && delta < 0)\r\n\t\t\t) {\r\n\t\t\t\tconsole.log(\"\u2705 At boundary, allow normal scroll\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (scrollable && !atBottom && delta > 0) return;\r\n\t\t\tif (scrollable && !atTop && delta < 0) return;\r\n\t\t\t\r\n            if (delta !== 0) {\r\n                event.preventDefault();\r\n                event.stopPropagation();\r\n\r\n                if (scrollable && atBottom && delta > 0) {\r\n                    console.log(\"\ud83d\udd04 Boundary hit: bottom of scrollable section, snapping down\");\r\n                } else if (scrollable && atTop && delta < 0) {\r\n                    console.log(\"\ud83d\udd04 Boundary hit: top of scrollable section, snapping up\");\r\n                }\r\n\r\n                currentIndex += delta > 0 ? 1 : -1;\r\n                currentIndex = Math.max(0, Math.min(currentIndex, sections.length - 1));\r\n                window.currentIndex = currentIndex;\r\n                scrollToSection(currentIndex);\r\n            }\r\n        }\r\n\r\n        function handleKeyDown(event) {\r\n            if (isScrolling || isLocked) return;\r\n\r\n            currentIndex = window.currentIndex;\r\n            let section = sections[currentIndex];\r\n            let scrollable = isScrollable(section);\r\n            let atBottom = section.scrollTop + section.clientHeight >= section.scrollHeight - 5;\r\n            let atTop = section.scrollTop <= 5;\r\n\r\n            if ((event.key === \"ArrowDown\" && (!scrollable || atBottom)) ||\r\n                (event.key === \"ArrowUp\" && (!scrollable || atTop))) {\r\n                currentIndex += (event.key === \"ArrowDown\") ? 1 : -1;\r\n                currentIndex = Math.max(0, Math.min(currentIndex, sections.length - 1));\r\n                window.currentIndex = currentIndex;\r\n                scrollToSection(currentIndex);\r\n            }\r\n        }\r\n\r\n        function addScrollListeners() {\r\n\t\t\tconst isHomePage = window.location.pathname === \"\/\" \r\n\t\t\t\t\t\t\t   || document.body.classList.contains(\"home\"); \/\/ WP\/HTML flexibility\r\n\r\n\t\t\tif (isHomePage) {\r\n\t\t\t\t\/\/ \u2705 Homepage \u2192 old snap logic\r\n\t\t\t\twindow.addEventListener(\"wheel\", handleScroll, { passive: false });\r\n\t\t\t\tconsole.log(\"\ud83c\udfe0 Homepage scroll behavior applied\");\r\n\t\t\t} else {\r\n\t\t\t\t\/\/ \u2705 Other pages \u2192 hybrid logic\r\n\t\t\t\twindow.addEventListener(\"wheel\", function(e) {\r\n\t\t\t\t\tconst currentSection = sections[currentIndex];\r\n\t\t\t\t\tconst sectionHeight = currentSection.scrollHeight;\r\n\t\t\t\t\tconst viewportHeight = window.innerHeight;\r\n\r\n\t\t\t\t\tif (sectionHeight <= viewportHeight) {\r\n\t\t\t\t\t\t\/*console.log('test section');\r\n\t\t\t\t\t\t\/\/ Small section \u2192 snap\r\n\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\tif (e.deltaY > 0) {\r\n\t\t\t\t\t\t\tscrollToSection(currentIndex + 1);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tscrollToSection(currentIndex - 1);\r\n\t\t\t\t\t\t}*\/\r\n\t\t\t\t\t\twindow.addEventListener(\"wheel\", handleScroll, { passive: false });\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\/\/ Big\/tall section \u2192 normal scroll but update nav\r\n\t\t\t\t\t\tsections.forEach((section, idx) => {\r\n\t\t\t\t\t\t\tconst rect = section.getBoundingClientRect();\r\n\t\t\t\t\t\t\tif (rect.top <= viewportHeight * 0.4 && rect.bottom >= viewportHeight * 0.4) {\r\n\t\t\t\t\t\t\t\tif (currentIndex !== idx) {\r\n\t\t\t\t\t\t\t\t\tcurrentIndex = idx;\r\n\t\t\t\t\t\t\t\t\tupdateNavigationDots(idx);\r\n\t\t\t\t\t\t\t\t\tconsole.log(\"\ud83d\udd04 Updated currentIndex in tall section:\", idx);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}, { passive: false });\r\n\r\n\t\t\t\tconsole.log(\"\ud83d\udcc4 Inner page scroll behavior applied\");\r\n\t\t\t}\r\n\r\n\t\t\t\/\/ \u2705 Common key navigation\r\n\t\t\twindow.addEventListener(\"keydown\", handleKeyDown, { passive: false });\r\n\t\t\tconsole.log(\"\ud83d\udfe2 Scroll listeners added\");\r\n\t\t}\r\n\r\n\r\n\r\n        function removeScrollListeners() {\r\n            window.removeEventListener(\"wheel\", handleScroll);\r\n            window.removeEventListener(\"keydown\", handleKeyDown);\r\n            console.log(\"\ud83d\udfe1 Scroll listeners removed\");\r\n        }\r\n\r\n        window.addEventListener('load', () => {\r\n            if (window.innerWidth >= 1024) {\r\n                addScrollListeners();\r\n            }\r\n        });\r\n\r\n        const observer = new IntersectionObserver((entries) => {\r\n            entries.forEach(entry => {\r\n                console.log(\"\ud83d\udc40 IntersectionObserver triggered:\", {\r\n                    index: Array.from(sections).indexOf(entry.target),\r\n                    isIntersecting: entry.isIntersecting\r\n                });\r\n                if (entry.isIntersecting) {\r\n                    const index = Array.from(sections).indexOf(entry.target);\r\n                    window.currentIndex = index;\r\n                    updateNavigationDots(index);\r\n                    console.log(\"\ud83d\udc40 IntersectionObserver updated currentIndex:\", index);\r\n                }\r\n            });\r\n        }, {\r\n            threshold: window.innerWidth < 1024 ? 0.3 : 0.6\r\n        });\r\n\r\n        sections.forEach(section => observer.observe(section));\r\n\r\n        document.querySelectorAll('.navigation-link').forEach(link => {\r\n            link.addEventListener('click', function(event) {\r\n                event.preventDefault();\r\n\r\n                const sectionId = this.dataset.section;\r\n                const target = document.getElementById(sectionId);\r\n                if (!target) return;\r\n\r\n                const index = Array.from(sections).indexOf(target);\r\n                if (index === -1) return;\r\n\r\n                isNavigating = true;\r\n                targetIndex = index;\r\n                scrollToSection(index);\r\n                window.currentIndex = index;\r\n                console.log(\"\ud83d\udd17 Navigation link clicked, navigating to index:\", index, { isNavigating });\r\n            });\r\n        });\r\n\r\n        function getVisibleSectionIndex() {\r\n            let maxVisibleHeight = 0;\r\n            let minTopDistance = Infinity;\r\n            let visibleIndex = 0;\r\n\r\n            sections.forEach((section, index) => {\r\n                const rect = section.getBoundingClientRect();\r\n                const visibleHeight = Math.min(rect.bottom, window.innerHeight) - Math.max(rect.top, 0);\r\n                const isMobile = window.innerWidth < 1024;\r\n\r\n                console.log(\"\ud83d\udd0d Section visibility:\", {\r\n                    index,\r\n                    visibleHeight,\r\n                    sectionHeight: rect.height,\r\n                    rectTop: rect.top,\r\n                    isMobile\r\n                });\r\n\r\n                if (isMobile) {\r\n                    \/\/ Mobile\/tablet: Prioritize largest visible height or closest to viewport top\r\n                    if (visibleHeight > maxVisibleHeight || (visibleHeight === maxVisibleHeight && Math.abs(rect.top) < minTopDistance)) {\r\n                        maxVisibleHeight = visibleHeight;\r\n                        minTopDistance = Math.abs(rect.top);\r\n                        visibleIndex = index;\r\n                    }\r\n                } else {\r\n                    \/\/ Desktop: Use ratio-based visibility\r\n                    const ratio = Math.max(0, visibleHeight \/ rect.height);\r\n                    if (ratio > maxVisibleHeight) {\r\n                        maxVisibleHeight = ratio;\r\n                        visibleIndex = index;\r\n                    }\r\n                }\r\n            });\r\n\r\n            return visibleIndex;\r\n        }\r\n    });\r\n    <\/script>\r\n    [\/et_pb_code][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_2,1_2&#8243; make_equal=&#8221;on&#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;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;1_2&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_padding=&#8221;|0%||15%|false|false&#8221; custom_padding_tablet=&#8221;|0%||0%|false|false&#8221; custom_padding_phone=&#8221;|||0%|false|false&#8221; custom_padding_last_edited=&#8221;on|desktop&#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|tablet&#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 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>Our story: a family heritage, a Swiss legacy<\/h2>\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; custom_margin_tablet=&#8221;||40px||false|false&#8221; custom_margin_phone=&#8221;||40px||false|false&#8221; custom_margin_last_edited=&#8221;on|tablet&#8221; global_colors_info=&#8221;{}&#8221;]Alpeor\u2019s fabulous story &#038; heritage started in the 1950s on the banks of Lake Geneva in Montreux, home to the iconic Mirabeau Well-Being Clinic. Nestled in the middle of mountains and meadows, this destination was acclaimed by Europe\u2019s high society for its incredible microclimate and pure, reviving alpine air.<\/p>\n<p>In this protected location, founder Alexandre Flueckiger\u2019s grandmother, Maria Bovet, and her sister, Clotilde Flandin worked together creating much-loved beauty elixirs from local plants\u2014 many of which travelled across Europe, safely tucked into guests\u2019 suitcases at the end of a visit. Their pioneering vision was a key source of inspiration for the Swiss skincare brand, developed some decades later by their grandson, Alexandre Flueckiger.\u00a0[\/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; background_enable_image=&#8221;off&#8221; custom_css_main_element=&#8221;display: flex;||align-items: center;&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_image src=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/nature-suisse-produit-makeup-naturel.png&#8221; alt=&#8221;nature-suisse-produit-makeup-naturel&#8221; title_text=&#8221;nature-suisse-produit-makeup-naturel&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; max_width=&#8221;550px&#8221; max_width_tablet=&#8221;350px&#8221; max_width_phone=&#8221;250px&#8221; max_width_last_edited=&#8221;on|phone&#8221; module_alignment=&#8221;left&#8221; module_alignment_tablet=&#8221;center&#8221; module_alignment_phone=&#8221;center&#8221; module_alignment_last_edited=&#8221;on|tablet&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_image][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_2,1_2&#8243; make_equal=&#8221;on&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/alexandre-flueckiger-founder-fondateur-alpeor.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; background_last_edited=&#8221;on|desktop&#8221; background_enable_image_tablet=&#8221;off&#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; module_class=&#8221;no-bottom-space&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_stops=&#8221;rgba(0,43,36,0.87) 0%|rgba(0,43,36,0.87) 100%&#8221; custom_padding=&#8221;|8%||15%|false|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; 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|tablet&#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 _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=&#8221;Freight Disp Pro Italic||||||||&#8221; header_2_text_color=&#8221;#FFFFFF&#8221; header_2_font_size=&#8221;30px&#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>A visionary Swiss Founder<\/h2>\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; custom_margin_tablet=&#8221;||40px||false|false&#8221; custom_margin_phone=&#8221;||40px||false|false&#8221; custom_margin_last_edited=&#8221;on|tablet&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>With the same visionary spirit as Maria Bovet, Alexandre decided to apply his exceptional plant expertise and knowledge to the field of cosmetics. He worked relentlessly with his R&amp;D teams to uncover nature\u2019s powerful secrets and craft the brand\u2019s high-end skincare formulas. In the early 2000s, Alexandre Flueckiger proudly launched Alpeor, a unique Swiss skincare brand designed to target skin longevity and provide anti-aging solutions down to cellular level while passing on the true essence of the Swiss Alps, harnessed by science.<\/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_enable_image=&#8221;off&#8221; background_last_edited=&#8221;on|phone&#8221; background_image_tablet=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/alexandre-flueckiger-founder-fondateur-alpeor.jpg&#8221; background_image_phone=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/alexandre-flueckiger-founder-fondateur-alpeor-mobile.jpg&#8221; background_enable_image_tablet=&#8221;on&#8221; background_enable_image_phone=&#8221;on&#8221; background_position_tablet=&#8221;top_right&#8221; global_colors_info=&#8221;{}&#8221;][\/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;70px||||false|false&#8221; custom_margin_last_edited=&#8221;on|phone&#8221; custom_padding=&#8221;0px||0px||false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; custom_css_main_element=&#8221;z-index: 1 !important;&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_image src=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/alpine-garden-suisse.jpg&#8221; alt=&#8221;alpine-garden-suisse&#8221; title_text=&#8221;alpine-garden-suisse&#8221; align=&#8221;center&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; module_alignment=&#8221;center&#8221; custom_css_main_element=&#8221;width: 100% !important;&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_image][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_2,1_2&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; width=&#8221;70%&#8221; custom_margin=&#8221;40px||40px||true|false&#8221; custom_margin_tablet=&#8221;40px||0px||false|false&#8221; custom_margin_phone=&#8221;40px||0px||false|false&#8221; custom_margin_last_edited=&#8221;on|tablet&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_2&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_text 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 Alpine Garden<\/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.4em&#8221; header_2_font_size=&#8221;80px&#8221; global_colors_info=&#8221;{}&#8221;]An endless source of inspiration for the brand\u2019s luxurious skincare[\/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;]A hidden realm, nestled in the Swiss alps at an altitude of 2000 meters, where plants must adapt to withstand the elements: this is where we draw inspiration for our Swiss skincare brand. For decades, our CEO, Alexandre Flueckiger, has been fascinated by the kingdom of plants, exploring, watching, collecting samples and detailing his findings in fascinating herbariums.[\/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 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;]A true\u00a0 \u2018open-air laboratory\u2019[\/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;]The Alpine garden contains the secret to our high-end formulas, it is a precious gem, a true\u00a0 \u2018open-air laboratory\u2019 where Edelweiss, Rhodiola Rosea and Narcissus \u2013 the iconic plants that inspire our luxury brand skincare &#8211; grow in a pure environment.<\/p>\n<p>What we have learned in this garden and the alps beyond, is that the plant world must constantly adapt and develop its own defenses: from one season to the next, it perpetually regenerates. It slows down its cellular activity, only to reactivate it afterwards. So why not deploy the same strategy to act against the aging process? Why not give the skin the same means of slowing down its biological clock to prolong cell life and combat external aggressions for youthful, radiant, uplifted skin?[\/et_pb_text][\/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;the-brand&#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||true|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; _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;off|desktop&#8221; max_width_tablet=&#8221;1080px&#8221; max_width_phone=&#8221;1080px&#8221; max_width_last_edited=&#8221;off|desktop&#8221; custom_margin=&#8221;||||false|false&#8221; custom_padding=&#8221;||||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;||||false|false&#8221; custom_padding_tablet=&#8221;|||0%|false|false&#8221; custom_padding_phone=&#8221;|||0%|false|false&#8221; custom_padding_last_edited=&#8221;off|desktop&#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|tablet&#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 Brand<\/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>A Swiss skincare brand unlocking the secrets of nature for your skin<\/h2>\n<p>[\/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_font_size=&#8221;20px&#8221; text_letter_spacing=&#8221;1px&#8221; text_line_height=&#8221;1.4em&#8221; header_2_font_size=&#8221;80px&#8221; max_width=&#8221;450px&#8221; global_colors_info=&#8221;{}&#8221;]Welcome to the amazing, secret world of Alpeor. The brand is synonymous with exceptional skincare that boasts a fascinating story &#038; heritage. Inspired by Alpine plants and powered with the best innovative, targeted formulas, our Maison creates highly effective luxurious skincare products.[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;1_2&#8243; module_class=&#8221;empty-to-display&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/cosmetique-cosmetic-skincare.jpg&#8221; global_colors_info=&#8221;{}&#8221;][\/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;our-expertise&#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 !important;&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row column_structure=&#8221;1_2,1_2&#8243; make_equal=&#8221;on&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; width=&#8221;70%&#8221; width_tablet=&#8221;70%&#8221; width_phone=&#8221;70%&#8221; width_last_edited=&#8221;off|desktop&#8221; max_width_tablet=&#8221;1080px&#8221; max_width_phone=&#8221;1080px&#8221; max_width_last_edited=&#8221;off|desktop&#8221; custom_margin=&#8221;||||false|false&#8221; custom_padding=&#8221;50px||||false|false&#8221; custom_css_main_element=&#8221;height: 100%;||&#8221; global_colors_info=&#8221;{}&#8221; custom_css_main_element_last_edited=&#8221;on|phone&#8221; custom_css_main_element_tablet=&#8221;height: 100%;||display: flex;||flex-wrap: wrap;&#8221; custom_css_main_element_phone=&#8221;height: 100%;||display: flex;||flex-wrap: wrap;&#8221;][et_pb_column type=&#8221;1_2&#8243; module_class=&#8221;empty-to-display&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/swiss-made-cosmetics.jpg&#8221; custom_css_main_element=&#8221;z-index: 1 !important;||min-height: 110vh !important;&#8221; global_colors_info=&#8221;{}&#8221; custom_css_main_element_last_edited=&#8221;on|desktop&#8221; custom_css_main_element_tablet=&#8221;order: 2;||z-index: 1 !important;&#8221; custom_css_main_element_phone=&#8221;order: 2;||z-index: 1 !important;&#8221;][\/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;||||false|false&#8221; custom_padding_tablet=&#8221;|||0%|false|false&#8221; custom_padding_phone=&#8221;|||0%|false|false&#8221; custom_padding_last_edited=&#8221;off|desktop&#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; 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>Our Expertise:<\/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>Swiss made skincare with high performance formulas<\/h2>\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;]Skin is a living organ. It is constantly changing and reacting to a variety of captors, it is the meeting point between the outer physical world and our inner bodies, our final line of defence. At Alpeor, we believe that skin deserves the best skincare products, specifically adapted to the nature of each skin condition and scientifically formulated to offer visible results.<\/p>\n<p>Our mission is to achieve the perfect balance, preserving the youth capital of the skin as well as overall well-being.[\/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>Swiss essence and know-how<\/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; custom_margin_tablet=&#8221;||30px||false|false&#8221; custom_margin_phone=&#8221;||30px||false|false&#8221; custom_margin_last_edited=&#8221;on|tablet&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>As a Swiss skincare brand with proven expertise in skin longevity, we pride ourselves on offering targeted anti-aging solutions. From preventive skincare to ultra-intensive treatments, we use our expertise in skin physiology and aging-related mechanisms, and select only the best natural ingredients to work in synergy at the core of the formula, bringing you the best possible solutions.<\/p>\n<p>We look towards the kingdom of nature, long used for its benefits for our health and well-being to source the nutrients, such as antioxidants, the skin needs to regenerate itself. Our high-tech formulas also contain active ingredients obtained by biotechnology.<\/p>\n<p>[\/et_pb_text][\/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;our-commitments&#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||50px||false|false&#8221; custom_margin_tablet=&#8221;||0px||false|false&#8221; custom_margin_phone=&#8221;||0px||false|false&#8221; custom_margin_last_edited=&#8221;on|desktop&#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>Our commitments<\/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>Responsible brand skincare<\/h2>\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;]With plants as our inspiration, it is only natural that we care for the environment in which they grow, taking a holistic approach with responsible sourcing, limiting our environmental impact and preserving biodiversity.<\/p>\n<p>We support the work of the incredible Alpine garden where we study the changing nature of the iconic plants we use for our Swiss skincare brand. Our formulas contain only highly concentrated, botanical active ingredients with proven effectiveness, harvested from certified organic alpine plants and blended with water from the Swiss Alps.[\/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>100% Swiss made<\/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;]Our formulas contain only highly concentrated, botanical active ingredients with proven effectiveness, harvested from certified organic alpine plants and blended with water from the Swiss Alps.<\/p>\n<p>Our supply chain is tightly controlled, there&#8217;s no place for mineral oils, silicone, Sodium Laureth Sulfate (SLS), ethanol alcohol, artificial colorants, parabens, phenoxyethanol or ingredients of animal origin. And, of course, no animal testing.[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;1_2&#8243; module_class=&#8221;empty-to-display&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_image=&#8221;http:\/\/alpeorv2.aif-staging.com\/wp-content\/uploads\/2025\/03\/engagements-envers-la-nature-commitments.jpg&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_4,1_4,1_4,1_4&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; width=&#8221;70%&#8221; custom_margin=&#8221;70px||100px||false|false&#8221; custom_margin_tablet=&#8221;70px||||false|false&#8221; custom_margin_phone=&#8221;70px||||false|false&#8221; custom_margin_last_edited=&#8221;on|desktop&#8221; custom_padding=&#8221;40px||||false|false&#8221; border_width_top=&#8221;1px&#8221; border_color_top=&#8221;#c6a992&#8243; border_width_bottom=&#8221;1px&#8221; border_color_bottom=&#8221;#c6a992&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_4&#8243; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#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;#000000&#8243; text_font_size=&#8221;35px&#8221; text_line_height=&#8221;1em&#8221; custom_margin=&#8221;||20px||false|false&#8221; custom_padding=&#8221;||||false|false&#8221; text_font_size_tablet=&#8221;35px&#8221; text_font_size_phone=&#8221;30px&#8221; text_font_size_last_edited=&#8221;on|phone&#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;]We are proud to certify that all our products:[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;1_4&#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;Freight Disp Pro Italic||||||||&#8221; text_text_color=&#8221;#2d2d2d&#8221; text_font_size=&#8221;18px&#8221; text_line_height=&#8221;1.6em&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p><strong>Are 100% Made in Switzerland:<\/strong> entirely developed, formulated and packaged in Switzerland<\/p>\n<p>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;1_4&#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;Freight Disp Pro Italic||||||||&#8221; text_text_color=&#8221;#2d2d2d&#8221; text_font_size=&#8221;18px&#8221; text_line_height=&#8221;1.6em&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p><strong>Use certified organic Alpine plants<\/strong><\/p>\n<p>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;1_4&#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;Freight Disp Pro Italic||||||||&#8221; text_text_color=&#8221;#2d2d2d&#8221; text_font_size=&#8221;18px&#8221; text_line_height=&#8221;1.6em&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p><strong>Use planet-friendly packaging:<\/strong> no cellophane, recycled and recyclable where possible, glass bottles over plastic<\/p>\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>    <div id=\"alpeor-navigation-container\">\r\n        <div id=\"alpeor-navigation\"><\/div>\r\n    <\/div>\r\n\r\n    <script>\r\n    document.addEventListener(\"DOMContentLoaded\", function () {\r\n        console.log(\"\ud83d\udfe2 Initializing alpeor navigation \");\r\n        let sections = document.querySelectorAll(\".full-height-experience:not(.alpeor-footer)\");\r\n        console.log(\"\ud83d\udccb Found sections:\", sections.length);\r\n        let currentIndex = 0;\r\n        window.currentIndex = currentIndex;\r\n        let isScrolling = false;\r\n        let isLocked = false;\r\n        let isNavigating = false;\r\n        let targetIndex = null;\r\n        let lastScrollTime = 0;\r\n        const scrollCooldown = 800;\r\n        let lastWheelTime = 0;\r\n        const wheelDebounce = 250;\r\n        let scrollQueue = [];\r\n\r\n        let navContainer = document.getElementById('alpeor-navigation');\r\n        let dotWrappers = [];\r\n        let dotSize = 15;\r\n        let nextLabelVisible = null;\r\n\r\n        if (navContainer && sections.length > 0) {\r\n            console.log(\"\ud83d\udee0\ufe0f Building navigation dots\");\r\n            sections.forEach(function(section, index) {\r\n                let id = section.id;\r\n                if (id) {\r\n                    let formattedText = id.replace(\/-\/g, ' ').replace(\/\\b\\w\/g, c => c.toUpperCase());\r\n                    if (formattedText.toLowerCase() === 'conscious beauty') formattedText = 'Conscious<br>Beauty';\r\n                    if (formattedText.toLowerCase() === 'our commitments') formattedText = 'Our<br>Commitments';\r\n\r\n                    let dotWrapper = document.createElement('div');\r\n                    dotWrapper.classList.add('navigation-dot-wrapper');\r\n\r\n                    let link = document.createElement('a');\r\n                    link.href = 'javascript:void(0)';\r\n                    link.classList.add('navigation-link');\r\n                    link.dataset.section = id;\r\n\r\n                    let dot = document.createElement('div');\r\n                    dot.classList.add('navigation-dot');\r\n\r\n                    let label = document.createElement('span');\r\n                    label.classList.add('navigation-label');\r\n                    label.innerHTML = formattedText;\r\n\r\n                    link.appendChild(dot);\r\n                    link.appendChild(label);\r\n                    dotWrapper.appendChild(link);\r\n                    navContainer.appendChild(dotWrapper);\r\n\r\n                    dotWrappers.push(dotWrapper);\r\n                }\r\n            });\r\n\r\n            for (let i = 0; i < dotWrappers.length - 1; i++) {\r\n                let segment = document.createElement('div');\r\n                segment.classList.add('navigation-segment');\r\n                navContainer.appendChild(segment);\r\n            }\r\n\r\n            let totalHeight = navContainer.offsetHeight;\r\n            let spaceBetween = totalHeight \/ (dotWrappers.length - 1);\r\n\r\n            dotWrappers.forEach((wrapper, index) => {\r\n                let position = index * spaceBetween;\r\n                wrapper.style.position = 'absolute';\r\n                wrapper.style.top = position + 'px';\r\n\r\n                if (index < dotWrappers.length - 1) {\r\n                    let segment = document.querySelectorAll('.navigation-segment')[index];\r\n                    segment.style.position = 'absolute';\r\n                    segment.style.top = (position + dotSize) + 'px';\r\n                    segment.style.height = (spaceBetween - dotSize) + 'px';\r\n                }\r\n            });\r\n\r\n            let visibleIndex = getVisibleSectionIndex();\r\n            window.currentIndex = visibleIndex;\r\n            updateNavigationDots(visibleIndex);\r\n            console.log(\"\u2705 Navigation initialized, visibleIndex:\", visibleIndex);\r\n        } else {\r\n            console.error(\"\u274c No navContainer or sections found\");\r\n        }\r\n\r\n        function updateNavigationDots(index) {\r\n            let activeSection = sections[index];\r\n            if (!activeSection || !activeSection.id) {\r\n                console.warn(\"\u26a0\ufe0f Invalid active section at index:\", index);\r\n                return;\r\n            }\r\n\r\n            if (isNavigating && index !== targetIndex) {\r\n                console.log(\"\ud83d\udd07 Suppressing dot update during navigation:\", { currentIndex: index, targetIndex });\r\n                return;\r\n            }\r\n\r\n            let id = activeSection.id;\r\n\r\n            document.querySelectorAll('.navigation-dot').forEach(dot => {\r\n                dot.style.backgroundColor = 'transparent';\r\n                dot.style.pointerEvents = 'auto';\r\n                dot.style.opacity = '1';\r\n            });\r\n            document.querySelectorAll('.navigation-label').forEach(label => label.style.opacity = '0');\r\n            document.querySelectorAll('.navigation-link').forEach(link => link.style.pointerEvents = 'auto');\r\n            document.querySelectorAll('.navigation-dot-wrapper').forEach(w => w.classList.remove('next-active'));\r\n\r\n            let activeLink = document.querySelector('.navigation-link[data-section=\"' + id + '\"]');\r\n            if (!activeLink) {\r\n                console.warn(\"\u26a0\ufe0f No active link for section:\", id);\r\n                return;\r\n            }\r\n\r\n            let activeDot = activeLink.querySelector('.navigation-dot');\r\n            let activeLabel = activeLink.querySelector('.navigation-label');\r\n\r\n            if (activeDot) {\r\n                activeDot.style.backgroundColor = '#C6A992';\r\n                activeDot.style.pointerEvents = 'none';\r\n                activeDot.style.opacity = '1';\r\n            }\r\n            if (activeLabel) activeLabel.style.opacity = '0';\r\n\r\n            activeLink.style.pointerEvents = 'none';\r\n\r\n            let wrapper = activeLink.closest('.navigation-dot-wrapper');\r\n            let nextWrapper = wrapper ? wrapper.nextElementSibling : null;\r\n\r\n            if (nextWrapper && nextWrapper.classList.contains('navigation-dot-wrapper')) {\r\n                let nextDot = nextWrapper.querySelector('.navigation-dot');\r\n                let nextLabel = nextWrapper.querySelector('.navigation-label');\r\n                if (nextDot && nextLabel) {\r\n                    nextDot.style.opacity = '0';\r\n                    nextLabel.style.opacity = '1';\r\n                    nextWrapper.classList.add('next-active');\r\n                    nextLabelVisible = nextLabel;\r\n                }\r\n            } else {\r\n                nextLabelVisible = null;\r\n            }\r\n\r\n            console.log(\"\u2705 Dot updated for index:\", index);\r\n        }\r\n\r\n        function disableUserInputs() {\r\n            isLocked = true;\r\n            removeScrollListeners();\r\n            window.addEventListener(\"touchmove\", preventDefault, { passive: false });\r\n            window.addEventListener(\"wheel\", preventDefault, { passive: false });\r\n            window.addEventListener(\"keydown\", preventDefault, { passive: false });\r\n            window.addEventListener(\"click\", preventDefault, { passive: false });\r\n            document.querySelectorAll('.navigation-link').forEach(link => {\r\n                link.style.pointerEvents = 'none';\r\n            });\r\n        }\r\n\r\n        function enableUserInputs() {\r\n            isLocked = false;\r\n            if (window.innerWidth >= 1024) {\r\n                addScrollListeners();\r\n            }\r\n            window.removeEventListener(\"touchmove\", preventDefault);\r\n            window.removeEventListener(\"wheel\", preventDefault);\r\n            window.removeEventListener(\"keydown\", preventDefault);\r\n            window.removeEventListener(\"click\", preventDefault);\r\n            document.querySelectorAll('.navigation-link').forEach(link => {\r\n                link.style.pointerEvents = 'auto';\r\n            });\r\n            document.body.style.overflow = '';\r\n        }\r\n\r\n        function preventDefault(e) {\r\n            if (isScrolling || isLocked) {\r\n                const target = e.target.closest('.full-height-experience');\r\n                const footer = document.querySelector(\".alpeor-footer\");\r\n                if (target && target.scrollHeight > target.clientHeight && !isAtBoundary(target)) {\r\n                    console.log(\"\u2705 Allowing internal section scrolling\");\r\n                    return; \/\/ Allow internal scrolling\r\n                }\r\n                if (footer && footer.getBoundingClientRect().top <= window.innerHeight + 100) {\r\n                    console.log(\"\u2705 Allowing footer scrolling\");\r\n                    return; \/\/ Allow footer scrolling\r\n                }\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n                console.log(\"\ud83d\uded1 Event blocked:\", e.type);\r\n            }\r\n        }\r\n\r\n        function isAtBoundary(section) {\r\n            const atBottom = section.scrollTop + section.clientHeight >= section.scrollHeight - 5;\r\n            const atTop = section.scrollTop <= 5;\r\n            return atBottom || atTop;\r\n        }\r\n\r\n        function isScrollable(section) {\r\n            return section.scrollHeight > section.clientHeight + 1;\r\n        }\r\n\r\n        function scrollToSection(index) {\r\n    if (index < 0 || index >= sections.length) return;\r\n\r\n    if (isScrolling || isLocked) {\r\n        scrollQueue = [index];\r\n        return;\r\n    }\r\n\r\n    const now = Date.now();\r\n    if (now - lastScrollTime < scrollCooldown) return;\r\n    lastScrollTime = now;\r\n\r\n    isScrolling = true;\r\n    disableUserInputs();\r\n\r\n    let offsetAdjustment = (index > 0 && window.innerWidth >= 1024) ? -21 : 0;\r\n    const targetTop = sections[index].offsetTop - offsetAdjustment;\r\n    const startTop = window.scrollY;\r\n    const distance = targetTop - startTop;\r\n    const duration = 800; \/\/ smoothness duration in ms\r\n    const easing = t => t < 0.5\r\n        ? 4 * t * t * t\r\n        : 1 - Math.pow(-2 * t + 2, 3) \/ 2; \/\/ easeInOutCubic\r\n\r\n    let startTime = null;\r\n\r\n    function animateScroll(timestamp) {\r\n        if (!startTime) startTime = timestamp;\r\n        const elapsed = timestamp - startTime;\r\n        const progress = Math.min(elapsed \/ duration, 1);\r\n        const eased = easing(progress);\r\n\r\n        window.scrollTo(0, startTop + distance * eased);\r\n\r\n        if (elapsed < duration) {\r\n            requestAnimationFrame(animateScroll);\r\n        } else {\r\n            isScrolling = false;\r\n            isNavigating = false;\r\n            targetIndex = null;\r\n            enableUserInputs();\r\n            updateNavigationDots(index);\r\n\r\n            if (scrollQueue.length > 0) {\r\n                const nextIndex = scrollQueue.shift();\r\n                isNavigating = true;\r\n                targetIndex = nextIndex;\r\n                scrollToSection(nextIndex);\r\n            }\r\n        }\r\n    }\r\n\r\n    requestAnimationFrame(animateScroll);\r\n}\r\n\r\n\r\n        function handleScroll(event) {\r\n            const now = Date.now();\r\n            if (now - lastWheelTime < wheelDebounce || isScrolling || isLocked || window.innerWidth < 1024 || window.justNavigated) {\r\n                console.log(\"\ud83d\uded1 Scroll blocked:\", { isScrolling, isLocked, isMobile: window.innerWidth < 1024, justNavigated: window.justNavigated });\r\n                event.preventDefault();\r\n                event.stopPropagation();\r\n                return;\r\n            }\r\n            lastWheelTime = now;\r\n\r\n            \/\/ Sync currentIndex with visible section\r\n            currentIndex = getVisibleSectionIndex();\r\n            window.currentIndex = currentIndex;\r\n\r\n            const footer = document.querySelector(\".alpeor-footer\");\r\n            if (footer && footer.getBoundingClientRect().top <= window.innerHeight + 100) {\r\n                console.log(\"\u2705 Footer near or in view, allowing free scroll\");\r\n                return;\r\n            }\r\n\r\n            let section = sections[currentIndex];\r\n            let scrollable = isScrollable(section);\r\n            let atBottom = section.scrollTop + section.clientHeight >= section.scrollHeight - 5;\r\n            let atTop = section.scrollTop <= 5;\r\n\r\n            console.log(\"\ud83d\udccf Scroll position:\", {\r\n                scrollTop: section.scrollTop,\r\n                clientHeight: section.clientHeight,\r\n                scrollHeight: section.scrollHeight,\r\n                atTop,\r\n                atBottom,\r\n                isScrollable: scrollable\r\n            });\r\n\r\n            const deltaThreshold = 10;\r\n            let delta = Math.abs(event.deltaY) > deltaThreshold ? Math.sign(event.deltaY) : 0;\r\n\r\n            \/*if (scrollable && !atBottom && delta > 0) {\r\n                console.log(\"\ud83d\udd04 Scrolling inside section (down)\", {\r\n                    scrollTop: section.scrollTop,\r\n                    clientHeight: section.clientHeight,\r\n                    scrollHeight: section.scrollHeight\r\n                });\r\n                return;\r\n            }\r\n            if (scrollable && !atTop && delta < 0) {\r\n                console.log(\"\ud83d\udd04 Scrolling inside section (up)\", {\r\n                    scrollTop: section.scrollTop,\r\n                    clientHeight: section.clientHeight,\r\n                    scrollHeight: section.scrollHeight\r\n                });\r\n                return;\r\n            }*\/\r\n\t\t\t\r\n\t\t\tif (\r\n\t\t\t\t(currentIndex === sections.length - 1 && delta > 0) || \r\n\t\t\t\t(currentIndex === 0 && delta < 0)\r\n\t\t\t) {\r\n\t\t\t\tconsole.log(\"\u2705 At boundary, allow normal scroll\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (scrollable && !atBottom && delta > 0) return;\r\n\t\t\tif (scrollable && !atTop && delta < 0) return;\r\n\t\t\t\r\n            if (delta !== 0) {\r\n                event.preventDefault();\r\n                event.stopPropagation();\r\n\r\n                if (scrollable && atBottom && delta > 0) {\r\n                    console.log(\"\ud83d\udd04 Boundary hit: bottom of scrollable section, snapping down\");\r\n                } else if (scrollable && atTop && delta < 0) {\r\n                    console.log(\"\ud83d\udd04 Boundary hit: top of scrollable section, snapping up\");\r\n                }\r\n\r\n                currentIndex += delta > 0 ? 1 : -1;\r\n                currentIndex = Math.max(0, Math.min(currentIndex, sections.length - 1));\r\n                window.currentIndex = currentIndex;\r\n                scrollToSection(currentIndex);\r\n            }\r\n        }\r\n\r\n        function handleKeyDown(event) {\r\n            if (isScrolling || isLocked) return;\r\n\r\n            currentIndex = window.currentIndex;\r\n            let section = sections[currentIndex];\r\n            let scrollable = isScrollable(section);\r\n            let atBottom = section.scrollTop + section.clientHeight >= section.scrollHeight - 5;\r\n            let atTop = section.scrollTop <= 5;\r\n\r\n            if ((event.key === \"ArrowDown\" && (!scrollable || atBottom)) ||\r\n                (event.key === \"ArrowUp\" && (!scrollable || atTop))) {\r\n                currentIndex += (event.key === \"ArrowDown\") ? 1 : -1;\r\n                currentIndex = Math.max(0, Math.min(currentIndex, sections.length - 1));\r\n                window.currentIndex = currentIndex;\r\n                scrollToSection(currentIndex);\r\n            }\r\n        }\r\n\r\n        function addScrollListeners() {\r\n\t\t\tconst isHomePage = window.location.pathname === \"\/\" \r\n\t\t\t\t\t\t\t   || document.body.classList.contains(\"home\"); \/\/ WP\/HTML flexibility\r\n\r\n\t\t\tif (isHomePage) {\r\n\t\t\t\t\/\/ \u2705 Homepage \u2192 old snap logic\r\n\t\t\t\twindow.addEventListener(\"wheel\", handleScroll, { passive: false });\r\n\t\t\t\tconsole.log(\"\ud83c\udfe0 Homepage scroll behavior applied\");\r\n\t\t\t} else {\r\n\t\t\t\t\/\/ \u2705 Other pages \u2192 hybrid logic\r\n\t\t\t\twindow.addEventListener(\"wheel\", function(e) {\r\n\t\t\t\t\tconst currentSection = sections[currentIndex];\r\n\t\t\t\t\tconst sectionHeight = currentSection.scrollHeight;\r\n\t\t\t\t\tconst viewportHeight = window.innerHeight;\r\n\r\n\t\t\t\t\tif (sectionHeight <= viewportHeight) {\r\n\t\t\t\t\t\t\/*console.log('test section');\r\n\t\t\t\t\t\t\/\/ Small section \u2192 snap\r\n\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\tif (e.deltaY > 0) {\r\n\t\t\t\t\t\t\tscrollToSection(currentIndex + 1);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tscrollToSection(currentIndex - 1);\r\n\t\t\t\t\t\t}*\/\r\n\t\t\t\t\t\twindow.addEventListener(\"wheel\", handleScroll, { passive: false });\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\/\/ Big\/tall section \u2192 normal scroll but update nav\r\n\t\t\t\t\t\tsections.forEach((section, idx) => {\r\n\t\t\t\t\t\t\tconst rect = section.getBoundingClientRect();\r\n\t\t\t\t\t\t\tif (rect.top <= viewportHeight * 0.4 && rect.bottom >= viewportHeight * 0.4) {\r\n\t\t\t\t\t\t\t\tif (currentIndex !== idx) {\r\n\t\t\t\t\t\t\t\t\tcurrentIndex = idx;\r\n\t\t\t\t\t\t\t\t\tupdateNavigationDots(idx);\r\n\t\t\t\t\t\t\t\t\tconsole.log(\"\ud83d\udd04 Updated currentIndex in tall section:\", idx);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}, { passive: false });\r\n\r\n\t\t\t\tconsole.log(\"\ud83d\udcc4 Inner page scroll behavior applied\");\r\n\t\t\t}\r\n\r\n\t\t\t\/\/ \u2705 Common key navigation\r\n\t\t\twindow.addEventListener(\"keydown\", handleKeyDown, { passive: false });\r\n\t\t\tconsole.log(\"\ud83d\udfe2 Scroll listeners added\");\r\n\t\t}\r\n\r\n\r\n\r\n        function removeScrollListeners() {\r\n            window.removeEventListener(\"wheel\", handleScroll);\r\n            window.removeEventListener(\"keydown\", handleKeyDown);\r\n            console.log(\"\ud83d\udfe1 Scroll listeners removed\");\r\n        }\r\n\r\n        window.addEventListener('load', () => {\r\n            if (window.innerWidth >= 1024) {\r\n                addScrollListeners();\r\n            }\r\n        });\r\n\r\n        const observer = new IntersectionObserver((entries) => {\r\n            entries.forEach(entry => {\r\n                console.log(\"\ud83d\udc40 IntersectionObserver triggered:\", {\r\n                    index: Array.from(sections).indexOf(entry.target),\r\n                    isIntersecting: entry.isIntersecting\r\n                });\r\n                if (entry.isIntersecting) {\r\n                    const index = Array.from(sections).indexOf(entry.target);\r\n                    window.currentIndex = index;\r\n                    updateNavigationDots(index);\r\n                    console.log(\"\ud83d\udc40 IntersectionObserver updated currentIndex:\", index);\r\n                }\r\n            });\r\n        }, {\r\n            threshold: window.innerWidth < 1024 ? 0.3 : 0.6\r\n        });\r\n\r\n        sections.forEach(section => observer.observe(section));\r\n\r\n        document.querySelectorAll('.navigation-link').forEach(link => {\r\n            link.addEventListener('click', function(event) {\r\n                event.preventDefault();\r\n\r\n                const sectionId = this.dataset.section;\r\n                const target = document.getElementById(sectionId);\r\n                if (!target) return;\r\n\r\n                const index = Array.from(sections).indexOf(target);\r\n                if (index === -1) return;\r\n\r\n                isNavigating = true;\r\n                targetIndex = index;\r\n                scrollToSection(index);\r\n                window.currentIndex = index;\r\n                console.log(\"\ud83d\udd17 Navigation link clicked, navigating to index:\", index, { isNavigating });\r\n            });\r\n        });\r\n\r\n        function getVisibleSectionIndex() {\r\n            let maxVisibleHeight = 0;\r\n            let minTopDistance = Infinity;\r\n            let visibleIndex = 0;\r\n\r\n            sections.forEach((section, index) => {\r\n                const rect = section.getBoundingClientRect();\r\n                const visibleHeight = Math.min(rect.bottom, window.innerHeight) - Math.max(rect.top, 0);\r\n                const isMobile = window.innerWidth < 1024;\r\n\r\n                console.log(\"\ud83d\udd0d Section visibility:\", {\r\n                    index,\r\n                    visibleHeight,\r\n                    sectionHeight: rect.height,\r\n                    rectTop: rect.top,\r\n                    isMobile\r\n                });\r\n\r\n                if (isMobile) {\r\n                    \/\/ Mobile\/tablet: Prioritize largest visible height or closest to viewport top\r\n                    if (visibleHeight > maxVisibleHeight || (visibleHeight === maxVisibleHeight && Math.abs(rect.top) < minTopDistance)) {\r\n                        maxVisibleHeight = visibleHeight;\r\n                        minTopDistance = Math.abs(rect.top);\r\n                        visibleIndex = index;\r\n                    }\r\n                } else {\r\n                    \/\/ Desktop: Use ratio-based visibility\r\n                    const ratio = Math.max(0, visibleHeight \/ rect.height);\r\n                    if (ratio > maxVisibleHeight) {\r\n                        maxVisibleHeight = ratio;\r\n                        visibleIndex = index;\r\n                    }\r\n                }\r\n            });\r\n\r\n            return visibleIndex;\r\n        }\r\n    });\r\n    <\/script>\r\n    Our story: a family heritage, a Swiss legacyAlpeor\u2019s fabulous story &#038; heritage started in the 1950s on the banks of Lake Geneva in Montreux, home to the iconic Mirabeau Well-Being Clinic. Nestled in the middle of mountains and meadows, this destination was acclaimed by Europe\u2019s high society for its incredible microclimate and pure, reviving alpine [&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-31784","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/pages\/31784","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/comments?post=31784"}],"version-history":[{"count":59,"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/pages\/31784\/revisions"}],"predecessor-version":[{"id":34312,"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/pages\/31784\/revisions\/34312"}],"wp:attachment":[{"href":"https:\/\/alpeorv2.aif-staging.com\/fr\/wp-json\/wp\/v2\/media?parent=31784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}