{
  "version": 3,
  "sources": ["/cdn/shop/t/1/assets/drag-zoom-wrapper.js?FollowSite=0&SiteName=%27-whscheck%28%29-%27"],
  "sourcesContent": ["import { clamp, preventDefault, isMobileBreakpoint } from './utilities.js';\nimport { ZoomDialog } from './zoom-dialog.js';\n\nconst MIN_ZOOM = 1;\nconst MAX_ZOOM = 5;\nconst DEFAULT_ZOOM = 1.5;\nconst DOUBLE_TAP_DELAY = 300;\nconst DOUBLE_TAP_DISTANCE = 50;\nconst DRAG_THRESHOLD = 10;\n\nexport class DragZoomWrapper extends HTMLElement {\n  #controller = new AbortController();\n  /** @type {number} */\n  #scale = DEFAULT_ZOOM;\n  /** @type {number} */\n  #initialDistance = 0;\n  /** @type {number} */\n  #startScale = DEFAULT_ZOOM;\n  /** @type {Point} */\n  #translate = { x: 0, y: 0 };\n  /** @type {Point} */\n  #startPosition = { x: 0, y: 0 };\n  /** @type {Point} */\n  #startTranslate = { x: 0, y: 0 };\n  /** @type {boolean} */\n  #isDragging = false;\n  /** @type {boolean} */\n  #initialized = false;\n  /** @type {number | null} */\n  #animationFrame = null;\n  /** @type {number} */\n  #lastTapTime = 0;\n  /** @type {Point | null} */\n  #lastTapPosition = null;\n\n  /** @type {boolean} */\n  #hasDraggedBeyondThreshold = false;\n\n  /** @type {boolean} */\n  #hasManualZoom = false;\n\n  get #image() {\n    return this.querySelector('img');\n  }\n\n  connectedCallback() {\n    if (!this.#image) return;\n\n    this.#initResizeListener();\n    this.#setupDialogCloseListener();\n\n    if (!isMobileBreakpoint()) return;\n\n    this.#initEventListeners();\n    this.#updateTransform();\n  }\n\n  #initResizeListener() {\n    this.#resizeObserver.observe(this);\n  }\n\n  /**\n   * Override parent zoom dialog's close method to include reset functionality\n   */\n  #setupDialogCloseListener() {\n    // Find the parent zoom dialog component\n    const zoomDialog = /** @type {ZoomDialog} */ (this.closest('zoom-dialog'));\n    if (!zoomDialog || typeof zoomDialog.close !== 'function') return;\n\n    // Store reference to original close method\n    const originalClose = zoomDialog.close.bind(zoomDialog);\n\n    // Override the close method to include zoom reset\n    zoomDialog.close = async (...args) => {\n      // Reset zoom state before closing\n      this.#resetZoom();\n\n      // Call original close method\n      return await originalClose(...args);\n    };\n  }\n\n  #initEventListeners() {\n    if (this.#initialized) return;\n    this.#initialized = true;\n    const { signal } = this.#controller;\n    const options = { passive: false, signal };\n\n    this.addEventListener('touchstart', this.#handleTouchStart, options);\n    this.addEventListener('touchmove', this.#handleTouchMove, options);\n    this.addEventListener('touchend', this.#handleTouchEnd, options);\n\n    // Initialize transform immediately\n    this.#updateTransform();\n  }\n\n  disconnectedCallback() {\n    this.#controller.abort();\n    this.#resizeObserver.disconnect();\n    this.#cancelAnimationFrame();\n  }\n\n  #handleResize = () => {\n    if (!this.#initialized && isMobileBreakpoint()) {\n      this.#initEventListeners();\n    }\n\n    if (this.#initialized) {\n      this.#requestUpdateTransform();\n    }\n  };\n\n  #resizeObserver = new ResizeObserver(this.#handleResize);\n\n  /**\n   * @param {TouchEvent} event\n   */\n  #handleTouchStart = (event) => {\n    preventDefault(event);\n\n    const touchCount = event.touches.length;\n\n    if (touchCount === 2) {\n      // Early exit if touches are invalid\n      const touch1 = event.touches[0];\n      const touch2 = event.touches[1];\n      if (!touch1 || !touch2) return;\n\n      // Avoid object allocation by passing touches directly\n      this.#startZoomGestureFromTouches(touch1, touch2);\n    } else if (touchCount === 1) {\n      const touch = event.touches[0];\n      if (!touch) return;\n\n      // Use performance.now() for better precision and performance\n      const currentTime = performance.now();\n      const timeSinceLastTap = currentTime - this.#lastTapTime;\n\n      // Early exit if too much time has passed\n      if (timeSinceLastTap >= DOUBLE_TAP_DELAY) {\n        this.#storeTapInfo(currentTime, touch);\n        this.#startDragGestureFromTouch(touch);\n        return;\n      }\n\n      // Only check distance if we have a previous tap within time window\n      if (this.#lastTapPosition) {\n        // Distance calculation with early exit\n        const distance = getDistance(touch, this.#lastTapPosition);\n\n        if (distance < DOUBLE_TAP_DISTANCE) {\n          // This is a double-tap, handle zoom toggle\n          this.#handleDoubleTapFromTouch(touch);\n          this.#lastTapTime = 0; // Reset to prevent triple-tap\n          this.#lastTapPosition = null;\n          return;\n        }\n      }\n\n      // Store tap info for potential double-tap detection\n      this.#storeTapInfo(currentTime, touch);\n      this.#startDragGestureFromTouch(touch);\n    }\n  };\n\n  /**\n   * Start a zoom gesture with two touches\n   * @param {Touch} touch1\n   * @param {Touch} touch2\n   */\n  #startZoomGestureFromTouches(touch1, touch2) {\n    // Calculate initial distance between touches\n    this.#initialDistance = getDistance(touch1, touch2);\n    this.#startScale = this.#scale;\n    this.#isDragging = false;\n  }\n\n  /**\n   * Start a drag gesture with a single touch\n   * @param {Touch} touch\n   */\n  #startDragGestureFromTouch(touch) {\n    this.#startPosition = { x: touch.clientX, y: touch.clientY };\n    this.#startTranslate = { x: this.#translate.x, y: this.#translate.y };\n    this.#isDragging = true;\n    this.#hasDraggedBeyondThreshold = false;\n  }\n\n  /**\n   * Store tap information for double-tap detection\n   * @param {number} currentTime\n   * @param {Touch} touch\n   */\n  #storeTapInfo(currentTime, touch) {\n    this.#lastTapTime = currentTime;\n    this.#lastTapPosition = { x: touch.clientX, y: touch.clientY };\n  }\n\n  /**\n   * Handle double-tap zoom toggle from touch\n   * @param {Touch} touch - The touch where the double-tap occurred\n   */\n  #handleDoubleTapFromTouch(touch) {\n    const containerCenter = {\n      x: this.clientWidth / 2,\n      y: this.clientHeight / 2,\n    };\n\n    let targetZoom;\n\n    // If manual zoom has been used, reset to 1x\n    if (this.#hasManualZoom) {\n      targetZoom = MIN_ZOOM; // 1x\n      this.#hasManualZoom = false; // Reset the flag\n      this.#translate = { x: 0, y: 0 }; // Center the image\n    } else {\n      // Toggle between zoom levels: 1x \u2194 1.5x\n      const tolerance = 0.05; // Small tolerance for floating point comparison\n\n      if (Math.abs(this.#scale - MIN_ZOOM) < tolerance) {\n        // Currently at 1x, go to 1.5x\n        targetZoom = DEFAULT_ZOOM;\n      } else {\n        // Currently at 1.5x or any other level, go to 1x\n        targetZoom = MIN_ZOOM;\n      }\n    }\n\n    // If we're not going to 1x, adjust translation to center zoom on the tap point\n    if (targetZoom !== MIN_ZOOM) {\n      const oldScale = this.#scale;\n      this.#scale = Math.min(MAX_ZOOM, targetZoom);\n\n      // Calculate the distance from tap point to container center\n      const distanceFromCenter = {\n        x: touch.clientX - containerCenter.x,\n        y: touch.clientY - containerCenter.y,\n      };\n\n      // Adjust translation to center zoom on the tap point\n      const scaleDelta = this.#scale / oldScale - 1.0;\n      this.#translate.x -= (distanceFromCenter.x * scaleDelta) / this.#scale;\n      this.#translate.y -= (distanceFromCenter.y * scaleDelta) / this.#scale;\n    } else {\n      // Going to 1x, set the scale and center the image\n      this.#scale = targetZoom;\n      this.#translate = { x: 0, y: 0 }; // Center the image when going to 1x\n    }\n\n    this.#requestUpdateTransform();\n  }\n\n  /**\n   * @param {TouchEvent} event\n   */\n  #handleTouchMove = (event) => {\n    preventDefault(event);\n\n    const touchCount = event.touches.length;\n\n    if (touchCount === 2) {\n      const touch1 = event.touches[0];\n      const touch2 = event.touches[1];\n      if (touch1 && touch2) {\n        this.#processZoomGesture(touch1, touch2);\n      }\n    } else if (touchCount === 1 && this.#isDragging) {\n      const touch = event.touches[0];\n      if (touch) {\n        this.#processDragGesture(touch);\n      }\n    }\n  };\n\n  /**\n   * Process zoom gesture from touches\n   * @param {Touch} touch1\n   * @param {Touch} touch2\n   */\n  #processZoomGesture(touch1, touch2) {\n    // Calculate midpoint directly without object allocation\n    const midX = (touch1.clientX + touch2.clientX) / 2;\n    const midY = (touch1.clientY + touch2.clientY) / 2;\n\n    // Calculate current distance between touches\n    const currentDistance = getDistance(touch1, touch2);\n\n    const oldScale = this.#scale;\n\n    // Calculate and apply new scale\n    const newScale = (currentDistance / this.#initialDistance) * this.#startScale;\n    this.#scale = clamp(newScale, MIN_ZOOM, MAX_ZOOM);\n\n    // Mark that manual zoom has been used\n    this.#hasManualZoom = true;\n\n    // Adjust translation to keep the pinch midpoint stationary\n    const containerCenterX = this.clientWidth / 2;\n    const containerCenterY = this.clientHeight / 2;\n\n    const distanceFromCenterX = midX - containerCenterX;\n    const distanceFromCenterY = midY - containerCenterY;\n\n    // Calculate how the image position needs to change to keep the midpoint stationary\n    const scaleDelta = this.#scale / oldScale - 1.0;\n\n    // Apply correction to prevent zooming on the opposite side of the midpoint\n    this.#translate.x -= (distanceFromCenterX * scaleDelta) / this.#scale;\n    this.#translate.y -= (distanceFromCenterY * scaleDelta) / this.#scale;\n\n    this.#requestUpdateTransform();\n    this.#isDragging = false;\n  }\n\n  /**\n   * Process drag gesture from touch\n   * @param {Touch} touch\n   */\n  #processDragGesture(touch) {\n    // Check if we've moved beyond the drag threshold\n    const distance = getDistance(touch, this.#startPosition);\n\n    if (!this.#hasDraggedBeyondThreshold && distance < DRAG_THRESHOLD) {\n      // Movement is too small, don't process as drag yet\n      return;\n    }\n\n    this.#hasDraggedBeyondThreshold = true;\n\n    // Calculate movement deltas for translation\n    const dx = touch.clientX - this.#startPosition.x;\n    const dy = touch.clientY - this.#startPosition.y;\n\n    // Calculate new translation directly\n    this.#translate.x = this.#startTranslate.x + dx / this.#scale;\n    this.#translate.y = this.#startTranslate.y + dy / this.#scale;\n\n    this.#requestUpdateTransform();\n  }\n\n  /**\n   * @param {TouchEvent} event\n   */\n  #handleTouchEnd = (event) => {\n    if (event.touches.length === 0) {\n      this.#isDragging = false;\n      this.#requestUpdateTransform();\n\n      this.#hasDraggedBeyondThreshold = false;\n    }\n  };\n\n  /**\n   * Constrain image translation to keep it within the viewport\n   */\n  #constrainTranslation() {\n    const containerWidth = this.clientWidth;\n    const containerHeight = this.clientHeight;\n    if (!containerWidth || !containerHeight || !this.#image) return;\n\n    // Keep scale between MIN_ZOOM (1) and MAX_ZOOM (5)\n    this.#scale = clamp(this.#scale, MIN_ZOOM, MAX_ZOOM);\n\n    // At minimum zoom (1x), the full image should be visible with no dragging allowed\n    if (this.#scale <= MIN_ZOOM) {\n      this.#translate.x = 0;\n      this.#translate.y = 0;\n      return;\n    }\n\n    // Get wrapper dimensions\n    const wrapperRect = this.getBoundingClientRect();\n\n    // Calculate ACTUAL image content dimensions at current zoom\n    // The image element may fill the wrapper, but the content has its own aspect ratio\n    const imageElement = this.#image;\n    let naturalWidth, naturalHeight;\n\n    // Try to get natural dimensions\n    if (imageElement.naturalWidth > 0 && imageElement.naturalHeight > 0) {\n      naturalWidth = imageElement.naturalWidth;\n      naturalHeight = imageElement.naturalHeight;\n    } else {\n      // Fallback: assume square image if we can't get natural dimensions\n      naturalWidth = wrapperRect.width;\n      naturalHeight = wrapperRect.width;\n    }\n\n    // Calculate how the image fits within the wrapper (object-fit: contain behavior)\n    const imageAspectRatio = naturalWidth / naturalHeight;\n    const wrapperAspectRatio = wrapperRect.width / wrapperRect.height;\n\n    let actualImageWidth, actualImageHeight;\n\n    if (imageAspectRatio > wrapperAspectRatio) {\n      // Image is wider - width fits exactly, height is smaller (letterboxed top/bottom)\n      actualImageWidth = wrapperRect.width;\n      actualImageHeight = actualImageWidth / imageAspectRatio;\n    } else {\n      // Image is taller - height fits exactly, width is smaller (letterboxed left/right)\n      actualImageHeight = wrapperRect.height;\n      actualImageWidth = actualImageHeight * imageAspectRatio;\n    }\n\n    // Apply current zoom scale\n    const scaledImageWidth = actualImageWidth * this.#scale;\n    const scaledImageHeight = actualImageHeight * this.#scale;\n\n    // SIMPLE APPROACH: Calculate constraints directly from image content dimensions\n    // If image content is larger than wrapper, calculate max translation directly\n\n    const horizontalOverflow = Math.max(0, scaledImageWidth - wrapperRect.width);\n    const verticalOverflow = Math.max(0, scaledImageHeight - wrapperRect.height);\n\n    // Max translation is half the overflow (since image starts centered)\n    const maxTranslateX = horizontalOverflow / 2 / this.#scale;\n    const maxTranslateY = verticalOverflow / 2 / this.#scale;\n\n    // Apply symmetric constraints (object-fit: contain behavior)\n    // Image starts centered, can move maxTranslate in each direction\n    this.#translate.x = clamp(this.#translate.x, -maxTranslateX, maxTranslateX);\n    this.#translate.y = clamp(this.#translate.y, -maxTranslateY, maxTranslateY);\n\n    // Apply final transforms to CSS\n    this.style.setProperty('--drag-zoom-scale', this.#scale.toString());\n    this.style.setProperty('--drag-zoom-translate-x', `${this.#translate.x}px`);\n    this.style.setProperty('--drag-zoom-translate-y', `${this.#translate.y}px`);\n  }\n\n  /**\n   * Request an animation frame to update the transform\n   */\n  #requestUpdateTransform = () => {\n    if (!this.#animationFrame) {\n      this.#animationFrame = requestAnimationFrame(this.#updateTransform);\n    }\n  };\n\n  /**\n   * Cancel any pending animation frame\n   */\n  #cancelAnimationFrame() {\n    if (this.#animationFrame) {\n      cancelAnimationFrame(this.#animationFrame);\n      this.#animationFrame = null;\n    }\n  }\n\n  #updateTransform = () => {\n    this.#animationFrame = null;\n\n    this.#constrainTranslation();\n    this.style.setProperty('--drag-zoom-scale', this.#scale.toString());\n    this.style.setProperty('--drag-zoom-translate-x', `${this.#translate.x}px`);\n    this.style.setProperty('--drag-zoom-translate-y', `${this.#translate.y}px`);\n  };\n\n  /**\n   * Reset zoom to default state (1.5x scale, centered position)\n   * Called when zoom is exited/closed\n   */\n  #resetZoom() {\n    // Reset scale and translation to defaults\n    this.#scale = DEFAULT_ZOOM;\n    this.#startScale = DEFAULT_ZOOM;\n    this.#translate.x = 0;\n    this.#translate.y = 0;\n\n    // Reset gesture state to prevent interference on next zoom open\n    this.#startPosition = { x: 0, y: 0 };\n    this.#startTranslate = { x: 0, y: 0 };\n    this.#isDragging = false;\n    this.#lastTapTime = 0;\n    this.#lastTapPosition = null;\n    this.#hasDraggedBeyondThreshold = false;\n\n    // Update CSS properties to reflect reset state\n    this.style.setProperty('--drag-zoom-scale', DEFAULT_ZOOM.toString());\n    this.style.setProperty('--drag-zoom-translate-x', '0px');\n    this.style.setProperty('--drag-zoom-translate-y', '0px');\n  }\n\n  destroy() {\n    this.#controller.abort();\n    this.#cancelAnimationFrame();\n  }\n}\n\n/**\n * Calculate distance between two points or touches\n * @param {Point | Touch} point1 - First point or touch\n * @param {Point | Touch} point2 - Second point or touch\n * @returns {number} Distance between the points\n */\nfunction getDistance(point1, point2) {\n  // Handle both Point objects (x, y) and Touch objects (clientX, clientY)\n  const x1 = /** @type {Point} */ (point1).x ?? /** @type {Touch} */ (point1).clientX;\n  const y1 = /** @type {Point} */ (point1).y ?? /** @type {Touch} */ (point1).clientY;\n  const x2 = /** @type {Point} */ (point2).x ?? /** @type {Touch} */ (point2).clientX;\n  const y2 = /** @type {Point} */ (point2).y ?? /** @type {Touch} */ (point2).clientY;\n\n  const dx = x1 - x2;\n  const dy = y1 - y2;\n  return Math.sqrt(dx * dx + dy * dy);\n}\n\nif (!customElements.get('drag-zoom-wrapper')) {\n  customElements.define('drag-zoom-wrapper', DragZoomWrapper);\n}\n\n/**\n * @typedef {Object} Point\n * @property {number} x\n * @property {number} y\n */\n\n/**\n * @typedef {HTMLElement} ZoomDialogElement\n * @property {Function} close - Method to close the zoom dialog\n */\n"],
  "mappings": "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",
  "names": []
}
