1 |
- {"version":3,"file":"toast.cjs","sources":["../../src/strings/toastString.ts","../../src/strings/toastComponent.ts","../../src/components/toast.ts"],"sourcesContent":["/** @type {string} */\nconst toastString = \"toast\";\nexport default toastString;\n","/** @type {string} */\nconst toastComponent = \"Toast\";\nexport default toastComponent;\n","/* Native JavaScript for Bootstrap 5 | Toast\n-------------------------------------------- */\nimport {\n addClass,\n createCustomEvent,\n dispatchEvent,\n emulateTransitionEnd,\n focusinEvent,\n focusoutEvent,\n getDocument,\n getInstance,\n hasClass,\n mouseclickEvent,\n mouseenterEvent,\n MouseEvent,\n mouseleaveEvent,\n querySelector,\n querySelectorAll,\n reflow,\n removeClass,\n Timer,\n} from \"@thednp/shorty\";\n\nimport { addListener, removeListener } from \"@thednp/event-listener\";\n\nimport fadeClass from \"~/strings/fadeClass\";\nimport showClass from \"~/strings/showClass\";\nimport dataBsDismiss from \"~/strings/dataBsDismiss\";\nimport dataBsToggle from \"~/strings/dataBsToggle\";\nimport toastString from \"~/strings/toastString\";\nimport toastComponent from \"~/strings/toastComponent\";\nimport getTargetElement from \"~/util/getTargetElement\";\nimport isDisabled from \"~/util/isDisabled\";\nimport BaseComponent from \"./base-component\";\nimport { ToastEvent, ToastOptions } from \"~/interface/toast\";\n\n// TOAST PRIVATE GC\n// ================\nconst toastSelector = `.${toastString}`;\nconst toastDismissSelector = `[${dataBsDismiss}=\"${toastString}\"]`;\nconst toastToggleSelector = `[${dataBsToggle}=\"${toastString}\"]`;\nconst showingClass = \"showing\";\n/** @deprecated */\nconst hideClass = \"hide\";\n\nconst toastDefaults = {\n animation: true,\n autohide: true,\n delay: 5000,\n};\n\n/**\n * Static method which returns an existing `Toast` instance associated\n * to a target `Element`.\n */\nconst getToastInstance = (element: Element) =>\n getInstance<Toast>(element, toastComponent);\n\n/**\n * A `Toast` initialization callback.\n */\nconst toastInitCallback = (element: Element) => new Toast(element);\n\n// TOAST CUSTOM EVENTS\n// ===================\nconst showToastEvent = createCustomEvent<Record<string, never>, ToastEvent>(\n `show.bs.${toastString}`,\n);\nconst shownToastEvent = createCustomEvent<Record<string, never>, ToastEvent>(\n `shown.bs.${toastString}`,\n);\nconst hideToastEvent = createCustomEvent<Record<string, never>, ToastEvent>(\n `hide.bs.${toastString}`,\n);\nconst hiddenToastEvent = createCustomEvent<Record<string, never>, ToastEvent>(\n `hidden.bs.${toastString}`,\n);\n\n// TOAST PRIVATE METHODS\n// =====================\n/**\n * Executes after the toast is shown to the user.\n *\n * @param self the `Toast` instance\n */\nconst showToastComplete = (self: Toast) => {\n const { element, options } = self;\n removeClass(element, showingClass);\n Timer.clear(element, showingClass);\n\n dispatchEvent(element, shownToastEvent);\n // istanbul ignore else @preserve\n if (options.autohide) {\n Timer.set(element, () => self.hide(), options.delay, toastString);\n }\n};\n\n/**\n * Executes after the toast is hidden to the user.\n *\n * @param self the `Toast` instance\n */\nconst hideToastComplete = (self: Toast) => {\n const { element } = self;\n removeClass(element, showingClass);\n removeClass(element, showClass);\n addClass(element, hideClass); // B/C\n Timer.clear(element, toastString);\n dispatchEvent(element, hiddenToastEvent);\n};\n\n/**\n * Executes before hiding the toast.\n *\n * @param self the `Toast` instance\n */\nconst hideToast = (self: Toast) => {\n const { element, options } = self;\n addClass(element, showingClass);\n\n if (options.animation) {\n reflow(element as HTMLElement);\n emulateTransitionEnd(element, () => hideToastComplete(self));\n } else {\n hideToastComplete(self);\n }\n};\n\n/**\n * Executes before showing the toast.\n *\n * @param self the `Toast` instance\n */\nconst showToast = (self: Toast) => {\n const { element, options } = self;\n Timer.set(\n element,\n () => {\n removeClass(element, hideClass); // B/C\n reflow(element as HTMLElement);\n addClass(element, showClass);\n addClass(element, showingClass);\n\n if (options.animation) {\n emulateTransitionEnd(element, () => showToastComplete(self));\n } else {\n showToastComplete(self);\n }\n },\n 17,\n showingClass,\n );\n};\n\n// TOAST EVENT HANDLERS\n// ====================\n/**\n * Handles the `click` event listener for toast.\n *\n * @param e the `Event` object\n */\nfunction toastClickHandler(this: HTMLElement, e: Event) {\n const element = getTargetElement(this);\n const self = element && getToastInstance(element);\n\n // istanbul ignore if @preserve\n if (isDisabled(this)) return;\n // istanbul ignore if @preserve\n if (!self) return;\n // istanbul ignore else @preserve\n if (this.tagName === \"A\") e.preventDefault();\n self.relatedTarget = this;\n self.show();\n}\n\n/**\n * Executes when user interacts with the toast without closing it,\n * usually by hovering or focusing it.\n *\n * @param e the `Toast` instance\n */\nconst interactiveToastHandler = (e: MouseEvent<HTMLElement>) => {\n const element = e.target;\n const self = getToastInstance(element);\n const { type, relatedTarget } = e;\n\n // istanbul ignore if @preserve: a solid filter is required\n if (\n !self || element === relatedTarget ||\n element.contains(relatedTarget as Node)\n ) return;\n\n if ([mouseenterEvent, focusinEvent].includes(type)) {\n Timer.clear(element, toastString);\n } else {\n Timer.set(element, () => self.hide(), self.options.delay, toastString);\n }\n};\n\n// TOAST DEFINITION\n// ================\n/** Creates a new `Toast` instance. */\nexport default class Toast extends BaseComponent {\n static selector = toastSelector;\n static init = toastInitCallback;\n static getInstance = getToastInstance;\n declare element: HTMLElement;\n declare options: ToastOptions;\n declare dismiss: HTMLElement | null;\n declare triggers: HTMLElement[];\n declare relatedTarget: HTMLElement | null;\n\n /**\n * @param target the target `.toast` element\n * @param config the instance options\n */\n constructor(target: Element | string, config?: Partial<ToastOptions>) {\n super(target, config);\n const { element, options } = this;\n\n // set fadeClass, the options.animation will override the markup\n if (options.animation && !hasClass(element, fadeClass)) {\n addClass(element, fadeClass);\n } else if (!options.animation && hasClass(element, fadeClass)) {\n removeClass(element, fadeClass);\n }\n\n // dismiss button\n this.dismiss = querySelector<HTMLElement>(toastDismissSelector, element);\n\n // toast can have multiple triggering elements\n this.triggers = [\n ...querySelectorAll<HTMLElement>(\n toastToggleSelector,\n getDocument(element),\n ),\n ].filter(\n (btn) => getTargetElement(btn) === element,\n );\n\n // add event listener\n this._toggleEventListeners(true);\n }\n /**\n * Returns component name string.\n */\n get name() {\n return toastComponent;\n }\n /**\n * Returns component default options.\n */\n get defaults() {\n return toastDefaults;\n }\n /**\n * Returns *true* when toast is visible.\n */\n get isShown() {\n return hasClass(this.element, showClass);\n }\n\n // TOAST PUBLIC METHODS\n // ====================\n /** Shows the toast. */\n show = () => {\n const { element, isShown } = this;\n\n // istanbul ignore if @preserve\n if (!element || isShown) return;\n\n dispatchEvent(element, showToastEvent);\n if (!showToastEvent.defaultPrevented) showToast(this);\n };\n\n /** Hides the toast. */\n hide = () => {\n const { element, isShown } = this;\n\n // istanbul ignore if @preserve\n if (!element || !isShown) return;\n\n dispatchEvent(element, hideToastEvent);\n if (!hideToastEvent.defaultPrevented) hideToast(this);\n };\n\n /**\n * Toggles on/off the `click` event listener.\n *\n * @param add when `true`, it will add the listener\n */\n _toggleEventListeners = (add?: boolean) => {\n const action = add ? addListener : removeListener;\n const { element, triggers, dismiss, options, hide } = this;\n\n // istanbul ignore else @preserve\n if (dismiss) {\n action(dismiss, mouseclickEvent, hide);\n }\n\n // istanbul ignore else @preserve\n if (options.autohide) {\n [focusinEvent, focusoutEvent, mouseenterEvent, mouseleaveEvent].forEach(\n (e) => action(element, e, interactiveToastHandler),\n );\n }\n // istanbul ignore else @preserve\n if (triggers.length) {\n triggers.forEach((btn) => {\n action(btn, mouseclickEvent, toastClickHandler);\n });\n }\n };\n\n /** Removes the `Toast` component from the target element. */\n dispose() {\n const { element, isShown } = this;\n this._toggleEventListeners();\n Timer.clear(element, toastString);\n\n if (isShown) removeClass(element, showClass);\n\n super.dispose();\n }\n}\n"],"names":["toastString","toastComponent","toastSelector","toastDismissSelector","dataBsDismiss","toastToggleSelector","dataBsToggle","showingClass","hideClass","toastDefaults","getToastInstance","element","getInstance","toastInitCallback","Toast","showToastEvent","createCustomEvent","shownToastEvent","hideToastEvent","hiddenToastEvent","showToastComplete","self","options","removeClass","Timer","dispatchEvent","hideToastComplete","showClass","addClass","hideToast","reflow","emulateTransitionEnd","showToast","toastClickHandler","e","getTargetElement","isDisabled","interactiveToastHandler","type","relatedTarget","mouseenterEvent","focusinEvent","BaseComponent","target","config","hasClass","fadeClass","querySelector","querySelectorAll","getDocument","btn","isShown","add","action","addListener","removeListener","triggers","dismiss","hide","mouseclickEvent","focusoutEvent","mouseleaveEvent"],"mappings":"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"}
|