mirror of
https://github.com/twbs/bootstrap.git
synced 2024-12-01 13:24:25 +01:00
1 line
19 KiB
Plaintext
1 line
19 KiB
Plaintext
{"version":3,"sources":["../src/scrollspy.js"],"names":["ScrollSpy","$","NAME","VERSION","DATA_KEY","EVENT_KEY","DATA_API_KEY","JQUERY_NO_CONFLICT","fn","Default","offset","method","target","DefaultType","Event","ACTIVATE","SCROLL","LOAD_DATA_API","ClassName","DROPDOWN_ITEM","DROPDOWN_MENU","ACTIVE","Selector","DATA_SPY","NAV_LIST_GROUP","NAV_LINKS","NAV_ITEMS","LIST_ITEMS","DROPDOWN","DROPDOWN_ITEMS","DROPDOWN_TOGGLE","OffsetMethod","OFFSET","POSITION","element","config","_element","_scrollElement","tagName","window","_config","_getConfig","_selector","_offsets","_targets","_activeTarget","_scrollHeight","on","event","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targets","slice","call","document","querySelectorAll","map","targetSelector","Util","getSelectorFromElement","querySelector","targetBCR","getBoundingClientRect","width","height","top","filter","item","sort","a","b","forEach","push","dispose","removeData","off","id","attr","getUID","typeCheckConfig","pageYOffset","scrollTop","scrollHeight","Math","max","body","documentElement","_getOffsetHeight","innerHeight","maxScroll","length","_activate","_clear","offsetLength","i","isActiveTarget","queries","split","selector","$link","join","hasClass","closest","find","addClass","parents","prev","children","trigger","relatedTarget","nodes","removeClass","_jQueryInterface","each","data","TypeError","scrollSpys","scrollSpysLength","$spy","Constructor","noConflict"],"mappings":"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","sourcesContent":["import $ from 'jquery'\nimport Util from './util'\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.1): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst ScrollSpy = (($) => {\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\n const NAME = 'scrollspy'\n const VERSION = '4.1.1'\n const DATA_KEY = 'bs.scrollspy'\n const EVENT_KEY = `.${DATA_KEY}`\n const DATA_API_KEY = '.data-api'\n const JQUERY_NO_CONFLICT = $.fn[NAME]\n\n const Default = {\n offset : 10,\n method : 'auto',\n target : ''\n }\n\n const DefaultType = {\n offset : 'number',\n method : 'string',\n target : '(string|element)'\n }\n\n const Event = {\n ACTIVATE : `activate${EVENT_KEY}`,\n SCROLL : `scroll${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n }\n\n const ClassName = {\n DROPDOWN_ITEM : 'dropdown-item',\n DROPDOWN_MENU : 'dropdown-menu',\n ACTIVE : 'active'\n }\n\n const Selector = {\n DATA_SPY : '[data-spy=\"scroll\"]',\n ACTIVE : '.active',\n NAV_LIST_GROUP : '.nav, .list-group',\n NAV_LINKS : '.nav-link',\n NAV_ITEMS : '.nav-item',\n LIST_ITEMS : '.list-group-item',\n DROPDOWN : '.dropdown',\n DROPDOWN_ITEMS : '.dropdown-item',\n DROPDOWN_TOGGLE : '.dropdown-toggle'\n }\n\n const OffsetMethod = {\n OFFSET : 'offset',\n POSITION : 'position'\n }\n\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\n class ScrollSpy {\n constructor(element, config) {\n this._element = element\n this._scrollElement = element.tagName === 'BODY' ? window : element\n this._config = this._getConfig(config)\n this._selector = `${this._config.target} ${Selector.NAV_LINKS},` +\n `${this._config.target} ${Selector.LIST_ITEMS},` +\n `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window\n ? OffsetMethod.OFFSET : OffsetMethod.POSITION\n\n const offsetMethod = this._config.method === 'auto'\n ? autoMethod : this._config.method\n\n const offsetBase = offsetMethod === OffsetMethod.POSITION\n ? this._getScrollTop() : 0\n\n this._offsets = []\n this._targets = []\n\n this._scrollHeight = this._getScrollHeight()\n\n const targets = [].slice.call(document.querySelectorAll(this._selector))\n\n targets\n .map((element) => {\n let target\n const targetSelector = Util.getSelectorFromElement(element)\n\n if (targetSelector) {\n target = document.querySelector(targetSelector)\n }\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [\n $(target)[offsetMethod]().top + offsetBase,\n 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 $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n this._config = null\n this._selector = null\n this._offsets = null\n this._targets = null\n this._activeTarget = null\n this._scrollHeight = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.target !== 'string') {\n let id = $(config.target).attr('id')\n if (!id) {\n id = Util.getUID(NAME)\n $(config.target).attr('id', id)\n }\n config.target = `#${id}`\n }\n\n Util.typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window\n ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window\n ? window.innerHeight : 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 +\n scrollHeight -\n 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 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 const offsetLength = this._offsets.length\n for (let i = offsetLength; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' ||\n 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 let queries = this._selector.split(',')\n // eslint-disable-next-line arrow-body-style\n queries = queries.map((selector) => {\n return `${selector}[data-target=\"${target}\"],` +\n `${selector}[href=\"${target}\"]`\n })\n\n const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\n $link.addClass(ClassName.ACTIVE)\n } else {\n // Set triggered link as active\n $link.addClass(ClassName.ACTIVE)\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n $link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)\n // Handle special case when .nav-link is inside .nav-item\n $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)\n }\n\n $(this._scrollElement).trigger(Event.ACTIVATE, {\n relatedTarget: target\n })\n }\n\n _clear() {\n const nodes = [].slice.call(document.querySelectorAll(this._selector))\n $(nodes).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE)\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data) {\n data = new ScrollSpy(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n }\n\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n $(window).on(Event.LOAD_DATA_API, () => {\n const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))\n\n const scrollSpysLength = scrollSpys.length\n for (let i = scrollSpysLength; i--;) {\n const $spy = $(scrollSpys[i])\n ScrollSpy._jQueryInterface.call($spy, $spy.data())\n }\n })\n\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $.fn[NAME] = ScrollSpy._jQueryInterface\n $.fn[NAME].Constructor = ScrollSpy\n $.fn[NAME].noConflict = function () {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return ScrollSpy._jQueryInterface\n }\n\n return ScrollSpy\n})($)\n\nexport default ScrollSpy\n"],"file":"scrollspy.js"} |