1 line
35 KiB
Plaintext
1 line
35 KiB
Plaintext
{"version":3,"file":"offcanvas.mjs","names":["pkg.version"],"sources":["../../../src/strings/dataBsDismiss.ts","../../../src/strings/dataBsToggle.ts","../../../src/strings/showClass.ts","../../../src/strings/offcanvasString.ts","../../../src/strings/offcanvasComponent.ts","../../../src/strings/modalComponent.ts","../../../src/strings/dataBsTarget.ts","../../../src/strings/dataBsParent.ts","../../../src/strings/dataBsContainer.ts","../../../src/util/getTargetElement.ts","../../../src/util/isVisible.ts","../../../src/strings/fixedTopClass.ts","../../../src/strings/fixedBottomClass.ts","../../../src/strings/stickyTopClass.ts","../../../src/strings/positionStickyClass.ts","../../../src/util/scrollbar.ts","../../../src/util/popupContainer.ts","../../../src/strings/fadeClass.ts","../../../src/strings/modalString.ts","../../../src/util/backdrop.ts","../../../src/util/isDisabled.ts","../../../package.json","../../../src/version.ts","../../../src/components/base-component.ts","../../../src/components/offcanvas.ts"],"sourcesContent":["/**\n * Global namespace for most components `dismiss` option.\n */\nconst dataBsDismiss = \"data-bs-dismiss\";\nexport default dataBsDismiss;\n","/**\n * Global namespace for most components `toggle` option.\n */\nconst dataBsToggle = \"data-bs-toggle\";\nexport default dataBsToggle;\n","/**\n * Global namespace for most components `show` class.\n */\nconst showClass = \"show\";\nexport default showClass;\n","/** @type {string} */\nconst offcanvasString = \"offcanvas\";\nexport default offcanvasString;\n","/** @type {string} */\nconst offcanvasComponent = \"Offcanvas\";\nexport default offcanvasComponent;\n","/** @type {string} */\nconst modalComponent = \"Modal\";\nexport default modalComponent;\n","/**\n * Global namespace for most components `target` option.\n */\nconst dataBsTarget = \"data-bs-target\";\nexport default dataBsTarget;\n","/**\n * Global namespace for most components `parent` option.\n */\nconst dataBsParent = \"data-bs-parent\";\nexport default dataBsParent;\n","/**\n * Global namespace for most components `container` option.\n */\nconst dataBsContainer = \"data-bs-container\";\nexport default dataBsContainer;\n","import {\n closest,\n getAttribute,\n getDocument,\n querySelector,\n} from \"@thednp/shorty\";\n\nimport dataBsTarget from \"../strings/dataBsTarget\";\nimport dataBsParent from \"../strings/dataBsParent\";\nimport dataBsContainer from \"../strings/dataBsContainer\";\n\n/**\n * Returns the `Element` that THIS one targets\n * via `data-bs-target`, `href`, `data-bs-parent` or `data-bs-container`.\n *\n * @param element the target element\n * @returns the query result\n */\nconst getTargetElement = <T extends Element = HTMLElement>(element: T) => {\n const targetAttr = [dataBsTarget, dataBsParent, dataBsContainer, \"href\"];\n const doc = getDocument(element);\n\n return targetAttr\n .map((att) => {\n const attValue = getAttribute(element, att);\n if (attValue) {\n // istanbul ignore next @preserve\n return att === dataBsParent\n ? closest<T>(element, attValue)\n : querySelector<T>(attValue, doc);\n }\n return null;\n })\n .filter((x) => x)[0];\n};\n\nexport default getTargetElement;\n","import { getElementStyle, isHTMLElement } from \"@thednp/shorty\";\n\n/**\n * @param element target\n * @returns the check result\n */\nconst isVisible = (element: HTMLElement) => {\n return isHTMLElement(element) &&\n getElementStyle(element, \"visibility\") !== \"hidden\" &&\n element.offsetParent !== null;\n};\nexport default isVisible;\n","/**\n * Global namespace for components `fixed-top` class.\n */\nconst fixedTopClass = \"fixed-top\";\nexport default fixedTopClass;\n","/**\n * Global namespace for components `fixed-bottom` class.\n */\nconst fixedBottomClass = \"fixed-bottom\";\nexport default fixedBottomClass;\n","/**\n * Global namespace for components `sticky-top` class.\n */\nconst stickyTopClass = \"sticky-top\";\nexport default stickyTopClass;\n","/**\n * Global namespace for components `position-sticky` class.\n */\nconst positionStickyClass = \"position-sticky\";\nexport default positionStickyClass;\n","import {\n getDocumentBody,\n getDocumentElement,\n getElementsByClassName,\n getElementStyle,\n getWindow,\n hasClass,\n setElementStyle,\n} from \"@thednp/shorty\";\n\nimport fixedTopClass from \"../strings/fixedTopClass\";\nimport fixedBottomClass from \"../strings/fixedBottomClass\";\nimport stickyTopClass from \"../strings/stickyTopClass\";\nimport positionStickyClass from \"../strings/positionStickyClass\";\n\nconst getFixedItems = (parent?: ParentNode) => [\n ...getElementsByClassName<HTMLElement>(fixedTopClass, parent),\n ...getElementsByClassName<HTMLElement>(fixedBottomClass, parent),\n ...getElementsByClassName<HTMLElement>(stickyTopClass, parent),\n ...getElementsByClassName<HTMLElement>(positionStickyClass, parent),\n ...getElementsByClassName<HTMLElement>(\"is-fixed\", parent),\n];\n\n/**\n * Removes *padding* and *overflow* from the `<body>`\n * and all spacing from fixed items.\n *\n * @param element the target modal/offcanvas\n */\nexport const resetScrollbar = (element?: Element) => {\n const bd = getDocumentBody(element);\n setElementStyle(bd, {\n paddingRight: \"\",\n overflow: \"\",\n });\n\n const fixedItems = getFixedItems(bd);\n\n // istanbul ignore else @preserve\n if (fixedItems.length) {\n fixedItems.forEach((fixed) => {\n setElementStyle(fixed, {\n paddingRight: \"\",\n marginRight: \"\",\n });\n });\n }\n};\n\n/**\n * Returns the scrollbar width if the body does overflow\n * the window.\n *\n * @param element target element\n * @returns the scrollbar width value\n */\nexport const measureScrollbar = (element: Element) => {\n const { clientWidth } = getDocumentElement(element);\n const { innerWidth } = getWindow(element);\n return Math.abs(innerWidth - clientWidth);\n};\n\n/**\n * Sets the `<body>` and fixed items style when modal / offcanvas\n * is shown to the user.\n *\n * @param element the target modal/offcanvas\n * @param overflow body does overflow or not\n */\nexport const setScrollbar = (element: Element, overflow?: boolean) => {\n const bd = getDocumentBody(element);\n const bodyPad = parseInt(getElementStyle(bd, \"paddingRight\"), 10);\n const isOpen = getElementStyle(bd, \"overflow\") === \"hidden\";\n // istanbul ignore next @preserve\n const sbWidth = isOpen && bodyPad ? 0 : measureScrollbar(element);\n const fixedItems = getFixedItems(bd);\n\n // istanbul ignore if @preserve\n if (!overflow) return;\n\n setElementStyle(bd, {\n overflow: \"hidden\",\n paddingRight: `${bodyPad + sbWidth}px`,\n });\n\n // istanbul ignore if @preserve\n if (!fixedItems.length) return;\n\n fixedItems.forEach((fixed) => {\n const itemPadValue = getElementStyle(fixed, \"paddingRight\");\n fixed.style.paddingRight = `${parseInt(itemPadValue, 10) + sbWidth}px`;\n // istanbul ignore else @preserve\n if (\n [stickyTopClass, positionStickyClass].some((c) => hasClass(fixed, c))\n ) {\n const itemMValue = getElementStyle(fixed, \"marginRight\");\n fixed.style.marginRight = `${parseInt(itemMValue, 10) - sbWidth}px`;\n }\n });\n};\n","import { createElement, getDocumentBody, isNode } from \"@thednp/shorty\";\n\n// the default container for Modal, Offcanvas, Popover and Tooltip\nconst popupContainer = createElement({\n tagName: \"div\",\n className: \"popup-container\",\n}) as HTMLElement;\n\nconst appendPopup = (target: Element, customContainer?: ParentNode) => {\n const containerIsBody = isNode(customContainer) &&\n customContainer.nodeName === \"BODY\";\n const lookup = isNode(customContainer) && !containerIsBody\n ? customContainer\n : popupContainer;\n const BODY = containerIsBody ? customContainer : getDocumentBody(target);\n\n // istanbul ignore else @preserve\n if (isNode(target)) {\n if (lookup === popupContainer) {\n BODY.append(popupContainer);\n }\n lookup.append(target);\n }\n};\n\nconst removePopup = (target: Element, customContainer?: ParentNode) => {\n const containerIsBody = isNode(customContainer) &&\n customContainer.nodeName === \"BODY\";\n const lookup = isNode(customContainer) && !containerIsBody\n ? customContainer\n : popupContainer;\n\n // istanbul ignore else @preserve\n if (isNode(target)) {\n target.remove();\n\n if (lookup === popupContainer && !popupContainer.children.length) {\n popupContainer.remove();\n }\n }\n};\n\nconst hasPopup = (target: Element, customContainer?: ParentNode) => {\n const lookup = isNode(customContainer) && customContainer.nodeName !== \"BODY\"\n ? customContainer\n : popupContainer;\n return isNode(target) && lookup.contains(target);\n};\n\nexport { appendPopup, hasPopup, popupContainer, removePopup };\n","/**\n * Global namespace for most components `fade` class.\n */\nconst fadeClass = \"fade\";\nexport default fadeClass;\n","/** @type {string} */\nconst modalString = \"modal\";\nexport default modalString;\n","import {\n addClass,\n createElement,\n getDocument,\n getDocumentBody,\n hasClass,\n querySelector,\n reflow,\n removeClass,\n} from \"@thednp/shorty\";\n\nimport fadeClass from \"../strings/fadeClass\";\nimport showClass from \"../strings/showClass\";\nimport modalString from \"../strings/modalString\";\nimport offcanvasString from \"../strings/offcanvasString\";\nimport { resetScrollbar } from \"./scrollbar\";\nimport { appendPopup, removePopup } from \"./popupContainer\";\n\nconst backdropString = \"backdrop\";\nconst modalBackdropClass = `${modalString}-${backdropString}`;\nconst offcanvasBackdropClass = `${offcanvasString}-${backdropString}`;\nconst modalActiveSelector = `.${modalString}.${showClass}`;\nconst offcanvasActiveSelector = `.${offcanvasString}.${showClass}`;\n\n// any document would suffice\nconst overlay = createElement(\"div\") as HTMLElement;\n\n/**\n * Returns the current active modal / offcancas element.\n *\n * @param element the context element\n * @returns the requested element\n */\nconst getCurrentOpen = (element?: Element) => {\n return querySelector(\n `${modalActiveSelector},${offcanvasActiveSelector}`,\n getDocument(element),\n );\n};\n\n/**\n * Toogles from a Modal overlay to an Offcanvas, or vice-versa.\n *\n * @param isModal\n */\nconst toggleOverlayType = (isModal?: boolean) => {\n const targetClass = isModal ? modalBackdropClass : offcanvasBackdropClass;\n [modalBackdropClass, offcanvasBackdropClass].forEach((c) => {\n removeClass(overlay, c);\n });\n addClass(overlay, targetClass);\n};\n\n/**\n * Append the overlay to DOM.\n *\n * @param element\n * @param hasFade\n * @param isModal\n */\nconst appendOverlay = (\n element: Element,\n hasFade: boolean,\n isModal?: boolean,\n) => {\n toggleOverlayType(isModal);\n appendPopup(overlay, getDocumentBody(element));\n if (hasFade) addClass(overlay, fadeClass);\n};\n\n/**\n * Shows the overlay to the user.\n */\nconst showOverlay = () => {\n if (!hasClass(overlay, showClass)) {\n addClass(overlay, showClass);\n reflow(overlay);\n }\n};\n\n/**\n * Hides the overlay from the user.\n */\nconst hideOverlay = () => {\n removeClass(overlay, showClass);\n};\n\n/**\n * Removes the overlay from DOM.\n *\n * @param element\n */\nconst removeOverlay = (element?: Element): void => {\n if (!getCurrentOpen(element)) {\n removeClass(overlay, fadeClass);\n removePopup(overlay, getDocumentBody(element));\n resetScrollbar(element);\n }\n};\n\nexport {\n appendOverlay,\n getCurrentOpen,\n hideOverlay,\n modalActiveSelector,\n modalBackdropClass,\n offcanvasActiveSelector,\n offcanvasBackdropClass,\n overlay,\n removeOverlay,\n showOverlay,\n toggleOverlayType,\n};\n","import { getAttribute, hasClass } from \"@thednp/shorty\";\n\n/**\n * Check if interactive element is disabled.\n * @param target either a `<button>` or an `<a>`\n * @returns whether the target is disabled\n */\nconst isDisabled = (target: Element) => {\n return hasClass(target, \"disabled\") ||\n getAttribute(target, \"disabled\") === \"true\";\n};\n\nexport default isDisabled;\n","","import pkg from \"../package.json\" with { type: \"json\" };\n\nconst Version = pkg.version;\n\nexport default Version;\n","/* Native JavaScript for Bootstrap 5 | Base Component\n----------------------------------------------------- */\nimport {\n Data,\n isElement,\n isString,\n normalizeOptions,\n ObjectKeys,\n querySelector,\n} from \"@thednp/shorty\";\n\nimport type { BaseOptions } from \"~/interface/baseComponent\";\nimport Version from \"~/version\";\n\n/** Returns a new `BaseComponent` instance. */\nexport default class BaseComponent {\n declare element: Element;\n declare options?: BaseOptions;\n\n /**\n * @param target `Element` or selector string\n * @param config component instance options\n */\n constructor(target: Element | string, config?: BaseOptions) {\n let element: Element | null;\n\n try {\n if (isElement(target)) {\n element = target as Element;\n } else if (isString(target)) {\n element = querySelector(target);\n // istanbul ignore else @preserve\n if (!element) throw Error(`\"${target}\" is not a valid selector.`);\n } else {\n throw Error(`your target is not an instance of HTMLElement.`);\n }\n } catch (e) {\n throw Error(`${this.name} Error: ${(e as Error).message}`);\n }\n\n const prevInstance = Data.get<typeof this>(element, this.name);\n /* istanbul ignore else @preserve */\n if (prevInstance) {\n // remove previously attached event listeners\n // to avoid memory leaks\n prevInstance._toggleEventListeners();\n }\n\n this.element = element;\n this.options = this.defaults && ObjectKeys(this.defaults).length\n ? normalizeOptions(element, this.defaults, config || {}, \"bs\")\n : /* istanbul ignore next @preserve */ {};\n\n Data.set(element, this.name, this);\n }\n\n // istanbul ignore next @preserve\n get version() {\n return Version;\n }\n\n // istanbul ignore next @preserve\n get name() {\n return \"BaseComponent\";\n }\n\n // istanbul ignore next @preserve\n get defaults() {\n return {};\n }\n\n /** just to have something to extend from */\n // istanbul ignore next @preserve coverage wise this isn't important\n _toggleEventListeners = () => {\n // do something to please linters\n };\n\n /** Removes component from target element. */\n dispose() {\n Data.remove<typeof this>(this.element, this.name);\n ObjectKeys(this).forEach((prop) => {\n delete this[prop];\n });\n }\n}\n","/* 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 @preserve - a filter is required here\n if (overlay.contains(target) && backdrop === \"static\") return;\n\n const isOwnTrigger = triggers.includes(target);\n const isOwnTarget = offCanvasDismiss?.contains(target) || false;\n\n // istanbul ignore if @preserve - unfortunately ignore won't work with this many conditions\n if (\n /* istanbul ignore next @preserve */\n !(selection && selection.toString().length) &&\n ((!element.contains(target) &&\n backdrop && (!trigger || isOwnTrigger)) ||\n isOwnTarget)\n ) {\n self.relatedTarget = offCanvasDismiss && isOwnTarget\n ? offCanvasDismiss\n : undefined;\n self.hide();\n }\n\n // istanbul ignore next @preserve - we don't usually use Anchor for dismissers\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 // istanbul ignore next @preserve\n const that = getOffcanvasInstance(currentOpen) ||\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"],"mappings":"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"} |