{"version":3,"file":"offcanvas.cjs","sources":["../../src/components/offcanvas.ts"],"sourcesContent":["/* Native JavaScript for Bootstrap 5 | OffCanvas\n------------------------------------------------ */\nimport {\n  addClass,\n  ariaHidden,\n  ariaModal,\n  closest,\n  createCustomEvent,\n  dispatchEvent,\n  emulateTransitionEnd,\n  focus,\n  getDocument,\n  getDocumentBody,\n  getDocumentElement,\n  getElementTransitionDuration,\n  getInstance,\n  hasClass,\n  keydownEvent,\n  keyEscape,\n  mouseclickEvent,\n  MouseEvent,\n  querySelector,\n  querySelectorAll,\n  removeAttribute,\n  removeClass,\n  setAttribute,\n  setElementStyle,\n  toggleFocusTrap,\n} from \"@thednp/shorty\";\n\nimport { addListener, removeListener } from \"@thednp/event-listener\";\n\nimport dataBsDismiss from \"~/strings/dataBsDismiss\";\nimport dataBsToggle from \"~/strings/dataBsToggle\";\nimport showClass from \"~/strings/showClass\";\nimport offcanvasString from \"~/strings/offcanvasString\";\nimport offcanvasComponent from \"~/strings/offcanvasComponent\";\nimport modalComponent from \"~/strings/modalComponent\";\n\nimport getTargetElement from \"~/util/getTargetElement\";\nimport isVisible from \"~/util/isVisible\";\nimport { setScrollbar } from \"~/util/scrollbar\";\nimport { hasPopup } from \"~/util/popupContainer\";\nimport {\n  appendOverlay,\n  getCurrentOpen,\n  hideOverlay,\n  offcanvasActiveSelector,\n  overlay,\n  removeOverlay,\n  showOverlay,\n  toggleOverlayType,\n} from \"~/util/backdrop\";\nimport isDisabled from \"~/util/isDisabled\";\nimport BaseComponent from \"./base-component\";\nimport { OffcanvasEvent, OffcanvasOptions } from \"~/interface/offcanvas\";\n\n// OFFCANVAS PRIVATE GC\n// ====================\nconst offcanvasSelector = `.${offcanvasString}`;\nconst offcanvasToggleSelector = `[${dataBsToggle}=\"${offcanvasString}\"]`;\nconst offcanvasDismissSelector = `[${dataBsDismiss}=\"${offcanvasString}\"]`;\nconst offcanvasTogglingClass = `${offcanvasString}-toggling`;\n\nconst offcanvasDefaults = {\n  backdrop: true, // boolean\n  keyboard: true, // boolean\n  scroll: false, // boolean\n};\n\ntype OffCanvasEventProps = {\n  relatedTarget: Element & EventTarget | undefined;\n};\n\n/**\n * Static method which returns an existing `Offcanvas` instance associated\n * to a target `Element`.\n */\nconst getOffcanvasInstance = (element: Element) =>\n  getInstance<Offcanvas>(element, offcanvasComponent);\n\n/**\n * An `Offcanvas` initialization callback.\n */\nconst offcanvasInitCallback = (element: Element) => new Offcanvas(element);\n\n// OFFCANVAS CUSTOM EVENTS\n// =======================\nconst showOffcanvasEvent = createCustomEvent<\n  OffCanvasEventProps,\n  OffcanvasEvent\n>(`show.bs.${offcanvasString}`);\nconst shownOffcanvasEvent = createCustomEvent<\n  OffCanvasEventProps,\n  OffcanvasEvent\n>(`shown.bs.${offcanvasString}`);\nconst hideOffcanvasEvent = createCustomEvent<\n  OffCanvasEventProps,\n  OffcanvasEvent\n>(`hide.bs.${offcanvasString}`);\nconst hiddenOffcanvasEvent = createCustomEvent<\n  OffCanvasEventProps,\n  OffcanvasEvent\n>(`hidden.bs.${offcanvasString}`);\n\n// OFFCANVAS PRIVATE METHODS\n// =========================\n/**\n * Sets additional style for the `<body>` and other elements\n * when showing an offcanvas to the user.\n *\n * @param self the `Offcanvas` instance\n */\nconst setOffCanvasScrollbar = (self: Offcanvas) => {\n  const { element } = self;\n  const { clientHeight, scrollHeight } = getDocumentElement(element);\n  setScrollbar(element, clientHeight !== scrollHeight);\n};\n\n/**\n * Toggles on/off the listeners of the events that close the offcanvas.\n *\n * @param self the `Offcanvas` instance\n * @param add when *true* listeners are added\n */\nconst toggleOffCanvasDismiss = (self: Offcanvas, add?: boolean) => {\n  const action = add ? addListener : removeListener;\n  const doc = getDocument(self.element);\n  action(doc, keydownEvent, offcanvasKeyDismissHandler);\n  action(doc, mouseclickEvent, offcanvasDismissHandler);\n};\n\n/**\n * Executes before showing the offcanvas.\n *\n * @param self the `Offcanvas` instance\n */\nconst beforeOffcanvasShow = (self: Offcanvas) => {\n  const { element, options } = self;\n\n  // istanbul ignore else @preserve\n  if (!options.scroll) {\n    setOffCanvasScrollbar(self);\n    setElementStyle(getDocumentBody(element), { overflow: \"hidden\" });\n  }\n\n  addClass(element, offcanvasTogglingClass);\n  addClass(element, showClass);\n  setElementStyle(element, { visibility: \"visible\" });\n\n  emulateTransitionEnd(element, () => showOffcanvasComplete(self));\n};\n\n/**\n * Executes before hiding the offcanvas.\n *\n * @param self the `Offcanvas` instance\n */\nconst beforeOffcanvasHide = (self: Offcanvas) => {\n  const { element, options } = self;\n  const currentOpen = getCurrentOpen(element);\n\n  (element as HTMLElement).blur();\n\n  if (!currentOpen && options.backdrop && hasClass(overlay, showClass)) {\n    hideOverlay();\n  }\n  emulateTransitionEnd(element, () => hideOffcanvasComplete(self));\n};\n\n// OFFCANVAS EVENT HANDLERS\n// ========================\n/**\n * Handles the `click` event listeners.\n *\n * @param e the `Event` object\n */\nfunction offcanvasTriggerHandler(\n  this: HTMLElement,\n  e: MouseEvent<HTMLElement>,\n) {\n  const element = getTargetElement(this);\n  const self = element && getOffcanvasInstance(element);\n\n  // istanbul ignore if @preserve\n  if (isDisabled(this)) return;\n\n  // istanbul ignore if @preserve\n  if (!self) return;\n\n  self.relatedTarget = this;\n  self.toggle();\n\n  // istanbul ignore else @preserve\n  if (this.tagName === \"A\") e.preventDefault();\n}\n\n/**\n * Handles the event listeners that close the offcanvas.\n *\n * @param e the `Event` object\n */\nconst offcanvasDismissHandler = (e: MouseEvent<HTMLElement>) => {\n  const { target } = e;\n  const element = querySelector(\n    offcanvasActiveSelector,\n    getDocument(target),\n  );\n  // istanbul ignore else @preserve\n  if (!element) return;\n\n  const offCanvasDismiss = querySelector<HTMLElement>(\n    offcanvasDismissSelector,\n    element,\n  );\n  const self = getOffcanvasInstance(element);\n\n  // istanbul ignore if @preserve\n  if (!self) return;\n\n  const { options, triggers } = self;\n  const { backdrop } = options;\n  const trigger = closest(target, offcanvasToggleSelector);\n  const selection = getDocument(element).getSelection();\n\n  // istanbul ignore if: a filter is required here @preserve\n  if (overlay.contains(target) && backdrop === \"static\") return;\n\n  // istanbul ignore else @preserve\n  if (\n    !(selection && selection.toString().length) &&\n    ((!element.contains(target) &&\n      backdrop &&\n      // istanbul ignore next @preserve\n      (!trigger || triggers.includes(target))) ||\n      (offCanvasDismiss &&\n        offCanvasDismiss.contains(target)))\n  ) {\n    self.relatedTarget = offCanvasDismiss && offCanvasDismiss.contains(target)\n      ? offCanvasDismiss\n      : undefined;\n    self.hide();\n  }\n\n  // istanbul ignore next @preserve\n  if (trigger && trigger.tagName === \"A\") e.preventDefault();\n};\n\n/**\n * Handles the `keydown` event listener for offcanvas\n * to hide it when user type the `ESC` key.\n *\n * @param e the `Event` object\n */\nconst offcanvasKeyDismissHandler = ({ code, target }: KeyboardEvent) => {\n  const element = querySelector(\n    offcanvasActiveSelector,\n    getDocument(target as Node),\n  );\n  const self = element && getOffcanvasInstance(element);\n\n  // istanbul ignore if @preserve\n  if (!self) return;\n\n  // istanbul ignore else @preserve\n  if (self.options.keyboard && code === keyEscape) {\n    self.relatedTarget = undefined;\n    self.hide();\n  }\n};\n\n/**\n * Handles the `transitionend` when showing the offcanvas.\n *\n * @param self the `Offcanvas` instance\n */\nconst showOffcanvasComplete = (self: Offcanvas) => {\n  const { element } = self;\n  removeClass(element, offcanvasTogglingClass);\n\n  removeAttribute(element, ariaHidden);\n  setAttribute(element, ariaModal, \"true\");\n  setAttribute(element, \"role\", \"dialog\");\n\n  dispatchEvent(element, shownOffcanvasEvent);\n\n  toggleOffCanvasDismiss(self, true);\n  focus(element);\n  toggleFocusTrap(element);\n};\n\n/**\n * Handles the `transitionend` when hiding the offcanvas.\n *\n * @param self the `Offcanvas` instance\n */\nconst hideOffcanvasComplete = (self: Offcanvas) => {\n  const { element, triggers } = self;\n\n  setAttribute(element, ariaHidden, \"true\");\n  removeAttribute(element, ariaModal);\n  removeAttribute(element, \"role\");\n  setElementStyle(element, { visibility: \"\" });\n\n  const visibleTrigger = showOffcanvasEvent.relatedTarget ||\n    triggers.find(isVisible);\n  // istanbul ignore else @preserve\n  if (visibleTrigger) focus(visibleTrigger);\n\n  removeOverlay(element);\n\n  dispatchEvent(element, hiddenOffcanvasEvent);\n  removeClass(element, offcanvasTogglingClass);\n  toggleFocusTrap(element);\n\n  // must check for open instances\n  if (!getCurrentOpen(element)) {\n    toggleOffCanvasDismiss(self);\n  }\n};\n\n// OFFCANVAS DEFINITION\n// ====================\n/** Returns a new `Offcanvas` instance. */\nexport default class Offcanvas extends BaseComponent {\n  static selector = offcanvasSelector;\n  static init = offcanvasInitCallback;\n  static getInstance = getOffcanvasInstance;\n  declare element: HTMLElement;\n  declare options: OffcanvasOptions;\n  declare triggers: HTMLElement[];\n  declare relatedTarget: EventTarget & HTMLElement | undefined;\n\n  /**\n   * @param target usually an `.offcanvas` element\n   * @param config instance options\n   */\n  constructor(\n    target: Element | string,\n    config?: Partial<OffcanvasOptions>,\n  ) {\n    super(target, config);\n\n    // instance element\n    const { element } = this;\n\n    // all the triggering buttons\n    this.triggers = [\n      ...querySelectorAll<HTMLElement>(\n        offcanvasToggleSelector,\n        getDocument(element),\n      ),\n    ].filter(\n      (btn) => getTargetElement(btn) === element,\n    );\n\n    // additional instance property\n    this.relatedTarget = undefined;\n\n    // attach event listeners\n    this._toggleEventListeners(true);\n  }\n\n  /**\n   * Returns component name string.\n   */\n  get name() {\n    return offcanvasComponent;\n  }\n  /**\n   * Returns component default options.\n   */\n  get defaults() {\n    return offcanvasDefaults;\n  }\n\n  // OFFCANVAS PUBLIC METHODS\n  // ========================\n  /** Shows or hides the offcanvas from the user. */\n  toggle() {\n    if (hasClass(this.element, showClass)) this.hide();\n    else this.show();\n  }\n\n  /** Shows the offcanvas to the user. */\n  show() {\n    const { element, options, relatedTarget } = this;\n    let overlayDelay = 0;\n\n    // istanbul ignore else @preserve\n    if (hasClass(element, showClass)) return;\n\n    showOffcanvasEvent.relatedTarget = relatedTarget || undefined;\n    shownOffcanvasEvent.relatedTarget = relatedTarget || undefined;\n    dispatchEvent(element, showOffcanvasEvent);\n\n    // istanbul ignore else @preserve\n    if (showOffcanvasEvent.defaultPrevented) return;\n\n    // we elegantly hide any opened modal/offcanvas\n    const currentOpen = getCurrentOpen(element);\n    if (currentOpen && currentOpen !== element) {\n      const that = getOffcanvasInstance(currentOpen) ||\n        // istanbul ignore next @preserve\n        getInstance<typeof BaseComponent & { hide: () => void }>(\n          currentOpen,\n          modalComponent,\n        );\n\n      // istanbul ignore else @preserve\n      if (that) that.hide();\n    }\n\n    if (options.backdrop) {\n      if (!hasPopup(overlay)) appendOverlay(element, true);\n      else toggleOverlayType();\n\n      overlayDelay = getElementTransitionDuration(overlay);\n      showOverlay();\n\n      setTimeout(() => beforeOffcanvasShow(this), overlayDelay);\n    } else {\n      beforeOffcanvasShow(this);\n      // istanbul ignore next @preserve - this test was done on Modal\n      if (currentOpen && hasClass(overlay, showClass)) hideOverlay();\n    }\n  }\n\n  /** Hides the offcanvas from the user. */\n  hide() {\n    const { element, relatedTarget } = this;\n\n    // istanbul ignore else @preserve\n    if (!hasClass(element, showClass)) return;\n\n    hideOffcanvasEvent.relatedTarget = relatedTarget || undefined;\n    hiddenOffcanvasEvent.relatedTarget = relatedTarget || undefined;\n    dispatchEvent(element, hideOffcanvasEvent);\n\n    // istanbul ignore else @preserve\n    if (hideOffcanvasEvent.defaultPrevented) return;\n\n    addClass(element, offcanvasTogglingClass);\n    removeClass(element, showClass);\n    beforeOffcanvasHide(this);\n  }\n\n  /**\n   * Toggles on/off the `click` event listeners.\n   *\n   * @param self the `Offcanvas` instance\n   * @param add when *true*, listeners are added\n   */\n  _toggleEventListeners = (add?: boolean) => {\n    const action = add ? addListener : removeListener;\n    this.triggers.forEach((btn) => {\n      action(btn, mouseclickEvent, offcanvasTriggerHandler);\n    });\n  };\n\n  /** Removes the `Offcanvas` from the target element. */\n  dispose() {\n    const { element } = this;\n    const isOpen = hasClass(element, showClass);\n    const callback = () => setTimeout(() => super.dispose(), 1);\n\n    this.hide();\n    this._toggleEventListeners();\n\n    if (isOpen) emulateTransitionEnd(element, callback);\n    // istanbul ignore next @preserve\n    else callback();\n  }\n}\n"],"names":["offcanvasSelector","offcanvasString","offcanvasToggleSelector","dataBsToggle","offcanvasDismissSelector","dataBsDismiss","offcanvasTogglingClass","offcanvasDefaults","getOffcanvasInstance","element","getInstance","offcanvasComponent","offcanvasInitCallback","Offcanvas","showOffcanvasEvent","createCustomEvent","shownOffcanvasEvent","hideOffcanvasEvent","hiddenOffcanvasEvent","setOffCanvasScrollbar","self","clientHeight","scrollHeight","getDocumentElement","setScrollbar","toggleOffCanvasDismiss","add","action","addListener","removeListener","doc","getDocument","keydownEvent","offcanvasKeyDismissHandler","mouseclickEvent","offcanvasDismissHandler","beforeOffcanvasShow","options","setElementStyle","getDocumentBody","addClass","showClass","emulateTransitionEnd","showOffcanvasComplete","beforeOffcanvasHide","currentOpen","getCurrentOpen","hasClass","overlay","hideOverlay","hideOffcanvasComplete","offcanvasTriggerHandler","e","getTargetElement","isDisabled","target","querySelector","offcanvasActiveSelector","offCanvasDismiss","triggers","backdrop","trigger","closest","selection","code","keyEscape","removeClass","removeAttribute","ariaHidden","setAttribute","ariaModal","dispatchEvent","focus","toggleFocusTrap","visibleTrigger","isVisible","removeOverlay","BaseComponent","config","querySelectorAll","btn","relatedTarget","overlayDelay","that","modalComponent","hasPopup","toggleOverlayType","appendOverlay","getElementTransitionDuration","showOverlay","isOpen","callback"],"mappings":"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"}