collapse.mjs.map 13 KB

1
  1. {"version":3,"file":"collapse.mjs","sources":["../../src/strings/collapseString.ts","../../src/strings/collapseComponent.ts","../../src/components/collapse.ts"],"sourcesContent":["/** @type {string} */\nconst collapseString = \"collapse\";\nexport default collapseString;\n","/** @type {string} */\nconst collapseComponent = \"Collapse\";\nexport default collapseComponent;\n","/* Native JavaScript for Bootstrap 5 | Collapse\n----------------------------------------------- */\nimport {\n addClass,\n ariaExpanded,\n closest,\n createCustomEvent,\n dispatchEvent,\n emulateTransitionEnd,\n getDocument,\n getInstance,\n hasClass,\n isHTMLElement,\n isString,\n mouseclickEvent,\n MouseEvent,\n noop,\n querySelector,\n querySelectorAll,\n reflow,\n removeClass,\n setAttribute,\n setElementStyle,\n Timer,\n} from \"@thednp/shorty\";\n\nimport { addListener, removeListener } from \"@thednp/event-listener\";\n\nimport dataBsToggle from \"~/strings/dataBsToggle\";\nimport collapsingClass from \"~/strings/collapsingClass\";\nimport showClass from \"~/strings/showClass\";\nimport collapseString from \"~/strings/collapseString\";\nimport collapseComponent from \"~/strings/collapseComponent\";\nimport getTargetElement from \"~/util/getTargetElement\";\nimport BaseComponent from \"./base-component\";\nimport type { CollapseEvent, CollapseOptions } from \"~/interface/collapse\";\nimport isDisabled from \"~/util/isDisabled\";\n\n// COLLAPSE GC\n// ===========\nconst collapseSelector = `.${collapseString}`;\nconst collapseToggleSelector = `[${dataBsToggle}=\"${collapseString}\"]`;\nconst collapseDefaults = { parent: null };\n\n/**\n * Static method which returns an existing `Collapse` instance associated\n * to a target `Element`.\n */\nconst getCollapseInstance = (element: Element) =>\n getInstance<Collapse>(element, collapseComponent);\n\n/**\n * A `Collapse` initialization callback.\n */\nconst collapseInitCallback = (element: Element) => new Collapse(element);\n\n// COLLAPSE CUSTOM EVENTS\n// ======================\nconst showCollapseEvent = createCustomEvent<\n Record<string, never>,\n CollapseEvent\n>(`show.bs.${collapseString}`);\nconst shownCollapseEvent = createCustomEvent<\n Record<string, never>,\n CollapseEvent\n>(`shown.bs.${collapseString}`);\nconst hideCollapseEvent = createCustomEvent<\n Record<string, never>,\n CollapseEvent\n>(`hide.bs.${collapseString}`);\nconst hiddenCollapseEvent = createCustomEvent<\n Record<string, never>,\n CollapseEvent\n>(`hidden.bs.${collapseString}`);\n\n// COLLAPSE PRIVATE METHODS\n// ========================\n/**\n * Expand the designated `Element`.\n *\n * @param self the `Collapse` instance\n */\nconst expandCollapse = (self: Collapse) => {\n const { element, parent, triggers } = self;\n\n dispatchEvent(element, showCollapseEvent);\n if (!showCollapseEvent.defaultPrevented) {\n Timer.set(element, noop, 17);\n if (parent) Timer.set(parent, noop, 17);\n\n addClass(element, collapsingClass);\n removeClass(element, collapseString);\n\n setElementStyle(element, { height: `${element.scrollHeight}px` });\n\n emulateTransitionEnd(element, () => {\n Timer.clear(element);\n if (parent) Timer.clear(parent);\n\n triggers.forEach((btn) => setAttribute(btn, ariaExpanded, \"true\"));\n\n removeClass(element, collapsingClass);\n addClass(element, collapseString);\n addClass(element, showClass);\n\n setElementStyle(element, { height: \"\" });\n\n dispatchEvent(element, shownCollapseEvent);\n });\n }\n};\n\n/**\n * Collapse the designated `Element`.\n *\n * @param self the `Collapse` instance\n */\nconst collapseContent = (self: Collapse) => {\n const { element, parent, triggers } = self;\n\n dispatchEvent(element, hideCollapseEvent);\n\n if (!hideCollapseEvent.defaultPrevented) {\n Timer.set(element, noop, 17);\n if (parent) Timer.set(parent, noop, 17);\n\n setElementStyle(element, { height: `${element.scrollHeight}px` });\n\n removeClass(element, collapseString);\n removeClass(element, showClass);\n addClass(element, collapsingClass);\n\n reflow(element as HTMLElement);\n setElementStyle(element, { height: \"0px\" });\n\n emulateTransitionEnd(element, () => {\n Timer.clear(element);\n // istanbul ignore else @preserve\n if (parent) Timer.clear(parent);\n\n triggers.forEach((btn) => setAttribute(btn, ariaExpanded, \"false\"));\n\n removeClass(element, collapsingClass);\n addClass(element, collapseString);\n\n setElementStyle(element, { height: \"\" });\n\n dispatchEvent(element, hiddenCollapseEvent);\n });\n }\n};\n\n// COLLAPSE EVENT HANDLER\n// ======================\n/**\n * Handles the `click` event for the `Collapse` instance.\n *\n * @param e the `Event` object\n */\nconst collapseClickHandler = (e: MouseEvent<HTMLElement>) => {\n const { target } = e; // our target is `HTMLElement`\n const trigger = target &&\n closest(target, collapseToggleSelector);\n const element = trigger && getTargetElement(trigger);\n const self = element && getCollapseInstance(element);\n\n // istanbul ignore if @preserve\n if (trigger && isDisabled(trigger)) return;\n // istanbul ignore if @preserve\n if (!self) return;\n\n self.toggle();\n // event target is anchor link #398\n if (trigger?.tagName === \"A\") e.preventDefault();\n};\n\n// COLLAPSE DEFINITION\n// ===================\n\n/** Returns a new `Colapse` instance. */\nexport default class Collapse extends BaseComponent {\n static selector = collapseSelector;\n static init = collapseInitCallback;\n static getInstance = getCollapseInstance;\n declare element: HTMLElement;\n declare options: CollapseOptions;\n declare parent: Element | null;\n declare triggers: Element[];\n\n /**\n * @param target and `Element` that matches the selector\n * @param config instance options\n */\n constructor(target: Element | string, config?: Partial<CollapseOptions>) {\n super(target, config);\n\n // initialization element\n const { element, options } = this;\n const doc = getDocument(element);\n\n // set triggering elements\n this.triggers = [...querySelectorAll(collapseToggleSelector, doc)].filter(\n (btn) => getTargetElement(btn) === element,\n );\n\n // set parent accordion\n this.parent = isHTMLElement(options.parent)\n ? options.parent\n : isString(options.parent)\n ? getTargetElement(element) || querySelector(options.parent, doc)\n : null;\n\n // add event listeners\n this._toggleEventListeners(true);\n }\n\n /**\n * Returns component name string.\n */\n get name() {\n return collapseComponent;\n }\n /**\n * Returns component default options.\n */\n get defaults() {\n return collapseDefaults;\n }\n\n // COLLAPSE PUBLIC METHODS\n // =======================\n /** Hides the collapse. */\n hide() {\n const { triggers, element } = this;\n // istanbul ignore else @preserve\n if (!Timer.get(element)) {\n collapseContent(this);\n // istanbul ignore else @preserve\n if (triggers.length) {\n triggers.forEach((btn) => addClass(btn, `${collapseString}d`));\n }\n }\n }\n\n /** Shows the collapse. */\n show() {\n const { element, parent, triggers } = this;\n let activeCollapse;\n let activeCollapseInstance;\n\n if (parent) {\n activeCollapse = [\n ...querySelectorAll(`.${collapseString}.${showClass}`, parent),\n ].find((i) => getCollapseInstance(i));\n activeCollapseInstance = activeCollapse &&\n getCollapseInstance(activeCollapse);\n }\n\n if ((!parent || !Timer.get(parent)) && !Timer.get(element)) {\n if (activeCollapseInstance && activeCollapse !== element) {\n collapseContent(activeCollapseInstance);\n activeCollapseInstance.triggers.forEach((btn) => {\n addClass(btn, `${collapseString}d`);\n });\n }\n\n expandCollapse(this);\n // istanbul ignore else @preserve\n if (triggers.length) {\n triggers.forEach((btn) => removeClass(btn, `${collapseString}d`));\n }\n }\n }\n\n /** Toggles the visibility of the collapse. */\n toggle() {\n if (!hasClass(this.element, showClass)) this.show();\n else this.hide();\n }\n\n /**\n * Toggles on/off the event listener(s) of the `Collapse` instance.\n *\n * @param add when `true`, the event listener is added\n */\n _toggleEventListeners = (add?: boolean) => {\n const action = add ? addListener : removeListener;\n const { triggers } = this;\n\n // istanbul ignore else @preserve\n if (triggers.length) {\n triggers.forEach((btn) => {\n action(btn, mouseclickEvent, collapseClickHandler);\n });\n }\n };\n\n /** Remove the `Collapse` component from the target `Element`. */\n dispose() {\n this._toggleEventListeners();\n\n super.dispose();\n }\n}\n"],"names":["collapseString","collapseComponent","collapseSelector","collapseToggleSelector","dataBsToggle","collapseDefaults","getCollapseInstance","element","getInstance","collapseInitCallback","Collapse","showCollapseEvent","createCustomEvent","shownCollapseEvent","hideCollapseEvent","hiddenCollapseEvent","expandCollapse","self","parent","triggers","dispatchEvent","Timer","noop","addClass","collapsingClass","removeClass","setElementStyle","emulateTransitionEnd","btn","setAttribute","ariaExpanded","showClass","collapseContent","reflow","collapseClickHandler","e","target","trigger","closest","getTargetElement","isDisabled","BaseComponent","config","options","doc","getDocument","querySelectorAll","isHTMLElement","isString","querySelector","activeCollapse","activeCollapseInstance","i","hasClass","add","action","addListener","removeListener","mouseclickEvent"],"mappings":"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"}