{"version":3,"file":"scrollspy-leCX3oDQ.js","sources":["../../../app/frontend/entrypoints/marketing/bootstrap/mdb-prefix/scrollspy.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n typeCheckConfig,\n} from './util/index';\nimport EventHandler from './dom/event-handler';\nimport Manipulator from './dom/manipulator';\nimport SelectorEngine from './dom/selector-engine';\nimport BaseComponent from './base-component';\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy';\nconst DATA_KEY = 'bs.scrollspy';\nconst EVENT_KEY = `.${DATA_KEY}`;\nconst DATA_API_KEY = '.data-api';\n\nconst Default = {\n offset: 10,\n method: 'auto',\n target: '',\n};\n\nconst DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)',\n};\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`;\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`;\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE = 'active';\n\nconst SELECTOR_DATA_SPY = '[data-mdb-spy=\"scroll\"]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\n\nconst METHOD_OFFSET = 'offset';\nconst METHOD_POSITION = 'position';\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element);\n if (!getSelectorFromElement(element)) {\n return;\n }\n this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;\n this._config = this._getConfig(config);\n this._offsets = [];\n this._targets = [];\n this._activeTarget = null;\n this._scrollHeight = 0;\n\n EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process());\n\n this.refresh();\n this._process();\n }\n\n // Getters\n\n static get Default() {\n return Default;\n }\n\n static get NAME() {\n return NAME;\n }\n\n // Public\n\n refresh() {\n const autoMethod =\n this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;\n\n const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n\n const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;\n\n this._offsets = [];\n this._targets = [];\n this._scrollHeight = this._getScrollHeight();\n\n const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target);\n\n targets\n .map((element) => {\n const targetSelector = getSelectorFromElement(element);\n const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null;\n\n if (target) {\n const targetBCR = target.getBoundingClientRect();\n if (targetBCR.width || targetBCR.height) {\n return [Manipulator[offsetMethod](target).top + offsetBase, targetSelector];\n }\n }\n\n return null;\n })\n .filter((item) => item)\n .sort((a, b) => a[0] - b[0])\n .forEach((item) => {\n this._offsets.push(item[0]);\n this._targets.push(item[1]);\n });\n }\n\n dispose() {\n EventHandler.off(this._scrollElement, EVENT_KEY);\n super.dispose();\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {}),\n };\n\n config.target = getElement(config.target) || document.documentElement;\n\n typeCheckConfig(NAME, config, DefaultType);\n\n return config;\n }\n\n _getScrollTop() {\n return this._scrollElement === window\n ? this._scrollElement.pageYOffset\n : this._scrollElement.scrollTop;\n }\n\n _getScrollHeight() {\n return (\n this._scrollElement.scrollHeight ||\n Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)\n );\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window\n ? window.innerHeight\n : this._scrollElement.getBoundingClientRect().height;\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset;\n const scrollHeight = this._getScrollHeight();\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh();\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1];\n\n if (this._activeTarget !== target) {\n this._activate(target);\n }\n\n return;\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null;\n this._clear();\n return;\n }\n\n for (let i = this._offsets.length; i--; ) {\n const isActiveTarget =\n this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n if (isActiveTarget) {\n this._activate(this._targets[i]);\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target;\n\n this._clear();\n\n const queries = SELECTOR_LINK_ITEMS.split(',').map(\n (selector) => `${selector}[data-mdb-target=\"${target}\"],${selector}[href=\"${target}\"]`\n );\n\n const link = SelectorEngine.findOne(queries.join(','), this._config.target);\n\n link.classList.add(CLASS_NAME_ACTIVE);\n if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(\n SELECTOR_DROPDOWN_TOGGLE,\n link.closest(SELECTOR_DROPDOWN)\n ).classList.add(CLASS_NAME_ACTIVE);\n } else {\n SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP).forEach((listGroup) => {\n // Set triggered links parents as active\n // With both