{"version":3,"file":"tab.mjs","sources":["../../src/strings/tabString.ts","../../src/strings/tabComponent.ts","../../src/components/tab.ts"],"sourcesContent":["/** @type {string} */\nconst tabString = \"tab\";\nexport default tabString;\n","/** @type {string} */\nconst tabComponent = \"Tab\";\nexport default tabComponent;\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(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(\n `show.bs.${tabString}`,\n);\nconst shownTabEvent = createCustomEvent(\n `shown.bs.${tabString}`,\n);\nconst hideTabEvent = createCustomEvent(\n `hide.bs.${tabString}`,\n);\nconst hiddenTabEvent = createCustomEvent(\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 = 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 currentHeight = content\n ? content.scrollHeight\n : /* istanbul ignore next @preserve */ 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(\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(`.${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) => {\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(element, \".nav\");\n const container = closest(\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"],"names":["tabString","tabComponent","tabSelector","dataBsToggle","getTabInstance","element","getInstance","tabInitCallback","Tab","showTabEvent","createCustomEvent","shownTabEvent","hideTabEvent","hiddenTabEvent","tabPrivate","triggerTabEnd","self","tabContent","nav","hasClass","collapsingClass","removeClass","Timer","triggerTabShow","nextContent","tab","isHTMLElement","fadeClass","currentHeight","nextHeight","reflow","emulateTransitionEnd","dispatchEvent","triggerTabHide","content","c","addClass","activeClass","showClass","getActiveTab","activeTabs","getElementsByClassName","dropdownClasses","getTargetElement","getParentDropdown","dropdown","closest","querySelector","tabClickHandler","e","BaseComponent","target","container","firstTab","firstTabContent","setAttribute","ariaSelected","activeDropdown","toggleTab","add","addListener","removeListener","mouseclickEvent"],"mappings":"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"}