{"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>Au c\u0153ur de notre histoire : un h\u00e9ritage familial, une tradition suisse<\/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>Un fondateur visionnaire<\/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>Anim\u00e9 du m\u00eame esprit pionnier que sa grand-m\u00e8re Maria Bovet, Alexandre d\u00e9cide de mettre son expertise et ses connaissances botaniques au service de la cosm\u00e9tique. Avec l\u2019appui d\u2019une \u00e9quipe de scientifiques passionn\u00e9s, il travaille sans rel\u00e2che pour d\u00e9couvrir les puissants secrets de la nature et \u00e9laborer des programmes de soins revitalisants dont l\u2019efficacit\u00e9 a \u00e9t\u00e9 cliniquement d\u00e9montr\u00e9e. En 2004, Alexandre Flueckiger est fier de lancer Alpeor, une marque exclusive suisse de soins de la peau qui allie les propri\u00e9t\u00e9s exceptionnelles des plantes des Alpes suisses aux derni\u00e8res avanc\u00e9es de la science cosm\u00e9tique.<\/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>Le jardin alpin<\/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>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_last_edited=&#8221;off|tablet&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_heading_font||on||||||&#8221; text_text_color=&#8221;#195852&#8243; text_font_size=&#8221;30px&#8221; text_line_height=&#8221;1em&#8221; custom_margin=&#8221;||20px||false|false&#8221; custom_padding=&#8221;||||false|false&#8221; text_orientation_tablet=&#8221;&#8221; text_orientation_phone=&#8221;left&#8221; text_orientation_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]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>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_last_edited=&#8221;off|tablet&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_heading_font||on||||||&#8221; text_text_color=&#8221;#195852&#8243; text_font_size=&#8221;30px&#8221; text_line_height=&#8221;1em&#8221; custom_margin=&#8221;||10px||false|false&#8221; custom_padding=&#8221;||||false|false&#8221; text_orientation_tablet=&#8221;&#8221; text_orientation_phone=&#8221;left&#8221; text_orientation_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>La marque<\/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>Les secrets des plantes suisses au service de votre peau<\/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>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_last_edited=&#8221;off|tablet&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_heading_font||on||||||&#8221; text_text_color=&#8221;#195852&#8243; text_font_size=&#8221;30px&#8221; text_line_height=&#8221;1em&#8221; custom_margin=&#8221;||10px||false|false&#8221; custom_padding=&#8221;||||false|false&#8221; text_orientation_tablet=&#8221;&#8221; text_orientation_phone=&#8221;left&#8221; text_orientation_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>Notre 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>La formulation de soins cosm\u00e9tiques performants \u2013 100% Made in Switzerland<\/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>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_last_edited=&#8221;off|tablet&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_heading_font||on||||||&#8221; text_text_color=&#8221;#195852&#8243; text_font_size=&#8221;30px&#8221; text_line_height=&#8221;1em&#8221; custom_margin=&#8221;||20px||false|false&#8221; custom_padding=&#8221;||||false|false&#8221; text_orientation_tablet=&#8221;&#8221; text_orientation_phone=&#8221;left&#8221; text_orientation_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>Swiss Essence<\/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>Enti\u00e8rement con\u00e7ues, d\u00e9velopp\u00e9es et conditionn\u00e9es en Suisse selon les standards de qualit\u00e9 les plus stricts, nos lignes de soins sont infus\u00e9es d\u2019actifs naturels pr\u00e9cieux. Apposer le sigle Alpeor sur un soin, c\u2019est lui garantir une signature unique empreinte de Swiss Essence, une touche singuli\u00e8re qui incarne l\u2019\u00e2me et l\u2019ADN de notre marque depuis plus de 20 ans.<\/p>\n<p>Notre mission est claire : nous souhaitons vous offrir les meilleurs soins cosm\u00e9tiques capables d\u2019assurer la vitalit\u00e9 cellulaire et de pr\u00e9server la jeunesse, la sant\u00e9 et le bien-\u00eatre g\u00e9n\u00e9ral de votre peau.<\/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>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_last_edited=&#8221;off|tablet&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_heading_font||on||||||&#8221; text_text_color=&#8221;#195852&#8243; text_font_size=&#8221;30px&#8221; text_line_height=&#8221;1em&#8221; custom_margin=&#8221;||10px||false|false&#8221; custom_padding=&#8221;||||false|false&#8221; text_orientation_tablet=&#8221;&#8221; text_orientation_phone=&#8221;left&#8221; text_orientation_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>Nos engagements<\/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>Une marque responsable &amp; engag\u00e9e<\/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>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_last_edited=&#8221;off|tablet&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_heading_font||on||||||&#8221; text_text_color=&#8221;#195852&#8243; text_font_size=&#8221;30px&#8221; text_line_height=&#8221;1em&#8221; custom_margin=&#8221;||20px||false|false&#8221; custom_padding=&#8221;||||false|false&#8221; text_orientation_tablet=&#8221;&#8221; text_orientation_phone=&#8221;left&#8221; text_orientation_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/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>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_phone=&#8221;<\/p>\n<p>Le r\u00e8gne v\u00e9g\u00e9tal au c\u0153ur de la science<\/p>\n<p>&#8221; content_last_edited=&#8221;off|tablet&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_heading_font||on||||||&#8221; text_text_color=&#8221;#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>Sont enti\u00e8rement fabriqu\u00e9s en Suisse :<\/strong> de leur d\u00e9veloppement \u00e0 leur emballage, en passant par leur formulation<\/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>Contiennent des plantes Alpines organiques certifi\u00e9es<\/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>Utilisent des emballages respectueux de la plan\u00e8te :<\/strong> sans cellophane, recycl\u00e9s et recyclables dans la mesure du possible, du verre plut\u00f4t que du plastique<\/p>\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>","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>","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}]}}