1 line
17 KiB
Plaintext
1 line
17 KiB
Plaintext
{"version":3,"file":"collapse.mjs","names":["pkg.version"],"sources":["../../../src/strings/dataBsToggle.ts","../../../src/strings/collapsingClass.ts","../../../src/strings/showClass.ts","../../../src/strings/collapseString.ts","../../../src/strings/collapseComponent.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/util/isDisabled.ts","../../../src/components/collapse.ts"],"sourcesContent":["/**\n * Global namespace for most components `toggle` option.\n */\nconst dataBsToggle = \"data-bs-toggle\";\nexport default dataBsToggle;\n","/**\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 `show` class.\n */\nconst showClass = \"show\";\nexport default showClass;\n","/** @type {string} */\nconst collapseString = \"collapse\";\nexport default collapseString;\n","/** @type {string} */\nconst collapseComponent = \"Collapse\";\nexport default collapseComponent;\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","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","/* 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"],"mappings":"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"} |