Files

1 line
22 KiB
Plaintext

{"version":3,"file":"tab.mjs","names":["pkg.version"],"sources":["../../../src/strings/collapsingClass.ts","../../../src/strings/activeClass.ts","../../../src/strings/fadeClass.ts","../../../src/strings/showClass.ts","../../../src/strings/dropdownClasses.ts","../../../src/strings/dataBsToggle.ts","../../../src/strings/dataBsTarget.ts","../../../src/strings/dataBsParent.ts","../../../src/strings/dataBsContainer.ts","../../../src/util/getTargetElement.ts","../../../package.json","../../../src/version.ts","../../../src/components/base-component.ts","../../../src/components/tab.ts"],"sourcesContent":["/**\n * Global namespace for most components `collapsing` class.\n * As used by `Collapse` / `Tab`.\n */\nconst collapsingClass = \"collapsing\";\nexport default collapsingClass;\n","/**\n * Global namespace for most components active class.\n */\nconst activeClass = \"active\";\nexport default activeClass;\n","/**\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 `Dropdown` types / classes.\n */\nconst dropdownMenuClasses = [\"dropdown\", \"dropup\", \"dropstart\", \"dropend\"];\nexport default dropdownMenuClasses;\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 `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 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 | Tab\n------------------------------------------ */\nimport {\n addClass,\n ariaSelected,\n closest,\n createCustomEvent,\n dispatchEvent,\n emulateTransitionEnd,\n getElementsByClassName,\n getInstance,\n hasClass,\n isHTMLElement,\n mouseclickEvent,\n MouseEvent,\n querySelector,\n reflow,\n removeClass,\n setAttribute,\n Timer,\n} from \"@thednp/shorty\";\n\nimport { addListener, removeListener } from \"@thednp/event-listener\";\n\nimport collapsingClass from \"~/strings/collapsingClass\";\nimport activeClass from \"~/strings/activeClass\";\nimport fadeClass from \"~/strings/fadeClass\";\nimport showClass from \"~/strings/showClass\";\nimport dropdownClasses from \"~/strings/dropdownClasses\";\nimport dataBsToggle from \"~/strings/dataBsToggle\";\nimport tabString from \"~/strings/tabString\";\nimport tabComponent from \"~/strings/tabComponent\";\nimport getTargetElement from \"~/util/getTargetElement\";\nimport BaseComponent from \"./base-component\";\nimport type { /* TabOptions, */ TabEvent } from \"~/interface/tab\";\n\n// TAB PRIVATE GC\n// ================\nconst tabSelector = `[${dataBsToggle}=\"${tabString}\"]`;\n\n/**\n * Static method which returns an existing `Tab` instance associated\n * to a target `Element`.\n */\nconst getTabInstance = (element: Element) =>\n getInstance<Tab>(element, tabComponent);\n\n/** A `Tab` initialization callback. */\nconst tabInitCallback = (element: Element) => new Tab(element);\n\ntype TabEventProps = {\n relatedTarget: Element & EventTarget | undefined;\n};\n\n// TAB CUSTOM EVENTS\n// =================\nconst showTabEvent = createCustomEvent<TabEventProps, TabEvent>(\n `show.bs.${tabString}`,\n);\nconst shownTabEvent = createCustomEvent<TabEventProps, TabEvent>(\n `shown.bs.${tabString}`,\n);\nconst hideTabEvent = createCustomEvent<TabEventProps, TabEvent>(\n `hide.bs.${tabString}`,\n);\nconst hiddenTabEvent = createCustomEvent<TabEventProps, TabEvent>(\n `hidden.bs.${tabString}`,\n);\n\ninterface TabPrivate {\n tab: HTMLElement | null;\n content: HTMLElement | null;\n currentHeight: number;\n nextHeight: number;\n}\n\n/**\n * Stores the current active tab and its content\n * for a given `.nav` element.\n */\nconst tabPrivate: Map<HTMLElement, TabPrivate> = new Map();\n\n// TAB PRIVATE METHODS\n// ===================\n/**\n * Executes after tab transition has finished.\n *\n * @param self the `Tab` instance\n */\nconst triggerTabEnd = (self: Tab) => {\n const { tabContent, nav } = self;\n\n // istanbul ignore else @preserve\n if (tabContent && hasClass(tabContent, collapsingClass)) {\n tabContent.style.height = \"\";\n removeClass(tabContent, collapsingClass);\n }\n\n // istanbul ignore else @preserve\n if (nav) Timer.clear(nav);\n};\n\n/**\n * Executes before showing the tab content.\n *\n * @param self the `Tab` instance\n */\nconst triggerTabShow = (self: Tab) => {\n const { element, tabContent, content: nextContent, nav } = self;\n const { tab } = (isHTMLElement(nav) && tabPrivate.get(nav)) ||\n // istanbul ignore next @preserve\n { tab: null };\n\n // istanbul ignore else @preserve\n if (tabContent && nextContent && hasClass(nextContent, fadeClass)) {\n const { currentHeight, nextHeight } = tabPrivate.get(element) ||\n // istanbul ignore next @preserve\n { currentHeight: 0, nextHeight: 0 };\n // istanbul ignore else @preserve: vitest won't validate this branch\n if (currentHeight !== nextHeight) {\n // enables height animation\n setTimeout(() => {\n tabContent.style.height = `${nextHeight}px`;\n reflow(tabContent);\n emulateTransitionEnd(tabContent, () => triggerTabEnd(self));\n }, 50);\n } else {\n triggerTabEnd(self);\n }\n } else if (nav) Timer.clear(nav);\n\n shownTabEvent.relatedTarget = tab as HTMLElement | undefined;\n\n dispatchEvent(element, shownTabEvent);\n};\n\n/**\n * Executes before hiding the tab.\n *\n * @param self the `Tab` instance\n */\nconst triggerTabHide = (self: Tab) => {\n const { element, content: nextContent, tabContent, nav } = self;\n const { tab, content } = (nav && tabPrivate.get(nav)) ||\n // istanbul ignore next @preserve\n { tab: null, content: null };\n let currentHeight = 0;\n\n // istanbul ignore else @preserve\n if (tabContent && nextContent && hasClass(nextContent, fadeClass)) {\n [content, nextContent].forEach((c) => {\n // istanbul ignore else @preserve\n if (c) addClass(c, \"overflow-hidden\");\n });\n // istanbul ignore next @preserve\n currentHeight = content ? content.scrollHeight : 0;\n }\n\n // update relatedTarget and dispatch event\n showTabEvent.relatedTarget = tab as HTMLElement | undefined;\n hiddenTabEvent.relatedTarget = element as HTMLElement;\n dispatchEvent(element, showTabEvent);\n\n // istanbul ignore if @preserve\n if (showTabEvent.defaultPrevented) return;\n // istanbul ignore else @preserve\n if (nextContent) addClass(nextContent, activeClass);\n // istanbul ignore else @preserve\n if (content) removeClass(content, activeClass);\n\n // istanbul ignore else @preserve\n if (tabContent && nextContent && hasClass(nextContent, fadeClass)) {\n const nextHeight = nextContent.scrollHeight;\n tabPrivate.set(element, {\n currentHeight,\n nextHeight,\n tab: null,\n content: null,\n });\n\n addClass(tabContent, collapsingClass);\n tabContent.style.height = `${currentHeight}px`;\n reflow(tabContent);\n [content, nextContent].forEach((c) => {\n // istanbul ignore else @preserve\n if (c) removeClass(c, \"overflow-hidden\");\n });\n }\n\n if (nextContent && nextContent && hasClass(nextContent, fadeClass)) {\n setTimeout(() => {\n addClass(nextContent, showClass);\n emulateTransitionEnd(nextContent, () => {\n triggerTabShow(self);\n });\n }, 1);\n } else {\n // istanbul ignore else @preserve\n if (nextContent) addClass(nextContent, showClass);\n triggerTabShow(self);\n }\n\n // istanbul ignore else @preserve\n if (tab) dispatchEvent(tab, hiddenTabEvent);\n};\n\n/**\n * Returns the current active tab and its target content.\n *\n * @param self the `Tab` instance\n * @returns the query result\n */\nconst getActiveTab = (\n self: Tab,\n): { tab: HTMLElement | null; content: HTMLElement | null } => {\n const { nav } = self;\n // istanbul ignore next @preserve\n if (!isHTMLElement(nav)) {\n return { tab: null, content: null };\n }\n\n const activeTabs = getElementsByClassName<HTMLElement>(\n activeClass,\n nav,\n );\n let tab: HTMLElement | null = null;\n // istanbul ignore else @preserve\n if (\n activeTabs.length === 1 &&\n !dropdownClasses.some((c) =>\n hasClass(activeTabs[0].parentElement as HTMLElement, c)\n )\n ) {\n [tab] = activeTabs;\n } else if (activeTabs.length > 1) {\n tab = activeTabs[activeTabs.length - 1];\n }\n const content = isHTMLElement(tab) ? getTargetElement(tab) : null;\n return { tab, content };\n};\n\n/**\n * Returns a parent dropdown.\n *\n * @param element the `Tab` element\n * @returns the parent dropdown\n */\nconst getParentDropdown = (element?: HTMLElement) => {\n // istanbul ignore next @preserve\n if (!isHTMLElement(element)) return null;\n const dropdown = closest(element, `.${dropdownClasses.join(\",.\")}`);\n return dropdown\n ? querySelector<HTMLElement>(`.${dropdownClasses[0]}-toggle`, dropdown)\n : null;\n};\n\n// TAB EVENT HANDLER\n// =================\n/**\n * Handles the `click` event listener.\n *\n * @param e the `Event` object\n */\nconst tabClickHandler = (e: MouseEvent<Element>) => {\n const element = closest(e.target, tabSelector);\n const self = element && getTabInstance(element);\n\n // istanbul ignore if @preserve\n if (!self) return;\n e.preventDefault();\n self.show();\n};\n\n// TAB DEFINITION\n// ==============\n/** Creates a new `Tab` instance. */\nexport default class Tab extends BaseComponent {\n static selector = tabSelector;\n static init = tabInitCallback;\n static getInstance = getTabInstance;\n declare element: HTMLElement;\n declare nav: HTMLElement | null;\n declare content: HTMLElement | null;\n declare tabContent: HTMLElement | null;\n declare nextContent: HTMLElement | null;\n declare dropdown: HTMLElement | null;\n\n /** @param target the target element */\n constructor(target: Element | string) {\n super(target);\n\n // initialization element\n const { element } = this;\n const content = getTargetElement(element);\n\n // no point initializing a tab without a corresponding content\n // istanbul ignore else @preserve\n if (!content) return;\n\n const nav = closest<HTMLElement>(element, \".nav\");\n const container = closest<HTMLElement>(\n content as HTMLElement,\n \".tab-content\",\n );\n\n this.nav = nav;\n this.content = content;\n this.tabContent = container;\n\n // event targets\n this.dropdown = getParentDropdown(element);\n\n // show first Tab instance of none is shown\n // suggested on #432\n const { tab } = getActiveTab(this);\n if (nav && !tab) {\n const firstTab = querySelector(tabSelector, nav);\n const firstTabContent = firstTab && getTargetElement(firstTab);\n\n // istanbul ignore else @preserve\n if (firstTabContent) {\n addClass(firstTab, activeClass);\n addClass(firstTabContent, showClass);\n addClass(firstTabContent, activeClass);\n setAttribute(element, ariaSelected, \"true\");\n }\n }\n\n // add event listener\n this._toggleEventListeners(true);\n }\n\n /**\n * Returns component name string.\n */\n get name() {\n return tabComponent;\n }\n\n // TAB PUBLIC METHODS\n // ==================\n /** Shows the tab to the user. */\n show() {\n const { element, content: nextContent, nav, dropdown } = this;\n\n // istanbul ignore else @preserve\n if ((nav && Timer.get(nav)) || hasClass(element, activeClass)) return;\n const { tab, content } = getActiveTab(this);\n\n // istanbul ignore else @preserve\n if (nav && tab) {\n tabPrivate.set(nav, { tab, content, currentHeight: 0, nextHeight: 0 });\n }\n\n // update relatedTarget and dispatch\n hideTabEvent.relatedTarget = element as HTMLElement;\n\n // istanbul ignore if @preserve\n if (!isHTMLElement(tab)) return;\n\n dispatchEvent(tab, hideTabEvent);\n\n // istanbul ignore else @preserve\n if (hideTabEvent.defaultPrevented) return;\n\n addClass(element, activeClass);\n setAttribute(element, ariaSelected, \"true\");\n\n const activeDropdown = isHTMLElement(tab) && getParentDropdown(tab);\n if (activeDropdown && hasClass(activeDropdown, activeClass)) {\n removeClass(activeDropdown, activeClass);\n }\n\n // istanbul ignore else @preserve\n if (nav) {\n const toggleTab = () => {\n // istanbul ignore else @preserve\n if (tab) {\n removeClass(tab, activeClass);\n setAttribute(tab, ariaSelected, \"false\");\n }\n if (dropdown && !hasClass(dropdown, activeClass)) {\n addClass(dropdown, activeClass);\n }\n };\n\n if (\n content &&\n (hasClass(content, fadeClass) ||\n (nextContent && hasClass(nextContent, fadeClass)))\n ) {\n Timer.set(nav, toggleTab, 1);\n } else toggleTab();\n }\n\n // istanbul ignore else @preserve\n if (content) {\n removeClass(content, showClass);\n if (hasClass(content, fadeClass)) {\n emulateTransitionEnd(content, () => triggerTabHide(this));\n } else {\n triggerTabHide(this);\n }\n }\n }\n\n /**\n * Toggles on/off the `click` event listener.\n *\n * @param add when `true`, event listener is added\n */\n _toggleEventListeners = (add?: boolean) => {\n const action = add ? addListener : removeListener;\n action(this.element, mouseclickEvent, tabClickHandler);\n };\n\n /** Removes the `Tab` component from the target element. */\n dispose() {\n this._toggleEventListeners();\n super.dispose();\n }\n}\n"],"mappings":"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"}