{"version":3,"file":"modal.mjs","sources":["../../src/components/modal.ts"],"sourcesContent":["/* Native JavaScript for Bootstrap 5 | Modal\n-------------------------------------------- */\nimport {\n addClass,\n ariaHidden,\n ariaModal,\n closest,\n createCustomEvent,\n CSS4Declaration,\n dispatchEvent,\n emulateTransitionEnd,\n focus,\n getDocument,\n getDocumentBody,\n getDocumentElement,\n getElementTransitionDuration,\n getInstance,\n hasClass,\n isRTL,\n KeyboardEvent,\n keydownEvent,\n keyEscape,\n mouseclickEvent,\n MouseEvent,\n querySelector,\n querySelectorAll,\n removeAttribute,\n removeClass,\n setAttribute,\n setElementStyle,\n Timer,\n toggleFocusTrap,\n} from \"@thednp/shorty\";\n\nimport { addListener, removeListener } from \"@thednp/event-listener\";\n\nimport dataBsToggle from \"~/strings/dataBsToggle\";\nimport dataBsDismiss from \"~/strings/dataBsDismiss\";\nimport fadeClass from \"~/strings/fadeClass\";\nimport showClass from \"~/strings/showClass\";\nimport modalString from \"~/strings/modalString\";\nimport modalComponent from \"~/strings/modalComponent\";\nimport offcanvasComponent from \"~/strings/offcanvasComponent\";\nimport getTargetElement from \"~/util/getTargetElement\";\nimport { measureScrollbar, setScrollbar } from \"~/util/scrollbar\";\nimport {\n appendOverlay,\n getCurrentOpen,\n hideOverlay,\n modalActiveSelector,\n overlay,\n removeOverlay,\n showOverlay,\n toggleOverlayType,\n} from \"~/util/backdrop\";\nimport isVisible from \"~/util/isVisible\";\nimport { hasPopup } from \"~/util/popupContainer\";\nimport isDisabled from \"~/util/isDisabled\";\nimport BaseComponent from \"./base-component\";\nimport { ModalEvent, ModalOptions } from \"~/interface/modal\";\n\n// MODAL PRIVATE GC\n// ================\nconst modalSelector = `.${modalString}`;\nconst modalToggleSelector = `[${dataBsToggle}=\"${modalString}\"]`;\nconst modalDismissSelector = `[${dataBsDismiss}=\"${modalString}\"]`;\nconst modalStaticClass = `${modalString}-static`;\n\nconst modalDefaults = {\n backdrop: true,\n keyboard: true,\n};\n\ntype ModalEventProps = {\n relatedTarget: Element & EventTarget | null;\n};\n\n/**\n * Static method which returns an existing `Modal` instance associated\n * to a target `Element`.\n */\nconst getModalInstance = (element: Element) =>\n getInstance(element, modalComponent);\n\n/**\n * A `Modal` initialization callback.\n */\nconst modalInitCallback = (element: Element) => new Modal(element);\n\n// MODAL CUSTOM EVENTS\n// ===================\nconst showModalEvent = createCustomEvent(\n `show.bs.${modalString}`,\n);\nconst shownModalEvent = createCustomEvent(\n `shown.bs.${modalString}`,\n);\nconst hideModalEvent = createCustomEvent(\n `hide.bs.${modalString}`,\n);\nconst hiddenModalEvent = createCustomEvent(\n `hidden.bs.${modalString}`,\n);\n\n// MODAL PRIVATE METHODS\n// =====================\n/**\n * Applies special style for the `` and fixed elements\n * when a modal instance is shown to the user.\n *\n * @param self the `Modal` instance\n */\nconst setModalScrollbar = (self: Modal) => {\n const { element } = self;\n const scrollbarWidth = measureScrollbar(element);\n const { clientHeight, scrollHeight } = getDocumentElement(element);\n const { clientHeight: modalHeight, scrollHeight: modalScrollHeight } =\n element;\n const modalOverflow = modalHeight !== modalScrollHeight;\n\n // istanbul ignore next @preserve: impossible to test?\n if (!modalOverflow && scrollbarWidth) {\n const pad = !isRTL(element)\n ? \"paddingRight\"\n // istanbul ignore next @preserve\n : \"paddingLeft\";\n const padStyle = { [pad]: `${scrollbarWidth}px` } as Partial<\n CSS4Declaration\n >;\n setElementStyle(element, padStyle);\n }\n setScrollbar(element, modalOverflow || clientHeight !== scrollHeight);\n};\n\n/**\n * Toggles on/off the listeners of events that close the modal.\n *\n * @param self the `Modal` instance\n * @param add when `true`, event listeners are added\n */\nconst toggleModalDismiss = (self: Modal, add?: boolean) => {\n const action = add ? addListener : removeListener;\n const { element } = self;\n action(element, mouseclickEvent, modalDismissHandler);\n action(getDocument(element), keydownEvent, modalKeyHandler);\n\n if (add) self._observer.observe(element);\n else self._observer.disconnect();\n};\n\n/**\n * Executes after a modal is hidden to the user.\n *\n * @param self the `Modal` instance\n */\nconst afterModalHide = (self: Modal) => {\n const { triggers, element, relatedTarget } = self;\n removeOverlay(element);\n setElementStyle(element, { paddingRight: \"\", display: \"\" });\n toggleModalDismiss(self);\n\n const focusElement = showModalEvent.relatedTarget || triggers.find(isVisible);\n // istanbul ignore else @preserve\n if (focusElement) focus(focusElement);\n\n hiddenModalEvent.relatedTarget = relatedTarget || undefined;\n dispatchEvent(element, hiddenModalEvent);\n toggleFocusTrap(element);\n};\n\n/**\n * Executes after a modal is shown to the user.\n *\n * @param self the `Modal` instance\n */\nconst afterModalShow = (self: Modal) => {\n const { element, relatedTarget } = self;\n focus(element as HTMLElement);\n toggleModalDismiss(self, true);\n\n shownModalEvent.relatedTarget = relatedTarget || undefined;\n dispatchEvent(element, shownModalEvent);\n toggleFocusTrap(element);\n};\n\n/**\n * Executes before a modal is shown to the user.\n *\n * @param self the `Modal` instance\n */\nconst beforeModalShow = (self: Modal) => {\n const { element, hasFade } = self;\n setElementStyle(element, { display: \"block\" });\n setModalScrollbar(self);\n // istanbul ignore else @preserve\n if (!getCurrentOpen(element)) {\n setElementStyle(getDocumentBody(element), { overflow: \"hidden\" });\n }\n\n addClass(element, showClass);\n removeAttribute(element, ariaHidden);\n setAttribute(element, ariaModal, \"true\");\n\n if (hasFade) emulateTransitionEnd(element, () => afterModalShow(self));\n else afterModalShow(self);\n};\n\n/**\n * Executes before a modal is hidden to the user.\n *\n * @param self the `Modal` instance\n */\nconst beforeModalHide = (self: Modal) => {\n const { element, options, hasFade } = self;\n\n // callback can also be the transitionEvent object, we wanna make sure it's not\n // call is not forced and overlay is visible\n if (\n options.backdrop && hasFade && hasClass(overlay, showClass) &&\n !getCurrentOpen(element)\n ) {\n // AND no modal is visible\n hideOverlay();\n emulateTransitionEnd(overlay, () => afterModalHide(self));\n } else {\n afterModalHide(self);\n }\n};\n\n// MODAL EVENT HANDLERS\n// ====================\n/**\n * Handles the `click` event listener for modal.\n *\n * @param e the `Event` object\n */\nfunction modalClickHandler(this: HTMLElement, e: MouseEvent) {\n const element = getTargetElement(this);\n const self = element && getModalInstance(element);\n\n // istanbul ignore if @preserve\n if (isDisabled(this)) return;\n\n // istanbul ignore if @preserve\n if (!self) return;\n\n // istanbul ignore else @preserve\n if (this.tagName === \"A\") e.preventDefault();\n self.relatedTarget = this;\n self.toggle();\n}\n\n/**\n * Handles the `keydown` event listener for modal\n * to hide the modal when user type the `ESC` key.\n *\n * @param e the `Event` object\n */\nconst modalKeyHandler = ({ code, target }: KeyboardEvent) => {\n const element = querySelector(modalActiveSelector, getDocument(target));\n const self = element && getModalInstance(element);\n\n // istanbul ignore if @preserve\n if (!self) return;\n\n const { options } = self;\n // istanbul ignore else @preserve\n if (\n options.keyboard &&\n code === keyEscape && // the keyboard option is enabled and the key is 27\n hasClass(element, showClass)\n ) {\n // the modal is not visible\n self.relatedTarget = null;\n self.hide();\n }\n};\n\n/**\n * Handles the `click` event listeners that hide the modal.\n *\n * @param e the `Event` object\n */\nconst modalDismissHandler = (e: MouseEvent) => {\n const { currentTarget } = e;\n const self = currentTarget && getModalInstance(currentTarget);\n\n // the timer is needed\n // istanbul ignore if @preserve\n if (!self || !currentTarget || Timer.get(currentTarget)) return;\n\n const { options, isStatic, modalDialog } = self;\n const { backdrop } = options;\n const { target } = e;\n\n const selectedText = getDocument(currentTarget)?.getSelection()?.toString()\n .length;\n const targetInsideDialog = modalDialog.contains(target);\n const dismiss = target && closest(target, modalDismissSelector);\n\n // istanbul ignore else @preserve\n if (isStatic && !targetInsideDialog) {\n Timer.set(\n currentTarget,\n () => {\n addClass(currentTarget, modalStaticClass);\n emulateTransitionEnd(modalDialog, () => staticTransitionEnd(self));\n },\n 17,\n );\n } else if (\n dismiss || (!selectedText && !isStatic && !targetInsideDialog && backdrop)\n ) {\n self.relatedTarget = dismiss || null;\n self.hide();\n e.preventDefault();\n }\n};\n\n/**\n * Handles the `transitionend` event listeners for `Modal`.\n *\n * @param self the `Modal` instance\n */\nconst staticTransitionEnd = (self: Modal) => {\n const { element, modalDialog } = self;\n const duration = (getElementTransitionDuration(modalDialog) || 0) + 17;\n removeClass(element, modalStaticClass);\n // user must wait for zoom out transition\n Timer.set(element, () => Timer.clear(element), duration);\n};\n\n// MODAL DEFINITION\n// ================\n/** Returns a new `Modal` instance. */\nexport default class Modal extends BaseComponent {\n static selector = modalSelector;\n static init = modalInitCallback;\n static getInstance = getModalInstance;\n declare element: HTMLElement;\n declare options: ModalOptions;\n declare modalDialog: HTMLElement;\n declare triggers: HTMLElement[];\n declare isStatic: boolean;\n declare hasFade: boolean;\n declare relatedTarget: EventTarget & HTMLElement | null;\n declare _observer: ResizeObserver;\n\n /**\n * @param target usually the `.modal` element\n * @param config instance options\n */\n constructor(target: Element | string, config?: Partial) {\n super(target, config);\n\n // the modal\n const { element } = this;\n\n // the modal-dialog\n const modalDialog = querySelector(\n `.${modalString}-dialog`,\n element,\n );\n\n // istanbul ignore if @preserve\n if (!modalDialog) return;\n\n this.modalDialog = modalDialog;\n // modal can have multiple triggering elements\n this.triggers = [\n ...querySelectorAll(\n modalToggleSelector,\n getDocument(element),\n ),\n ].filter(\n (btn) => getTargetElement(btn) === element,\n );\n\n // additional internals\n this.isStatic = this.options.backdrop === \"static\";\n this.hasFade = hasClass(element, fadeClass);\n this.relatedTarget = null;\n this._observer = new ResizeObserver(() => this.update());\n\n // attach event listeners\n this._toggleEventListeners(true);\n }\n\n /**\n * Returns component name string.\n */\n get name() {\n return modalComponent;\n }\n /**\n * Returns component default options.\n */\n get defaults() {\n return modalDefaults;\n }\n\n // MODAL PUBLIC METHODS\n // ====================\n /** Toggles the visibility of the modal. */\n toggle() {\n if (hasClass(this.element, showClass)) this.hide();\n else this.show();\n }\n\n /** Shows the modal to the user. */\n show() {\n const { element, options, hasFade, relatedTarget } = this;\n const { backdrop } = options;\n let overlayDelay = 0;\n\n // istanbul ignore if @preserve\n if (hasClass(element, showClass)) return;\n\n showModalEvent.relatedTarget = relatedTarget || undefined;\n dispatchEvent(element, showModalEvent);\n\n // allow the event to be prevented\n // istanbul ignore else @preserve\n if (showModalEvent.defaultPrevented) return;\n\n // we elegantly hide any opened modal/offcanvas\n const currentOpen = getCurrentOpen(element);\n\n // istanbul ignore else @preserve\n if (currentOpen && currentOpen !== element) {\n const that = getModalInstance(currentOpen) ||\n // istanbul ignore next @preserve\n getInstance void }>(\n currentOpen,\n offcanvasComponent,\n );\n // istanbul ignore else @preserve\n if (that) that.hide();\n }\n if (backdrop) {\n if (!hasPopup(overlay)) {\n appendOverlay(element, hasFade, true);\n } else {\n toggleOverlayType(true);\n }\n\n overlayDelay = getElementTransitionDuration(overlay);\n showOverlay();\n\n setTimeout(() => beforeModalShow(this), overlayDelay);\n } else {\n beforeModalShow(this);\n // istanbul ignore else @preserve\n if (currentOpen && hasClass(overlay, showClass)) {\n hideOverlay();\n }\n }\n }\n\n /** Hide the modal from the user. */\n hide() {\n const { element, hasFade, relatedTarget } = this;\n\n // istanbul ignore if @preserve\n if (!hasClass(element, showClass)) return;\n\n hideModalEvent.relatedTarget = relatedTarget || undefined;\n dispatchEvent(element, hideModalEvent);\n\n // istanbul ignore if @preserve\n if (hideModalEvent.defaultPrevented) return;\n\n removeClass(element, showClass);\n setAttribute(element, ariaHidden, \"true\");\n removeAttribute(element, ariaModal);\n\n if (hasFade) emulateTransitionEnd(element, () => beforeModalHide(this));\n else beforeModalHide(this);\n }\n\n /**\n * Updates the modal layout.\n */\n update = () => {\n // istanbul ignore else @preserve\n if (hasClass(this.element, showClass)) setModalScrollbar(this);\n };\n\n /**\n * Toggles on/off the `click` event listener of the `Modal` instance.\n *\n * @param add when `true`, event listener(s) is/are added\n */\n _toggleEventListeners = (add?: boolean) => {\n const action = add ? addListener : removeListener;\n const { triggers } = this;\n\n // istanbul ignore if @preserve\n if (!triggers.length) return;\n\n triggers.forEach((btn) => {\n // istanbul ignore else @preserve\n action(btn, mouseclickEvent, modalClickHandler);\n });\n };\n\n /** Removes the `Modal` component from target element. */\n dispose() {\n const clone = { ...this };\n const { modalDialog, hasFade } = clone;\n const callback = () => setTimeout(() => super.dispose(), 17);\n\n this.hide();\n this._toggleEventListeners();\n\n if (hasFade) {\n // use transitionend callback\n emulateTransitionEnd(modalDialog, callback);\n } else {\n callback();\n }\n }\n}\n"],"names":["modalSelector","modalString","modalToggleSelector","dataBsToggle","modalDismissSelector","dataBsDismiss","modalStaticClass","modalDefaults","getModalInstance","element","getInstance","modalComponent","modalInitCallback","Modal","showModalEvent","createCustomEvent","shownModalEvent","hideModalEvent","hiddenModalEvent","setModalScrollbar","self","scrollbarWidth","measureScrollbar","clientHeight","scrollHeight","getDocumentElement","modalHeight","modalScrollHeight","modalOverflow","padStyle","isRTL","setElementStyle","setScrollbar","toggleModalDismiss","add","action","addListener","removeListener","mouseclickEvent","modalDismissHandler","getDocument","keydownEvent","modalKeyHandler","afterModalHide","triggers","relatedTarget","removeOverlay","focusElement","isVisible","dispatchEvent","toggleFocusTrap","afterModalShow","focus","beforeModalShow","hasFade","getCurrentOpen","getDocumentBody","addClass","showClass","removeAttribute","ariaHidden","setAttribute","ariaModal","emulateTransitionEnd","beforeModalHide","options","hasClass","overlay","hideOverlay","modalClickHandler","e","getTargetElement","isDisabled","code","target","querySelector","modalActiveSelector","keyEscape","currentTarget","Timer","isStatic","modalDialog","backdrop","selectedText","targetInsideDialog","dismiss","closest","staticTransitionEnd","duration","getElementTransitionDuration","removeClass","BaseComponent","config","querySelectorAll","btn","fadeClass","overlayDelay","currentOpen","that","offcanvasComponent","hasPopup","toggleOverlayType","appendOverlay","showOverlay","clone","callback"],"mappings":"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"}