Files

1 line
18 KiB
Plaintext

{"version":3,"file":"toast.mjs","names":["pkg.version"],"sources":["../../../src/strings/fadeClass.ts","../../../src/strings/showClass.ts","../../../src/strings/dataBsDismiss.ts","../../../src/strings/dataBsToggle.ts","../../../src/strings/toastString.ts","../../../src/strings/toastComponent.ts","../../../src/strings/dataBsTarget.ts","../../../src/strings/dataBsParent.ts","../../../src/strings/dataBsContainer.ts","../../../src/util/getTargetElement.ts","../../../src/util/isDisabled.ts","../../../package.json","../../../src/version.ts","../../../src/components/base-component.ts","../../../src/components/toast.ts"],"sourcesContent":["/**\n * Global namespace for most components `fade` class.\n */\nconst fadeClass = \"fade\";\nexport default fadeClass;\n","/**\n * Global namespace for most components `show` class.\n */\nconst showClass = \"show\";\nexport default showClass;\n","/**\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","/** @type {string} */\nconst toastString = \"toast\";\nexport default toastString;\n","/** @type {string} */\nconst toastComponent = \"Toast\";\nexport default toastComponent;\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 { 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 | 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"],"mappings":"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"}