{"version":3,"file":"scrollspy.min.js","sources":["https:\/\/edu.betha.com.br\/theme\/smart\/amd\/src\/bootstrap\/scrollspy.js"],"sourcesContent":["\/**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap (v4.6.2): scrollspy.js\r\n * Licensed under MIT (https:\/\/github.com\/twbs\/bootstrap\/blob\/main\/LICENSE)\r\n * --------------------------------------------------------------------------\r\n *\/\r\n\r\nimport $ from 'jquery'\r\nimport Util from '.\/util'\r\n\r\n\/**\r\n * Constants\r\n *\/\r\n\r\nconst NAME = 'scrollspy'\r\nconst VERSION = '4.6.2'\r\nconst DATA_KEY = 'bs.scrollspy'\r\nconst EVENT_KEY = `.${DATA_KEY}`\r\nconst DATA_API_KEY = '.data-api'\r\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\r\n\r\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\r\nconst CLASS_NAME_ACTIVE = 'active'\r\n\r\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\r\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\r\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\r\n\r\nconst METHOD_OFFSET = 'offset'\r\nconst METHOD_POSITION = 'position'\r\n\r\nconst SELECTOR_DATA_SPY = '[data-spy=\"scroll\"]'\r\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\r\nconst SELECTOR_NAV_LINKS = '.nav-link'\r\nconst SELECTOR_NAV_ITEMS = '.nav-item'\r\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\r\nconst SELECTOR_DROPDOWN = '.dropdown'\r\nconst SELECTOR_DROPDOWN_ITEMS = '.dropdown-item'\r\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\r\n\r\nconst Default = {\r\n offset: 10,\r\n method: 'auto',\r\n target: ''\r\n}\r\n\r\nconst DefaultType = {\r\n offset: 'number',\r\n method: 'string',\r\n target: '(string|element)'\r\n}\r\n\r\n\/**\r\n * Class definition\r\n *\/\r\n\r\nclass ScrollSpy {\r\n constructor(element, config) {\r\n this._element = element\r\n this._scrollElement = element.tagName === 'BODY' ? window : element\r\n this._config = this._getConfig(config)\r\n this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS},` +\r\n `${this._config.target} ${SELECTOR_LIST_ITEMS},` +\r\n `${this._config.target} ${SELECTOR_DROPDOWN_ITEMS}`\r\n this._offsets = []\r\n this._targets = []\r\n this._activeTarget = null\r\n this._scrollHeight = 0\r\n\r\n $(this._scrollElement).on(EVENT_SCROLL, event => this._process(event))\r\n\r\n this.refresh()\r\n this._process()\r\n }\r\n\r\n \/\/ Getters\r\n static get VERSION() {\r\n return VERSION\r\n }\r\n\r\n static get Default() {\r\n return Default\r\n }\r\n\r\n \/\/ Public\r\n refresh() {\r\n const autoMethod = this._scrollElement === this._scrollElement.window ?\r\n METHOD_OFFSET : METHOD_POSITION\r\n\r\n const offsetMethod = this._config.method === 'auto' ?\r\n autoMethod : this._config.method\r\n\r\n const offsetBase = offsetMethod === METHOD_POSITION ?\r\n this._getScrollTop() : 0\r\n\r\n this._offsets = []\r\n this._targets = []\r\n\r\n this._scrollHeight = this._getScrollHeight()\r\n\r\n const targets = [].slice.call(document.querySelectorAll(this._selector))\r\n\r\n targets\r\n .map(element => {\r\n let target\r\n const targetSelector = Util.getSelectorFromElement(element)\r\n\r\n if (targetSelector) {\r\n target = document.querySelector(targetSelector)\r\n }\r\n\r\n if (target) {\r\n const targetBCR = target.getBoundingClientRect()\r\n if (targetBCR.width || targetBCR.height) {\r\n \/\/ TODO (fat): remove sketch reliance on jQuery position\/offset\r\n return [\r\n $(target)[offsetMethod]().top + offsetBase,\r\n targetSelector\r\n ]\r\n }\r\n }\r\n\r\n return null\r\n })\r\n .filter(Boolean)\r\n .sort((a, b) => a[0] - b[0])\r\n .forEach(item => {\r\n this._offsets.push(item[0])\r\n this._targets.push(item[1])\r\n })\r\n }\r\n\r\n dispose() {\r\n $.removeData(this._element, DATA_KEY)\r\n $(this._scrollElement).off(EVENT_KEY)\r\n\r\n this._element = null\r\n this._scrollElement = null\r\n this._config = null\r\n this._selector = null\r\n this._offsets = null\r\n this._targets = null\r\n this._activeTarget = null\r\n this._scrollHeight = null\r\n }\r\n\r\n \/\/ Private\r\n _getConfig(config) {\r\n config = {\r\n ...Default,\r\n ...(typeof config === 'object' && config ? config : {})\r\n }\r\n\r\n if (typeof config.target !== 'string' && Util.isElement(config.target)) {\r\n let id = $(config.target).attr('id')\r\n if (!id) {\r\n id = Util.getUID(NAME)\r\n $(config.target).attr('id', id)\r\n }\r\n\r\n config.target = `#${id}`\r\n }\r\n\r\n Util.typeCheckConfig(NAME, config, DefaultType)\r\n\r\n return config\r\n }\r\n\r\n _getScrollTop() {\r\n return this._scrollElement === window ?\r\n this._scrollElement.pageYOffset : this._scrollElement.scrollTop\r\n }\r\n\r\n _getScrollHeight() {\r\n return this._scrollElement.scrollHeight || Math.max(\r\n document.body.scrollHeight,\r\n document.documentElement.scrollHeight\r\n )\r\n }\r\n\r\n _getOffsetHeight() {\r\n return this._scrollElement === window ?\r\n window.innerHeight : this._scrollElement.getBoundingClientRect().height\r\n }\r\n\r\n _process() {\r\n const scrollTop = this._getScrollTop() + this._config.offset\r\n const scrollHeight = this._getScrollHeight()\r\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\r\n\r\n if (this._scrollHeight !== scrollHeight) {\r\n this.refresh()\r\n }\r\n\r\n if (scrollTop >= maxScroll) {\r\n const target = this._targets[this._targets.length - 1]\r\n\r\n if (this._activeTarget !== target) {\r\n this._activate(target)\r\n }\r\n\r\n return\r\n }\r\n\r\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\r\n this._activeTarget = null\r\n this._clear()\r\n return\r\n }\r\n\r\n for (let i = this._offsets.length; i--;) {\r\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\r\n scrollTop >= this._offsets[i] &&\r\n (typeof this._offsets[i + 1] === 'undefined' ||\r\n scrollTop < this._offsets[i + 1])\r\n\r\n if (isActiveTarget) {\r\n this._activate(this._targets[i])\r\n }\r\n }\r\n }\r\n\r\n _activate(target) {\r\n this._activeTarget = target\r\n\r\n this._clear()\r\n\r\n const queries = this._selector\r\n .split(',')\r\n .map(selector => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\r\n\r\n const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\r\n\r\n if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) {\r\n $link.closest(SELECTOR_DROPDOWN)\r\n .find(SELECTOR_DROPDOWN_TOGGLE)\r\n .addClass(CLASS_NAME_ACTIVE)\r\n $link.addClass(CLASS_NAME_ACTIVE)\r\n } else {\r\n \/\/ Set triggered link as active\r\n $link.addClass(CLASS_NAME_ACTIVE)\r\n \/\/ Set triggered links parents as active\r\n \/\/ With both