{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/offsure-mega-menu.js?revision=20260918b"],
  "sourcesContent": ["/**\n * offsure-mega-menu\n *\n * Desktop hover/focus mega panel for \"The pieces\". Opens on hover or focus,\n * stays open while focus is inside, closes on mouseleave, blur-outside, or\n * Escape (returning focus to the trigger). Arrow keys move between menu\n * items. Mobile keeps the existing drawer \u2014 this element no-ops under 990px\n * via CSS (display:none), so no JS guard is needed for touch.\n */\nclass OffsureMegaMenu extends HTMLElement {\n  /** @type {HTMLButtonElement | null} */\n  #trigger = null;\n  /** @type {HTMLElement | null} */\n  #panel = null;\n  /** @type {HTMLAnchorElement[]} */\n  #items = [];\n  /** @type {number | null} */\n  #closeTimer = null;\n  /** @type {number | null} */\n  #openTimer = null;\n\n  connectedCallback() {\n    this.#trigger = this.querySelector('.omm__trigger');\n    this.#panel = this.querySelector('.omm__panel');\n    this.#items = Array.from(this.querySelectorAll('[role=\"menuitem\"]'));\n\n    if (!this.#trigger || !this.#panel) return;\n\n    this.addEventListener('mouseenter', this.#scheduleOpen);\n    this.addEventListener('mouseleave', this.#scheduleClose);\n    this.#trigger.addEventListener('click', this.#onTriggerClick);\n    this.addEventListener('focusout', this.#onFocusOut);\n    this.addEventListener('keydown', this.#onKeydown);\n    // Hover-opened state has no focus inside the panel, so a document-level\n    // Escape listener is needed too (a keydown target outside this element\n    // never reaches the listener above via bubbling).\n    document.addEventListener('keydown', this.#onDocumentKeydown);\n    window.addEventListener('resize', this.#clampToViewport);\n  }\n\n  disconnectedCallback() {\n    this.removeEventListener('mouseenter', this.#scheduleOpen);\n    this.removeEventListener('mouseleave', this.#scheduleClose);\n    this.#trigger?.removeEventListener('click', this.#onTriggerClick);\n    this.removeEventListener('focusout', this.#onFocusOut);\n    this.removeEventListener('keydown', this.#onKeydown);\n    document.removeEventListener('keydown', this.#onDocumentKeydown);\n    window.removeEventListener('resize', this.#clampToViewport);\n    if (this.#closeTimer) window.clearTimeout(this.#closeTimer);\n    if (this.#openTimer) window.clearTimeout(this.#openTimer);\n  }\n\n  /** @param {KeyboardEvent} event */\n  #onDocumentKeydown = (event) => {\n    if (event.key !== 'Escape') return;\n    if (this.getAttribute('data-open') !== 'true') return;\n    this.#close();\n    this.#trigger?.focus();\n  };\n\n  /** @param {MouseEvent} event */\n  #onTriggerClick = (event) => {\n    event.preventDefault();\n    if (this.getAttribute('data-open') === 'true') this.#close();\n    else this.#open();\n  };\n\n  #open = () => {\n    if (this.#closeTimer) {\n      window.clearTimeout(this.#closeTimer);\n      this.#closeTimer = null;\n    }\n    if (this.#openTimer) {\n      window.clearTimeout(this.#openTimer);\n      this.#openTimer = null;\n    }\n    this.setAttribute('data-open', 'true');\n    this.#trigger?.setAttribute('aria-expanded', 'true');\n    this.#items.forEach((item) => item.setAttribute('tabindex', '0'));\n    // The panel is CSS-centred under the trigger (left:50%, translateX(-50%)).\n    // With the nav now centred on the page, the mega's first trigger sits\n    // left-of-centre, so a purely centred panel can still clip the left or\n    // right viewport edge at ~1000-1300px. Clamp with a --omm-offset shift.\n    window.requestAnimationFrame(this.#clampToViewport);\n  };\n\n  #clampToViewport = () => {\n    if (!this.#panel || this.getAttribute('data-open') !== 'true') return;\n    // Use layout dimensions, not a rectangle partway through the open transition.\n    const margin = 16;\n    const anchor = this.getBoundingClientRect();\n    const width = this.#panel.offsetWidth;\n    const desiredLeft = anchor.left + anchor.width / 2 - width / 2;\n    const left = Math.max(margin, Math.min(desiredLeft, window.innerWidth - margin - width));\n    this.#panel.style.setProperty('--omm-offset', `${left - desiredLeft}px`);\n  };\n\n  #scheduleOpen = () => {\n    if (this.#closeTimer) {\n      window.clearTimeout(this.#closeTimer);\n      this.#closeTimer = null;\n    }\n    if (this.#openTimer) window.clearTimeout(this.#openTimer);\n    this.#openTimer = window.setTimeout(() => this.#open(), 120);\n  };\n\n  #scheduleClose = () => {\n    if (this.#openTimer) {\n      window.clearTimeout(this.#openTimer);\n      this.#openTimer = null;\n    }\n    if (this.#closeTimer) window.clearTimeout(this.#closeTimer);\n    this.#closeTimer = window.setTimeout(() => this.#close(), 120);\n  };\n\n  #close = () => {\n    if (this.#openTimer) { window.clearTimeout(this.#openTimer); this.#openTimer = null; }\n    if (this.#closeTimer) { window.clearTimeout(this.#closeTimer); this.#closeTimer = null; }\n    this.removeAttribute('data-open');\n    this.#trigger?.setAttribute('aria-expanded', 'false');\n    this.#items.forEach((item) => item.setAttribute('tabindex', '-1'));\n  };\n\n  /** @param {FocusEvent} event */\n  #onFocusOut = (event) => {\n    const next = /** @type {Node | null} */ (event.relatedTarget);\n    if (next && this.contains(next)) return;\n    this.#close();\n  };\n\n  /** @param {KeyboardEvent} event */\n  #onKeydown = (event) => {\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      this.#close();\n      this.#trigger?.focus();\n      return;\n    }\n\n    if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n    if (this.getAttribute('data-open') !== 'true') {\n      if (document.activeElement === this.#trigger) {\n        event.preventDefault();\n        this.#open();\n        const target = event.key === 'ArrowUp' ? this.#items.at(-1) : this.#items[0];\n        target?.focus();\n      }\n      return;\n    }\n\n    const active = document.activeElement;\n    const focusable = [this.#trigger, ...this.#items].filter(Boolean);\n    const currentIndex = focusable.indexOf(/** @type {any} */ (active));\n    if (currentIndex === -1) return;\n\n    event.preventDefault();\n    const delta = event.key === 'ArrowDown' ? 1 : -1;\n    const nextIndex = (currentIndex + delta + focusable.length) % focusable.length;\n    /** @type {HTMLElement | null} */ (focusable[nextIndex])?.focus();\n  };\n}\n\nif (!customElements.get('offsure-mega-menu')) {\n  customElements.define('offsure-mega-menu', OffsureMegaMenu);\n}\n"],
  "mappings": "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",
  "names": []
}
