{
  "version": 3,
  "sources": ["/cdn/shop/t/1/assets/header-drawer.js"],
  "sourcesContent": ["import { Component } from '@theme/component';\nimport { trapFocus, removeTrapFocus } from '@theme/focus';\nimport { onAnimationEnd } from '@theme/utilities';\n\n/**\n * A custom element that manages the main menu drawer.\n *\n * @typedef {object} Refs\n * @property {HTMLDetailsElement} details - The details element.\n *\n * @extends {Component<Refs>}\n */\nclass HeaderDrawer extends Component {\n  requiredRefs = ['details'];\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    this.addEventListener('keyup', this.#onKeyUp);\n    this.#setupAnimatedElementListeners();\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this.removeEventListener('keyup', this.#onKeyUp);\n  }\n\n  /**\n   * Close the main menu drawer when the Escape key is pressed\n   * @param {KeyboardEvent} event\n   */\n  #onKeyUp = (event) => {\n    if (event.key !== 'Escape') return;\n\n    this.#close(this.#getDetailsElement(event));\n  };\n\n  /**\n   * @returns {boolean} Whether the main menu drawer is open\n   */\n  get isOpen() {\n    return this.refs.details.hasAttribute('open');\n  }\n\n  /**\n   * Get the closest details element to the event target\n   * @param {Event | undefined} event\n   * @returns {HTMLDetailsElement}\n   */\n  #getDetailsElement(event) {\n    if (!(event?.target instanceof Element)) return this.refs.details;\n\n    return event.target.closest('details') ?? this.refs.details;\n  }\n\n  /**\n   * Toggle the main menu drawer\n   */\n  toggle() {\n    return this.isOpen ? this.close() : this.open();\n  }\n\n  /**\n   * Open the closest drawer or the main menu drawer\n   * @param {Event} [event]\n   */\n  open(event) {\n    const details = this.#getDetailsElement(event);\n    const summary = details.querySelector('summary');\n\n    if (!summary) return;\n\n    summary.setAttribute('aria-expanded', 'true');\n\n    this.preventInitialAccordionAnimations(details);\n    requestAnimationFrame(() => {\n      details.classList.add('menu-open');\n      setTimeout(() => {\n        trapFocus(details);\n      }, 0);\n    });\n  }\n\n  /**\n   * Go back or close the main menu drawer\n   * @param {Event} [event]\n   */\n  back(event) {\n    this.#close(this.#getDetailsElement(event));\n  }\n\n  /**\n   * Close the main menu drawer\n   */\n  close() {\n    this.#close(this.refs.details);\n  }\n\n  /**\n   * Close the closest menu or submenu that is open\n   *\n   * @param {HTMLDetailsElement} details\n   */\n  #close(details) {\n    const summary = details.querySelector('summary');\n\n    if (!summary) return;\n\n    summary.setAttribute('aria-expanded', 'false');\n    details.classList.remove('menu-open');\n\n    onAnimationEnd(details, () => {\n      reset(details);\n      if (details === this.refs.details) {\n        removeTrapFocus();\n        const openDetails = this.querySelectorAll('details[open]:not(accordion-custom > details)');\n        openDetails.forEach(reset);\n      } else {\n        setTimeout(() => {\n          trapFocus(this.refs.details);\n        }, 0);\n      }\n    });\n  }\n\n  /**\n   * Attach animationend event listeners to all animated elements to remove will-change after animation\n   * to remove the stacking context and allow submenus to be positioned correctly\n   */\n  #setupAnimatedElementListeners() {\n    /**\n     * @param {AnimationEvent} event\n     */\n    function removeWillChangeOnAnimationEnd(event) {\n      const target = event.target;\n      if (target && target instanceof HTMLElement) {\n        target.style.setProperty('will-change', 'unset');\n        target.removeEventListener('animationend', removeWillChangeOnAnimationEnd);\n      }\n    }\n    const allAnimated = this.querySelectorAll('.menu-drawer__animated-element');\n    allAnimated.forEach((element) => {\n      element.addEventListener('animationend', removeWillChangeOnAnimationEnd);\n    });\n  }\n\n  /**\n   * Temporarily disables accordion animations to prevent unwanted transitions when the drawer opens.\n   * Adds a no-animation class to accordion content elements, then removes it after 100ms to\n   * re-enable animations for user interactions.\n   * @param {HTMLDetailsElement} details - The details element containing the accordions\n   */\n  preventInitialAccordionAnimations(details) {\n    const content = details.querySelectorAll('accordion-custom .details-content');\n\n    content.forEach((element) => {\n      if (element instanceof HTMLElement) {\n        element.classList.add('details-content--no-animation');\n      }\n    });\n    setTimeout(() => {\n      content.forEach((element) => {\n        if (element instanceof HTMLElement) {\n          element.classList.remove('details-content--no-animation');\n        }\n      });\n    }, 100);\n  }\n}\n\nif (!customElements.get('header-drawer')) {\n  customElements.define('header-drawer', HeaderDrawer);\n}\n\n/**\n * Reset an open details element to its original state\n *\n * @param {HTMLDetailsElement} element\n */\nfunction reset(element) {\n  element.classList.remove('menu-open');\n  element.removeAttribute('open');\n  element.querySelector('summary')?.setAttribute('aria-expanded', 'false');\n}\n"],
  "mappings": "AAAA,OAAS,cAAiB,mBAC1B,OAAS,UAAW,oBAAuB,eAC3C,OAAS,mBAAsB,mBAU/B,MAAM,qBAAqB,SAAU,CACnC,aAAe,CAAC,SAAS,EAEzB,mBAAoB,CAClB,MAAM,kBAAkB,EAExB,KAAK,iBAAiB,QAAS,KAAK,QAAQ,EAC5C,KAAK,+BAA+B,CACtC,CAEA,sBAAuB,CACrB,MAAM,qBAAqB,EAC3B,KAAK,oBAAoB,QAAS,KAAK,QAAQ,CACjD,CAMA,SAAY,OAAU,CAChB,MAAM,MAAQ,UAElB,KAAK,OAAO,KAAK,mBAAmB,KAAK,CAAC,CAC5C,EAKA,IAAI,QAAS,CACX,OAAO,KAAK,KAAK,QAAQ,aAAa,MAAM,CAC9C,CAOA,mBAAmB,MAAO,CACxB,OAAM,OAAO,kBAAkB,QAExB,MAAM,OAAO,QAAQ,SAAS,GAAK,KAAK,KAAK,QAFJ,KAAK,KAAK,OAG5D,CAKA,QAAS,CACP,OAAO,KAAK,OAAS,KAAK,MAAM,EAAI,KAAK,KAAK,CAChD,CAMA,KAAK,MAAO,CACV,MAAM,QAAU,KAAK,mBAAmB,KAAK,EACvC,QAAU,QAAQ,cAAc,SAAS,EAE1C,UAEL,QAAQ,aAAa,gBAAiB,MAAM,EAE5C,KAAK,kCAAkC,OAAO,EAC9C,sBAAsB,IAAM,CAC1B,QAAQ,UAAU,IAAI,WAAW,EACjC,WAAW,IAAM,CACf,UAAU,OAAO,CACnB,EAAG,CAAC,CACN,CAAC,EACH,CAMA,KAAK,MAAO,CACV,KAAK,OAAO,KAAK,mBAAmB,KAAK,CAAC,CAC5C,CAKA,OAAQ,CACN,KAAK,OAAO,KAAK,KAAK,OAAO,CAC/B,CAOA,OAAO,QAAS,CACd,MAAM,QAAU,QAAQ,cAAc,SAAS,EAE1C,UAEL,QAAQ,aAAa,gBAAiB,OAAO,EAC7C,QAAQ,UAAU,OAAO,WAAW,EAEpC,eAAe,QAAS,IAAM,CAC5B,MAAM,OAAO,EACT,UAAY,KAAK,KAAK,SACxB,gBAAgB,EACI,KAAK,iBAAiB,+CAA+C,EAC7E,QAAQ,KAAK,GAEzB,WAAW,IAAM,CACf,UAAU,KAAK,KAAK,OAAO,CAC7B,EAAG,CAAC,CAER,CAAC,EACH,CAMA,gCAAiC,CAI/B,SAAS,+BAA+B,MAAO,CAC7C,MAAM,OAAS,MAAM,OACjB,QAAU,kBAAkB,cAC9B,OAAO,MAAM,YAAY,cAAe,OAAO,EAC/C,OAAO,oBAAoB,eAAgB,8BAA8B,EAE7E,CACoB,KAAK,iBAAiB,gCAAgC,EAC9D,QAAS,SAAY,CAC/B,QAAQ,iBAAiB,eAAgB,8BAA8B,CACzE,CAAC,CACH,CAQA,kCAAkC,QAAS,CACzC,MAAM,QAAU,QAAQ,iBAAiB,mCAAmC,EAE5E,QAAQ,QAAS,SAAY,CACvB,mBAAmB,aACrB,QAAQ,UAAU,IAAI,+BAA+B,CAEzD,CAAC,EACD,WAAW,IAAM,CACf,QAAQ,QAAS,SAAY,CACvB,mBAAmB,aACrB,QAAQ,UAAU,OAAO,+BAA+B,CAE5D,CAAC,CACH,EAAG,GAAG,CACR,CACF,CAEK,eAAe,IAAI,eAAe,GACrC,eAAe,OAAO,gBAAiB,YAAY,EAQrD,SAAS,MAAM,QAAS,CACtB,QAAQ,UAAU,OAAO,WAAW,EACpC,QAAQ,gBAAgB,MAAM,EAC9B,QAAQ,cAAc,SAAS,GAAG,aAAa,gBAAiB,OAAO,CACzE",
  "names": []
}
