{"id":9195,"date":"2025-10-26T18:22:40","date_gmt":"2025-10-26T18:22:40","guid":{"rendered":"https:\/\/yumastudiopilates.com\/?page_id=9195"},"modified":"2025-10-27T15:00:19","modified_gmt":"2025-10-27T15:00:19","slug":"cart","status":"publish","type":"page","link":"https:\/\/yumastudiopilates.com\/en\/cart\/","title":{"rendered":"Cart"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"9195\" class=\"elementor elementor-9195\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b03ecec e-con-full e-flex e-con e-parent\" data-id=\"b03ecec\" 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-f1ddbad e-con-full e-flex e-con e-child\" data-id=\"f1ddbad\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3e7065e reveal-left  elementor-widget elementor-widget-heading\" data-id=\"3e7065e\" 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\">Panier<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6cf2101 elementor-widget elementor-widget-html\" data-id=\"6cf2101\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n\/* Reveal from right *\/\r\n.reveal-right {\r\n  animation: revealRight 1.5s ease-out forwards;\r\n  clip-path: inset(0 0 0 100%);\r\n}\r\n\r\n@keyframes revealRight {\r\n  0% {\r\n    clip-path: inset(0 0 0 100%);\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-right.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-right.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-right elements initially\r\n  document.querySelectorAll('.reveal-right').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-2299cfb elementor-widget elementor-widget-html\" data-id=\"2299cfb\" 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 class=\"elementor-element elementor-element-62651c5 elementor-widget elementor-widget-html\" data-id=\"62651c5\" 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.9s 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<\/div>\n\t\t<div class=\"elementor-element elementor-element-c44154b e-flex e-con-boxed e-con e-parent\" data-id=\"c44154b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9b0e49c elementor-widget elementor-widget-shortcode\" data-id=\"9b0e49c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">[woocommerce_cart]<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Panier [woocommerce_cart]<\/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-9195","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/yumastudiopilates.com\/en\/wp-json\/wp\/v2\/pages\/9195","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=9195"}],"version-history":[{"count":0,"href":"https:\/\/yumastudiopilates.com\/en\/wp-json\/wp\/v2\/pages\/9195\/revisions"}],"wp:attachment":[{"href":"https:\/\/yumastudiopilates.com\/en\/wp-json\/wp\/v2\/media?parent=9195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}