{
  "version": 3,
  "sources": ["/cdn/shop/t/174/assets/cs-lab-purchase-motion.js?mobile-polish-check=20260906"],
  "sourcesContent": ["// Optional presentation layer. Variant, price, size and submission logic stay in RingLab.\n(() => {\n  if (window.CorsaillePurchaseMotion) return;\n  const attach = root => {\n    const button = root.querySelector('[data-submit]');\n    if (!button?.animate || root.dataset.handle === 'epure-oval') return null;\n    const steps = [...root.querySelectorAll('details.cl-step')];\n    const animations = new Map(), targets = new WeakMap(), cleanups = [], seen = new Set();\n    let breath = null, lastGlare = '', advanceTimer = null, method = 'keyboard', spaceChoice = null, destroyed = false;\n    const listen = (target, event, handler, options) => {\n      target.addEventListener(event, handler, options);\n      cleanups.push(() => target.removeEventListener(event, handler, options));\n    };\n    const cancelBreath = () => {\n      breath?.cancel(); breath = null;\n      delete button.dataset.breathe;\n    };\n    const breathe = (kind, previous) => {\n      // Hybrid purchase cues use the existing CSS glare only. Keep the button\n      // anchored: the previous 3% / 1.8s inflation looked like a bounce.\n      if (root.dataset.concept === 'hybrid') return;\n      if (seen.has(kind) || destroyed || button.disabled) return;\n      seen.add(kind);\n      // A ready cue that strengthens the currently running intro stays one continuous gesture.\n      if (previous === 'intro' && breath) return;\n      const style = getComputedStyle(button), from = style.transform, fromShadow = style.boxShadow;\n      cancelBreath();\n      button.dataset.breathe = kind;\n      const current = button.animate([\n        { offset: 0, transform: from, boxShadow: fromShadow, easing: 'cubic-bezier(.16,1,.3,1)' },\n        { offset: 2 / 9, transform: 'scale(1.03)', boxShadow: '0 7px 18px -12px rgb(15 22 19 / .24)', easing: 'cubic-bezier(.3,0,.25,1)' },\n        { offset: 1, transform: 'scale(1)', boxShadow: '0 0 0 0 rgb(15 22 19 / 0)' }\n      ], { duration: 1800, easing: 'linear', iterations: 1 });\n      breath = current;\n      current.finished.then(() => {\n        if (breath !== current) return;\n        breath = null; delete button.dataset.breathe;\n      }).catch(() => {});\n    };\n    const glareObserver = new MutationObserver(() => {\n      const kind = button.dataset.glare || '', previous = lastGlare;\n      lastGlare = kind;\n      if (button.disabled) { cancelBreath(); return; }\n      if (kind && kind !== previous) breathe(kind, previous);\n      // Normal 700ms glint completion must not cut off the 1.4s settling phase.\n      if (!kind && previous && breath && Number(breath.currentTime) < 650) cancelBreath();\n    });\n    glareObserver.observe(button, { attributes: true, attributeFilter: ['data-glare', 'disabled'] });\n    const visibility = new IntersectionObserver(entries => {\n      if (entries.every(entry => !entry.isIntersecting)) cancelBreath();\n    });\n    visibility.observe(button);\n    listen(document, 'visibilitychange', () => { if (document.hidden) cancelBreath(); });\n    listen(document, 'cs:overlay-change', () => {\n      if (document.documentElement.hasAttribute('data-cs-overlay-open') || window.CorsailleOverlayCoordinator?.current) cancelBreath();\n    });\n    listen(root, 'toggle', event => { if (event.target.matches?.('dialog[open]')) cancelBreath(); }, true);\n\n    const cancelStep = step => {\n      const animation = animations.get(step);\n      if (!animation) return;\n      animation.cancel(); animations.delete(step); targets.delete(step);\n      step.style.removeProperty('height'); step.style.removeProperty('overflow');\n    };\n    const animateStep = (step, open) => {\n      if (destroyed) return;\n      const from = step.getBoundingClientRect().height;\n      const previous = animations.get(step);\n      previous?.cancel(); animations.delete(step);\n      targets.set(step, open);\n      step.style.removeProperty('height'); step.style.removeProperty('overflow');\n      if (!open && !step.open && !previous) { targets.delete(step); return; }\n      step.open = true;\n      const style = getComputedStyle(step);\n      const closed = step.querySelector('summary').getBoundingClientRect().height + parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);\n      const to = open ? step.getBoundingClientRect().height : closed;\n      if (Math.abs(from - to) < 1) { step.open = open; targets.delete(step); return; }\n      step.style.overflow = 'hidden';\n      const animation = step.animate([{ height: `${from}px` }, { height: `${to}px` }], {\n        duration: open ? 260 : 220, easing: 'cubic-bezier(.22,.7,.25,1)', iterations: 1, fill: 'both'\n      });\n      animations.set(step, animation);\n      animation.finished.then(() => {\n        if (animations.get(step) !== animation) return;\n        // A completed size selection can close the disclosure before toggle is\n        // delivered. Its newer state wins over this captured opening target.\n        if (open && !step.open) { cancelStep(step); return; }\n        step.open = open;\n        animations.delete(step); targets.delete(step); animation.cancel();\n        step.style.removeProperty('height'); step.style.removeProperty('overflow');\n      }).catch(() => {});\n    };\n    const showStep = next => {\n      steps.forEach(step => { if (step !== next && step.open) animateStep(step, false); });\n      if (next) animateStep(next, true);\n    };\n    steps.forEach(step => {\n      const summary = step.querySelector('summary');\n      listen(summary, 'click', event => {\n        if (event.target.closest('button,a,input,select')) return;\n        event.preventDefault(); clearTimeout(advanceTimer);\n        const closing = targets.has(step) ? targets.get(step) : step.open;\n        if (closing) animateStep(step, false); else showStep(step);\n      });\n      listen(step, 'toggle', () => {\n        if (!step.open) { cancelStep(step); return; }\n        if (step.open && !animations.has(step)) steps.forEach(other => {\n          if (other !== step && other.open && !animations.has(other)) animateStep(other, false);\n        });\n      });\n    });\n    listen(root, 'pointerdown', event => {\n      if (!event.isTrusted) return;\n      spaceChoice = null;\n      if (event.target.closest('.cl-choice')) method = 'pointer';\n    }, { passive: true });\n    listen(root, 'keydown', event => {\n      if (!event.target.matches('[data-option-index]')) return;\n      if (!event.isTrusted || event.defaultPrevented) return;\n      const input = event.target, space = event.key === ' ' || event.key === 'Spacebar';\n      if (!space) spaceChoice = null;\n      method = /^Arrow/.test(event.key) ? 'arrow' : 'keyboard';\n      if (method === 'arrow') clearTimeout(advanceTimer);\n      if (space && input.checked && !input.disabled && !root.busy && root.selected?.[Number(input.dataset.optionIndex)] === input.value) {\n        // Checked radios need an explicit Space confirmation: Chrome emits no\n        // native click/change for them. Suppress native activation to avoid twins.\n        event.preventDefault();\n        if (!event.repeat) { spaceChoice = input; clearTimeout(advanceTimer); }\n      }\n    });\n    listen(root, 'keyup', event => {\n      if (!event.isTrusted || (event.key !== ' ' && event.key !== 'Spacebar')) return;\n      const input = spaceChoice; spaceChoice = null;\n      if (!input || event.defaultPrevented) return;\n      event.preventDefault();\n      if (event.target === input && document.activeElement === input) confirmChoice(input);\n    });\n    listen(root, 'focusout', event => { if (event.target === spaceChoice) spaceChoice = null; });\n    const confirmChoice = input => {\n      if (destroyed || !input?.checked || input.disabled || root.busy) return;\n      const index = Number(input.dataset.optionIndex);\n      if (root.selected?.[index] !== input.value) return;\n      const step = input.closest('[data-option-step]'), label = input.nextElementSibling;\n      label?.animate([{ transform: 'scale(1)' }, { transform: 'scale(1.012)', offset: .35 }, { transform: 'scale(1)' }], { duration: 220, easing: 'ease-out' });\n      step?.querySelector('[data-option-current]')?.animate([{ opacity: .55, transform: 'translateY(2px)' }, { opacity: 1, transform: 'translateY(0)' }], { duration: 180, easing: 'ease-out' });\n      clearTimeout(advanceTimer);\n      if (method === 'arrow' || !step) return;\n      advanceTimer = setTimeout(() => {\n        if (destroyed || !root.isConnected || root.busy || input.disabled || !input.checked || root.selected?.[index] !== input.value || !step.open || root.querySelector('dialog[open]')) return;\n        const next = steps.slice(steps.indexOf(step) + 1).find(candidate => candidate.querySelector('[data-option-index]:not(:disabled),[data-size]:not(:disabled):not([hidden])'));\n        (next || step).querySelector('summary')?.focus({ preventScroll: true });\n        showStep(next || null);\n      }, 170);\n    };\n    listen(root, 'click', event => {\n      const input = event.target.closest('input[type=\"radio\"][data-option-index]');\n      if (!event.isTrusted || event.defaultPrevented || !input) return;\n      // Native radio clicks precede change. Only an already-selected value agrees\n      // with RingLab here; changed choices are confirmed once, after its sync.\n      confirmChoice(input);\n    });\n    listen(root, 'change', event => {\n      if (!event.isTrusted || event.defaultPrevented) return;\n      confirmChoice(event.target.closest('[data-option-index]'));\n    });\n    return {\n      destroy() {\n        destroyed = true; spaceChoice = null; clearTimeout(advanceTimer); cancelBreath();\n        glareObserver.disconnect(); visibility.disconnect(); cleanups.forEach(cleanup => cleanup());\n        animations.forEach((animation, step) => {\n          const open = targets.get(step);\n          animation.cancel();\n          if (typeof open === 'boolean') step.open = open;\n          targets.delete(step);\n          step.style.removeProperty('height'); step.style.removeProperty('overflow');\n        });\n        animations.clear();\n      }\n    };\n  };\n  window.CorsaillePurchaseMotion = { attach };\n})();\n"],
  "mappings": "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",
  "names": []
}
