toast.mjs.map 13 KB

1
  1. {"version":3,"file":"toast.mjs","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","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","e"],"mappings":"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"}