{
  "version": 3,
  "sources": ["/cdn/shop/t/6/assets/anchored-popover.js?v=41103074827070742301790720035"],
  "sourcesContent": ["import { Component } from '@theme/component';\nimport { debounce, requestIdleCallback } from '@theme/utilities';\n\n/**\n * A custom element that manages the popover + popover trigger relationship for anchoring.\n * Calculates the trigger position and inlines custom properties on the popover element\n * that can be consumed by CSS for positioning.\n *\n * @typedef {object} Refs\n * @property {HTMLElement} popover - The popover element.\n * @property {HTMLElement} trigger - The popover trigger element.\n * @property {HTMLElement} [verticalPositionAnchor] - Optional anchor for vertical fallback positioning.\n *\n * @extends Component<Refs>\n *\n * @example\n * ```html\n * <anchored-popover-component data-close-on-resize>\n *   <button data-ref=\"trigger\" popovertarget=\"menu\">Open Menu</button>\n *   <div data-ref=\"popover\" id=\"menu\" popover>Menu content</div>\n * </anchored-popover-component>\n * ```\n *\n * @property {string[]} requiredRefs - Required refs: 'popover' and 'trigger'\n * @property {number} [interaction_delay] - The delay in milliseconds for the hover interaction\n * @property {string} [data-close-on-resize] - When present, closes popover on window resize\n * @property {string} [data-hover-triggered] - When present, makes the popover function via pointerenter/leave\n * @property {number | null} [popoverTrigger] - The timeout for the popover trigger\n * @property {string} [data-vertical-position-anchor] - Optional external anchor name for vertical fallback positioning\n */\nexport class AnchoredPopoverComponent extends Component {\n  requiredRefs = ['popover', 'trigger'];\n  interaction_delay = 200;\n  #popoverTrigger = /** @type {number | null} */ (null);\n\n  #onTriggerEnter = () => {\n    const { trigger, popover } = this.refs;\n    trigger.dataset.hoverActive = 'true';\n    if (!popover.matches(':popover-open')) {\n      this.#popoverTrigger = setTimeout(() => {\n        if (trigger.matches('[data-hover-active]')) popover.showPopover();\n      }, this.interaction_delay);\n    }\n  };\n\n  #onTriggerLeave = () => {\n    const { trigger, popover } = this.refs;\n    delete trigger.dataset.hoverActive;\n    if (this.#popoverTrigger) clearTimeout(this.#popoverTrigger);\n    if (popover.matches(':popover-open')) {\n      this.#popoverTrigger = setTimeout(() => {\n        popover.hidePopover();\n      }, this.interaction_delay);\n    }\n  };\n\n  #onPopoverEnter = () => {\n    if (this.#popoverTrigger) clearTimeout(this.#popoverTrigger);\n  };\n\n  #onPopoverLeave = () => {\n    const { popover } = this.refs;\n    this.#popoverTrigger = setTimeout(() => {\n      popover.hidePopover();\n    }, this.interaction_delay);\n  };\n\n  /**\n   * Updates the popover position by calculating trigger element bounds\n   * and setting CSS custom properties on the popover element.\n   */\n  #updatePosition = async () => {\n    const { popover, trigger } = this.refs;\n    if (!popover || !trigger) return;\n\n    const triggerPositions = trigger.getBoundingClientRect();\n    const verticalPositionAnchor = this.#getVerticalPositionAnchor();\n    const verticalPositions = (verticalPositionAnchor ?? trigger).getBoundingClientRect();\n\n    // Distances from each viewport edge; the inline-start value resolves from the\n    // popover's direction so consumers can position with inset-inline-start in both\n    // LTR and RTL.\n    const fromLeft = triggerPositions.left;\n    const fromRight = window.innerWidth - triggerPositions.right;\n    const isRTL = getComputedStyle(popover).direction === 'rtl';\n\n    popover.style.setProperty('--anchor-top', `${verticalPositions.top}`);\n    popover.style.setProperty('--anchor-right', `${fromRight}`);\n    popover.style.setProperty('--anchor-bottom', `${window.innerHeight - verticalPositions.bottom}`);\n    popover.style.setProperty('--anchor-left', `${fromLeft}`);\n    popover.style.setProperty('--anchor-inline-start', `${isRTL ? fromRight : fromLeft}`);\n    popover.style.setProperty('--anchor-height', `${verticalPositions.height}`);\n    popover.style.setProperty('--anchor-width', `${triggerPositions.width}`);\n  };\n\n  /**\n   * Finds the vertical fallback anchor. Internal refs are kept for existing callers;\n   * data-vertical-position-anchor supports sibling/external anchors outside Component refs.\n   *\n   * @returns {HTMLElement | null}\n   */\n  #getVerticalPositionAnchor() {\n    const internalAnchor = this.refs.verticalPositionAnchor;\n    if (internalAnchor instanceof HTMLElement) return internalAnchor;\n\n    const anchorName = this.dataset.verticalPositionAnchor?.trim();\n    if (!anchorName) return null;\n\n    const selector = `[data-anchor-name=\"${CSS.escape(anchorName)}\"]`;\n    const scopedAnchor = this.#queryVerticalPositionAnchor(selector);\n    if (this.#isUsableExternalVerticalPositionAnchor(scopedAnchor)) return scopedAnchor;\n\n    const root = this.getRootNode();\n    const anchor = root instanceof Document || root instanceof ShadowRoot ? root.querySelector(selector) : null;\n\n    return this.#isUsableExternalVerticalPositionAnchor(anchor) ? anchor : null;\n  }\n\n  /**\n   * @param {string} selector - Escaped selector for the external anchor.\n   * @returns {HTMLElement | null}\n   */\n  #queryVerticalPositionAnchor(selector) {\n    const scope = this.closest('[data-anchor-scope], tr, li, section, article, form');\n    if (!(scope instanceof HTMLElement)) return null;\n\n    const anchor = scope.querySelector(selector);\n\n    return anchor instanceof HTMLElement ? anchor : null;\n  }\n\n  /**\n   * @param {Element | null} anchor - External anchor candidate.\n   * @returns {anchor is HTMLElement}\n   */\n  #isUsableExternalVerticalPositionAnchor(anchor) {\n    if (!(anchor instanceof HTMLElement)) return false;\n\n    const rect = anchor.getBoundingClientRect();\n\n    return rect.width > 0 && rect.height > 0;\n  }\n\n  /**\n   * Debounced resize handler that optionally closes the popover\n   * when the window is resized, based on the data-close-on-resize attribute.\n   */\n  #resizeListener = debounce(() => {\n    const popover = /** @type {HTMLElement} */ (this.refs.popover);\n    if (popover && popover.matches(':popover-open')) {\n      popover.hidePopover();\n    }\n  }, 100);\n\n  /**\n   * Opens a dialog from a disclosure trigger without toggling the hover popover preview.\n   *\n   * @param {string} dialogId - The ID of the dialog component to open.\n   * @param {Event} event - The click or activation event.\n   */\n  openDialog(dialogId, event) {\n    event.preventDefault();\n\n    const { popover, trigger } = this.refs;\n    const triggerAriaControls = trigger.getAttribute('aria-controls');\n\n    if (this.#popoverTrigger !== null) {\n      clearTimeout(this.#popoverTrigger);\n      this.#popoverTrigger = null;\n    }\n\n    delete trigger.dataset.hoverActive;\n\n    if (popover.matches(':popover-open')) {\n      popover.hidePopover();\n    }\n\n    const dialog = /** @type {(HTMLElement & { showDialog?: () => void }) | null} */ (\n      document.getElementById(dialogId)\n    );\n\n    if (typeof dialog?.showDialog !== 'function') return;\n\n    dialog.addEventListener(\n      'dialog:close',\n      () => {\n        const focusTarget = trigger.isConnected ? trigger : getTriggerByAriaControls(triggerAriaControls);\n        focusTarget?.focus();\n      },\n      { once: true }\n    );\n\n    dialog.showDialog();\n  }\n\n  /**\n   * Component initialization - sets up event listeners for resize and popover toggle events.\n   */\n  connectedCallback() {\n    super.connectedCallback();\n    const { popover, trigger } = this.refs;\n    if (this.dataset.closeOnResize) {\n      popover.addEventListener('beforetoggle', (event) => {\n        const evt = /** @type {ToggleEvent} */ (event);\n        window[evt.newState === 'open' ? 'addEventListener' : 'removeEventListener']('resize', this.#resizeListener);\n      });\n    }\n    if (this.dataset.hoverTriggered) {\n      trigger.addEventListener('pointerenter', this.#onTriggerEnter);\n      trigger.addEventListener('pointerleave', this.#onTriggerLeave);\n      popover.addEventListener('pointerenter', this.#onPopoverEnter);\n      popover.addEventListener('pointerleave', this.#onPopoverLeave);\n    }\n    if (!CSS.supports('position-anchor: --trigger')) {\n      popover.addEventListener('beforetoggle', () => {\n        this.#updatePosition();\n      });\n      requestIdleCallback(() => {\n        this.#updatePosition();\n      });\n    }\n  }\n\n  /**\n   * Component cleanup - removes resize event listener.\n   */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    window.removeEventListener('resize', this.#resizeListener);\n  }\n}\n\nasync function registerAnchoredPopover() {\n  await Theme.popoverPolyfillReady;\n\n  if (!customElements.get('anchored-popover-component')) {\n    customElements.define('anchored-popover-component', AnchoredPopoverComponent);\n  }\n}\n\nregisterAnchoredPopover();\n\n/**\n * Finds a live disclosure trigger matching a prior aria-controls value.\n *\n * @param {string | null} ariaControls - The aria-controls value to match.\n * @returns {HTMLElement | null}\n */\nfunction getTriggerByAriaControls(ariaControls) {\n  if (!ariaControls) return null;\n\n  const trigger = document.querySelector(`[aria-controls=\"${CSS.escape(ariaControls)}\"]`);\n\n  return trigger instanceof HTMLElement && trigger.isConnected ? trigger : null;\n}\n"],
  "mappings": "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",
  "names": []
}
