1 |
- {"version":3,"file":"tab.cjs","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<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 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<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"],"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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"}
|