{"id":11075,"date":"2025-11-29T05:04:00","date_gmt":"2025-11-29T05:04:00","guid":{"rendered":"https:\/\/yumastudiopilates.com\/?page_id=11075"},"modified":"2025-11-29T15:54:10","modified_gmt":"2025-11-29T15:54:10","slug":"merci","status":"publish","type":"page","link":"https:\/\/yumastudiopilates.com\/en\/merci\/","title":{"rendered":"Thank You"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"11075\" class=\"elementor elementor-11075\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d95a646 e-con-full e-flex e-con e-parent\" data-id=\"d95a646\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-6e93f70 e-con-full e-flex e-con e-child\" data-id=\"6e93f70\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-ea8354b e-con-full e-flex e-con e-child\" data-id=\"ea8354b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bd944d9 reveal-left elementor-widget elementor-widget-heading\" data-id=\"bd944d9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Bienvenue dans l\u2019univers Y\u00dcMA, <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-41ec6bb elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"41ec6bb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>un espace o\u00f9 le mouvement devient une exp\u00e9rience, et o\u00f9 le corps retrouve son \u00e9quilibre\u00a0naturel.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-686a808 elementor-widget elementor-widget-html\" data-id=\"686a808\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n\/* Reveal from left *\/\r\n.reveal-left {\r\n  animation: revealLeft 1s ease-out forwards;\r\n  clip-path: inset(0 100% 0 0);\r\n}\r\n\r\n@keyframes revealLeft {\r\n  0% {\r\n    clip-path: inset(0 100% 0 0);\r\n  }\r\n  100% {\r\n    clip-path: inset(0 0 0 0);\r\n  }\r\n}\r\n\r\n\/* Add this to prevent animation from running initially *\/\r\n.reveal-left.paused {\r\n  animation-play-state: paused;\r\n}\r\n<\/style>\r\n\r\n<script>\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n  \/\/ Function to check if element is in viewport\r\n  function isElementInViewport(el) {\r\n    const rect = el.getBoundingClientRect();\r\n    return (\r\n      rect.top <= (window.innerHeight || document.documentElement.clientHeight) * 0.8 &&\r\n      rect.bottom >= 0\r\n    );\r\n  }\r\n\r\n  \/\/ Function to handle scroll events\r\n  function handleScroll() {\r\n    const revealElements = document.querySelectorAll('.reveal-left.paused');\r\n    \r\n    revealElements.forEach(element => {\r\n      if (isElementInViewport(element)) {\r\n        \/\/ Remove paused class to let animation play\r\n        element.classList.remove('paused');\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ Add paused class to all reveal-left elements initially\r\n  document.querySelectorAll('.reveal-left').forEach(element => {\r\n    element.classList.add('paused');\r\n  });\r\n\r\n  \/\/ Initial check on page load\r\n  handleScroll();\r\n  \r\n  \/\/ Add scroll event listener\r\n  window.addEventListener('scroll', handleScroll);\r\n  \r\n  \/\/ Add resize event listener\r\n  window.addEventListener('resize', handleScroll);\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-05800d1 e-flex e-con-boxed e-con e-parent\" data-id=\"05800d1\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-f463e99 e-con-full animated-slow e-flex e-con e-child\" data-id=\"f463e99\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;animation&quot;:&quot;none&quot;,&quot;animation_delay&quot;:300}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-aef9969 elementor-widget elementor-widget-html\" data-id=\"aef9969\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n\/* Reveal from left *\/\r\n.reveal-left {\r\n  animation: revealLeft 1.5s ease-out forwards;\r\n  clip-path: inset(0 100% 0 0);\r\n}\r\n\r\n@keyframes revealLeft {\r\n  0% {\r\n    clip-path: inset(0 100% 0 0);\r\n  }\r\n  100% {\r\n    clip-path: inset(0 0 0 0);\r\n  }\r\n}\r\n\r\n\/* Add this to prevent animation from running initially *\/\r\n.reveal-left.paused {\r\n  animation-play-state: paused;\r\n}\r\n<\/style>\r\n\r\n<script>\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n  \/\/ Function to check if element is in viewport\r\n  function isElementInViewport(el) {\r\n    const rect = el.getBoundingClientRect();\r\n    return (\r\n      rect.top <= (window.innerHeight || document.documentElement.clientHeight) * 0.8 &&\r\n      rect.bottom >= 0\r\n    );\r\n  }\r\n\r\n  \/\/ Function to handle scroll events with staggered animation\r\n  function handleScroll() {\r\n    const revealElements = document.querySelectorAll('.reveal-left.paused');\r\n    \r\n    revealElements.forEach((element, index) => {\r\n      if (isElementInViewport(element)) {\r\n        \/\/ Calculate delay - 200ms base delay + 300ms per element index\r\n        const baseDelay = 200; \/\/ Initial delay before first animation\r\n        const staggerDelay = index * 300; \/\/ Delay between each element\r\n        const totalDelay = baseDelay + staggerDelay;\r\n        \r\n        \/\/ Set a timeout to remove paused class after the calculated delay\r\n        setTimeout(() => {\r\n          element.classList.remove('paused');\r\n        }, totalDelay);\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ Add paused class to all reveal-left elements initially\r\n  document.querySelectorAll('.reveal-left').forEach(element => {\r\n    element.classList.add('paused');\r\n  });\r\n\r\n  \/\/ Initial check on page load\r\n  handleScroll();\r\n  \r\n  \/\/ Add scroll event listener with throttling for better performance\r\n  let ticking = false;\r\n  function updateOnScroll() {\r\n    if (!ticking) {\r\n      window.requestAnimationFrame(function() {\r\n        handleScroll();\r\n        ticking = false;\r\n      });\r\n      ticking = true;\r\n    }\r\n  }\r\n  \r\n  window.addEventListener('scroll', updateOnScroll);\r\n  \r\n  \/\/ Add resize event listener\r\n  window.addEventListener('resize', handleScroll);\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a4d7b31 stagger elementor-widget elementor-widget-heading\" data-id=\"a4d7b31\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">MERCI<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-741b436 reveal-left elementor-widget elementor-widget-heading\" data-id=\"741b436\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Pour votre commande<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-76c3d22 elementor-widget elementor-widget-html\" data-id=\"76c3d22\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/gsap@3.13.0\/dist\/gsap.min.js\"><\/script>\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/gsap@3.13.0\/dist\/SplitText.min.js\"><\/script>\r\n<script>\r\ngsap.registerPlugin(SplitText);\r\nlet mm = gsap.matchMedia();\r\nlet animatedElements = new Set();\r\n\r\n\/\/ Animation function for .stagger class (slower)\r\nfunction animateStagger(element) {\r\n  if (animatedElements.has(element)) return;\r\n  animatedElements.add(element);\r\n  \r\n  const textElements = element.querySelectorAll(\"h1, h2, h3, h4, h5, h6, p\");\r\n  textElements.forEach(textEl => {\r\n    gsap.set(textEl, { opacity: 1 });\r\n    SplitText.create(textEl, {\r\n      type: \"chars,words\",\r\n      mask: \"chars\",\r\n      onSplit(self) {\r\n        return gsap.from(self.chars, {\r\n          duration: 1.0, \/\/ Decreased from 1.2 to 1.0\r\n          yPercent: 100,\r\n          opacity: 0,\r\n          stagger: 0.12, \/\/ Decreased from 0.15 to 0.12\r\n          delay: 0.4, \/\/ Decreased from 0.3 to 0.2\r\n          ease: \"power3.out\"\r\n        });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\n\/\/ Animation function for .text-reveal class (slow)\r\nfunction animateTextReveal(element) {\r\n  if (animatedElements.has(element)) return;\r\n  animatedElements.add(element);\r\n  \r\n  const textElements = element.querySelectorAll(\"h1, h2, h3, h4, h5, h6, p\");\r\n  textElements.forEach(textEl => {\r\n    gsap.set(textEl, { opacity: 1 });\r\n    SplitText.create(textEl, {\r\n      type: \"chars,words\",\r\n      mask: \"chars\",\r\n      onSplit(self) {\r\n        return gsap.from(self.chars, {\r\n          duration: 0.9, \/\/ Decreased from 1.0 to 0.9\r\n          yPercent: 100,\r\n          opacity: 0,\r\n          stagger: 0.08, \/\/ Decreased from 0.1 to 0.08\r\n          delay: 0.15, \/\/ Decreased from 0.2 to 0.15\r\n          ease: \"power3.out\"\r\n        });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\ndocument.fonts.ready.then(() => {\r\n  \/\/ Set initial opacity to 0 for all text elements\r\n  gsap.set(\".stagger h1, .stagger h2, .stagger h3, .stagger h4, .stagger h5, .stagger h6, .stagger p\", { opacity: 0 });\r\n  gsap.set(\".text-reveal h1, .text-reveal h2, .text-reveal h3, .text-reveal h4, .text-reveal h5, .text-reveal h6, .text-reveal p\", { opacity: 0 });\r\n  \r\n  mm.add({\r\n    noMotion: \"(prefers-reduced-motion: no-preference)\",\r\n    reducedMotion: \"(prefers-reduced-motion: reduce)\"\r\n  }, (ctx) => {\r\n    const { noMotion, reducedMotion } = ctx.conditions;\r\n    \r\n    if (noMotion) {\r\n      \/\/ Create intersection observer for scroll-triggered animations\r\n      const observer = new IntersectionObserver((entries) => {\r\n        entries.forEach(entry => {\r\n          if (entry.isIntersecting) {\r\n            \/\/ Add a delay before starting the animation\r\n            setTimeout(() => {\r\n              if (entry.target.classList.contains('stagger')) {\r\n                animateStagger(entry.target);\r\n              } else if (entry.target.classList.contains('text-reveal')) {\r\n                animateTextReveal(entry.target);\r\n              }\r\n            }, 250); \/\/ Decreased from 400ms to 250ms\r\n            \r\n            observer.unobserve(entry.target);\r\n          }\r\n        });\r\n      }, {\r\n        threshold: 0.1,\r\n        rootMargin: \"0px 0px -50px 0px\"\r\n      });\r\n      \r\n      \/\/ Observe all elements with animation classes\r\n      document.querySelectorAll('.stagger, .text-reveal').forEach(el => {\r\n        observer.observe(el);\r\n      });\r\n      \r\n    } else if (reducedMotion) {\r\n      \/\/ For reduced motion, just show elements immediately\r\n      document.querySelectorAll(\".stagger *, .text-reveal *\").forEach(el => {\r\n        el.style.opacity = 1;\r\n      });\r\n    }\r\n    \r\n    return () => {\r\n      \/\/ Cleanup if necessary\r\n    };\r\n  });\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d08a6d4 word-fade-up elementor-widget elementor-widget-heading\" data-id=\"d08a6d4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">UN EMAIL DE CONFIRMATION VOUS A \u00c9T\u00c9 ENVOY\u00c9 AVEC VOTRE \n<b style=\"font-family:'Migra', serif\">ID de commande,<\/b> \n<b style=\"font-family:'Migra', serif\">D\u00e9tails du cours,<\/b> \nAND <b style=\"font-family:'Migra', serif\">Studio s\u00e9lectionn\u00e9.<\/b><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-733f049 elementor-widget elementor-widget-html\" data-id=\"733f049\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n.word-fade-up {\r\n  \/* Removed display: inline-block to avoid overriding existing styles *\/\r\n}\r\n\r\n.word-fade-up .word {\r\n  display: inline-block;\r\n  opacity: 0;\r\n  transform: translateY(30px);\r\n  transition: opacity 0.6s ease, transform 0.6s ease;\r\n}\r\n\r\n.word-fade-up .word.animate {\r\n  opacity: 1;\r\n  transform: translateY(0);\r\n}\r\n\r\n\/* Removed space handling to preserve original formatting *\/\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n  function wrapWordsInSpans(element) {\r\n    \/\/ Create a tree walker to traverse all text nodes\r\n    const walker = document.createTreeWalker(\r\n      element,\r\n      NodeFilter.SHOW_TEXT,\r\n      {\r\n        acceptNode: function(node) {\r\n          \/\/ Skip empty text nodes and script\/style tags\r\n          if (node.parentNode.nodeName === 'SCRIPT' || \r\n              node.parentNode.nodeName === 'STYLE' || \r\n              node.textContent.trim() === '') {\r\n            return NodeFilter.FILTER_REJECT;\r\n          }\r\n          return NodeFilter.FILTER_ACCEPT;\r\n        }\r\n      }\r\n    );\r\n\r\n    \/\/ Process each text node\r\n    let textNode;\r\n    const textNodes = [];\r\n    while (textNode = walker.nextNode()) {\r\n      textNodes.push(textNode);\r\n    }\r\n\r\n    \/\/ Process in reverse to maintain DOM order\r\n    textNodes.reverse().forEach(node => {\r\n      const text = node.textContent;\r\n      const words = text.split(\/(\\s+)\/);\r\n      \r\n      \/\/ Create a document fragment to hold our new nodes\r\n      const fragment = document.createDocumentFragment();\r\n      \r\n      words.forEach(word => {\r\n        if (word.trim() === '') {\r\n          \/\/ This is whitespace, preserve it\r\n          fragment.appendChild(document.createTextNode(word));\r\n        } else {\r\n          \/\/ This is a word, wrap it in a span\r\n          const span = document.createElement('span');\r\n          span.className = 'word';\r\n          span.textContent = word;\r\n          fragment.appendChild(span);\r\n        }\r\n      });\r\n      \r\n      \/\/ Replace the original text node with our fragment\r\n      node.parentNode.replaceChild(fragment, node);\r\n    });\r\n  }\r\n\r\n  function init() {\r\n    document.querySelectorAll('.word-fade-up').forEach(el => {\r\n      if (!el.dataset.wfi) {\r\n        \/\/ Only wrap words, don't modify the element's structure\r\n        wrapWordsInSpans(el);\r\n        el.dataset.wfi = '1';\r\n      }\r\n    });\r\n  }\r\n\r\n  function animate(el) {\r\n    \/\/ Find all word spans within this element\r\n    const words = el.querySelectorAll('.word');\r\n    words.forEach((w, i) => {\r\n      setTimeout(() => w.classList.add('animate'), i * 100);\r\n    });\r\n  }\r\n\r\n  const obs = new IntersectionObserver(entries => {\r\n    entries.forEach(e => {\r\n      if (e.isIntersecting && !e.target.dataset.ani) {\r\n        animate(e.target);\r\n        e.target.dataset.ani = '1';\r\n      }\r\n    });\r\n  }, { threshold: 0.2 });\r\n\r\n  function setup() {\r\n    init();\r\n    document.querySelectorAll('.word-fade-up').forEach(el => obs.observe(el));\r\n  }\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', setup);\r\n  } else {\r\n    setup();\r\n  }\r\n\r\n  \/\/ Watch for dynamically added elements\r\n  new MutationObserver(setup).observe(document.body, { childList: true, subtree: true });\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Bienvenue dans l\u2019univers Y\u00dcMA, un espace o\u00f9 le mouvement devient une exp\u00e9rience, et o\u00f9 le corps retrouve son \u00e9quilibre\u00a0naturel. MERCI [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-11075","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/yumastudiopilates.com\/en\/wp-json\/wp\/v2\/pages\/11075","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yumastudiopilates.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/yumastudiopilates.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/yumastudiopilates.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yumastudiopilates.com\/en\/wp-json\/wp\/v2\/comments?post=11075"}],"version-history":[{"count":1,"href":"https:\/\/yumastudiopilates.com\/en\/wp-json\/wp\/v2\/pages\/11075\/revisions"}],"predecessor-version":[{"id":17435,"href":"https:\/\/yumastudiopilates.com\/en\/wp-json\/wp\/v2\/pages\/11075\/revisions\/17435"}],"wp:attachment":[{"href":"https:\/\/yumastudiopilates.com\/en\/wp-json\/wp\/v2\/media?parent=11075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}