Proyectos de Subversion Moodle

Rev

Rev 1 | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 1 Rev 1441
Línea 1... Línea -...
1
{"version":3,"file":"scrollspy.min.js","sources":["../../src/bootstrap/scrollspy.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\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 METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\nconst SELECTOR_DATA_SPY = '[data-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_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_ITEMS = '.dropdown-item'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\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\n/**\n * Class definition\n */\n\nclass 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  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  // Public\n  refresh() {\n    const autoMethod = this._scrollElement === this._scrollElement.window ?\n      METHOD_OFFSET : METHOD_POSITION\n\n    const offsetMethod = this._config.method === 'auto' ?\n      autoMethod : this._config.method\n\n    const offsetBase = offsetMethod === METHOD_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\n        return null\n      })\n      .filter(Boolean)\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  _getConfig(config) {\n    config = {\n      ...Default,\n      ...(typeof config === 'object' && config ? config : {})\n    }\n\n    if (typeof config.target !== 'string' && Util.isElement(config.target)) {\n      let id = $(config.target).attr('id')\n      if (!id) {\n        id = Util.getUID(NAME)\n        $(config.target).attr('id', id)\n      }\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 + 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 = 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    const queries = this._selector\n      .split(',')\n      .map(selector => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n    const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n    if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) {\n      $link.closest(SELECTOR_DROPDOWN)\n        .find(SELECTOR_DROPDOWN_TOGGLE)\n        .addClass(CLASS_NAME_ACTIVE)\n      $link.addClass(CLASS_NAME_ACTIVE)\n    } else {\n      // Set triggered link as active\n      $link.addClass(CLASS_NAME_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)\n        .prev(`${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`)\n        .addClass(CLASS_NAME_ACTIVE)\n      // Handle special case when .nav-link is inside .nav-item\n      $link.parents(SELECTOR_NAV_LIST_GROUP)\n        .prev(SELECTOR_NAV_ITEMS)\n        .children(SELECTOR_NAV_LINKS)\n        .addClass(CLASS_NAME_ACTIVE)\n    }\n\n    $(this._scrollElement).trigger(EVENT_ACTIVATE, {\n      relatedTarget: target\n    })\n  }\n\n  _clear() {\n    [].slice.call(document.querySelectorAll(this._selector))\n      .filter(node => node.classList.contains(CLASS_NAME_ACTIVE))\n      .forEach(node => node.classList.remove(CLASS_NAME_ACTIVE))\n  }\n\n  // Static\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\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\n$(window).on(EVENT_LOAD_DATA_API, () => {\n  const scrollSpys = [].slice.call(document.querySelectorAll(SELECTOR_DATA_SPY))\n  const scrollSpysLength = scrollSpys.length\n\n  for (let i = scrollSpysLength; i--;) {\n    const $spy = $(scrollSpys[i])\n    ScrollSpy._jQueryInterface.call($spy, $spy.data())\n  }\n})\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = ScrollSpy._jQueryInterface\n$.fn[NAME].Constructor = ScrollSpy\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return ScrollSpy._jQueryInterface\n}\n\nexport default ScrollSpy\n"],"names":["NAME","EVENT_KEY","JQUERY_NO_CONFLICT","$","fn","EVENT_ACTIVATE","EVENT_SCROLL","EVENT_LOAD_DATA_API","Default","offset","method","target","DefaultType","ScrollSpy","constructor","element","config","_element","_scrollElement","tagName","window","_config","this","_getConfig","_selector","_offsets","_targets","_activeTarget","_scrollHeight","on","event","_process","refresh","VERSION","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","slice","call","document","querySelectorAll","map","targetSelector","Util","getSelectorFromElement","querySelector","targetBCR","getBoundingClientRect","width","height","top","filter","Boolean","sort","a","b","forEach","item","push","dispose","removeData","off","isElement","id","attr","getUID","typeCheckConfig","pageYOffset","scrollTop","scrollHeight","Math","max","body","documentElement","_getOffsetHeight","innerHeight","maxScroll","length","_activate","_clear","i","queries","split","selector","$link","join","hasClass","closest","find","addClass","parents","prev","children","trigger","relatedTarget","node","classList","contains","remove","each","data","TypeError","scrollSpys","$spy","_jQueryInterface","Constructor","noConflict"],"mappings":"6VAcMA,KAAO,YAGPC,qBADW,gBAGXC,mBAAqBC,gBAAEC,GAAGJ,MAK1BK,iCAA4BJ,WAC5BK,6BAAwBL,WACxBM,kCAA6BN,kBARd,aAsBfO,QAAU,CACdC,OAAQ,GACRC,OAAQ,OACRC,OAAQ,IAGJC,YAAc,CAClBH,OAAQ,SACRC,OAAQ,SACRC,OAAQ,0BAOJE,UACJC,YAAYC,QAASC,aACdC,SAAWF,aACXG,eAAqC,SAApBH,QAAQI,QAAqBC,OAASL,aACvDM,QAAUC,KAAKC,WAAWP,aAC1BQ,UAAY,UAAGF,KAAKD,QAAQV,mBA5BV,2BA6BEW,KAAKD,QAAQV,mBA3Bd,kCA4BCW,KAAKD,QAAQV,mBA1BV,uBA2BvBc,SAAW,QACXC,SAAW,QACXC,cAAgB,UAChBC,cAAgB,sBAEnBN,KAAKJ,gBAAgBW,GAAGvB,cAAcwB,OAASR,KAAKS,SAASD,cAE1DE,eACAD,WAIIE,2BA7DG,QAiEHzB,4BACFA,QAITwB,gBACQE,WAAaZ,KAAKJ,iBAAmBI,KAAKJ,eAAeE,OA1D7C,SACE,WA4Dde,aAAuC,SAAxBb,KAAKD,QAAQX,OAChCwB,WAAaZ,KAAKD,QAAQX,OAEtB0B,WA/Dc,aA+DDD,aACjBb,KAAKe,gBAAkB,OAEpBZ,SAAW,QACXC,SAAW,QAEXE,cAAgBN,KAAKgB,mBAEV,GAAGC,MAAMC,KAAKC,SAASC,iBAAiBpB,KAAKE,YAG1DmB,KAAI5B,cACCJ,aACEiC,eAAiBC,cAAKC,uBAAuB/B,YAE/C6B,iBACFjC,OAAS8B,SAASM,cAAcH,iBAG9BjC,OAAQ,OACJqC,UAAYrC,OAAOsC,2BACrBD,UAAUE,OAASF,UAAUG,aAExB,EACL,mBAAExC,QAAQwB,gBAAgBiB,IAAMhB,WAChCQ,uBAKC,QAERS,OAAOC,SACPC,MAAK,CAACC,EAAGC,IAAMD,EAAE,GAAKC,EAAE,KACxBC,SAAQC,YACFlC,SAASmC,KAAKD,KAAK,SACnBjC,SAASkC,KAAKD,KAAK,OAI9BE,0BACIC,WAAWxC,KAAKL,SArHL,oCAsHXK,KAAKJ,gBAAgB6C,IAAI9D,gBAEtBgB,SAAW,UACXC,eAAiB,UACjBG,QAAU,UACVG,UAAY,UACZC,SAAW,UACXC,SAAW,UACXC,cAAgB,UAChBC,cAAgB,KAIvBL,WAAWP,WAMoB,iBAL7BA,OAAS,IACJR,WACmB,iBAAXQ,QAAuBA,OAASA,OAAS,KAGpCL,QAAuBkC,cAAKmB,UAAUhD,OAAOL,QAAS,KAClEsD,IAAK,mBAAEjD,OAAOL,QAAQuD,KAAK,MAC1BD,KACHA,GAAKpB,cAAKsB,OAAOnE,0BACfgB,OAAOL,QAAQuD,KAAK,KAAMD,KAG9BjD,OAAOL,kBAAasD,yBAGjBG,gBAAgBpE,KAAMgB,OAAQJ,aAE5BI,OAGTqB,uBACSf,KAAKJ,iBAAmBE,OAC7BE,KAAKJ,eAAemD,YAAc/C,KAAKJ,eAAeoD,UAG1DhC,0BACShB,KAAKJ,eAAeqD,cAAgBC,KAAKC,IAC9ChC,SAASiC,KAAKH,aACd9B,SAASkC,gBAAgBJ,cAI7BK,0BACStD,KAAKJ,iBAAmBE,OAC7BA,OAAOyD,YAAcvD,KAAKJ,eAAe+B,wBAAwBE,OAGrEpB,iBACQuC,UAAYhD,KAAKe,gBAAkBf,KAAKD,QAAQZ,OAChD8D,aAAejD,KAAKgB,mBACpBwC,UAAYxD,KAAKD,QAAQZ,OAAS8D,aAAejD,KAAKsD,sBAExDtD,KAAKM,gBAAkB2C,mBACpBvC,UAGHsC,WAAaQ,iBACTnE,OAASW,KAAKI,SAASJ,KAAKI,SAASqD,OAAS,GAEhDzD,KAAKK,gBAAkBhB,aACpBqE,UAAUrE,gBAMfW,KAAKK,eAAiB2C,UAAYhD,KAAKG,SAAS,IAAMH,KAAKG,SAAS,GAAK,cACtEE,cAAgB,eAChBsD,aAIF,IAAIC,EAAI5D,KAAKG,SAASsD,OAAQG,KAAM,CAChB5D,KAAKK,gBAAkBL,KAAKI,SAASwD,IACxDZ,WAAahD,KAAKG,SAASyD,UACM,IAAzB5D,KAAKG,SAASyD,EAAI,IACtBZ,UAAYhD,KAAKG,SAASyD,EAAI,UAG/BF,UAAU1D,KAAKI,SAASwD,MAKnCF,UAAUrE,aACHgB,cAAgBhB,YAEhBsE,eAECE,QAAU7D,KAAKE,UAClB4D,MAAM,KACNzC,KAAI0C,oBAAeA,kCAAyB1E,qBAAY0E,2BAAkB1E,eAEvE2E,OAAQ,mBAAE,GAAG/C,MAAMC,KAAKC,SAASC,iBAAiByC,QAAQI,KAAK,QAEjED,MAAME,SApNmB,kBAqN3BF,MAAMG,QAtMc,aAuMjBC,KArMwB,oBAsMxBC,SAtNiB,UAuNpBL,MAAMK,SAvNc,YA0NpBL,MAAMK,SA1Nc,UA6NpBL,MAAMM,QAnNoB,qBAoNvBC,eAnNkB,yBAEC,qBAkNnBF,SA/NiB,UAiOpBL,MAAMM,QAvNoB,qBAwNvBC,KAtNkB,aAuNlBC,SAxNkB,aAyNlBH,SApOiB,+BAuOpBrE,KAAKJ,gBAAgB6E,QAAQ1F,eAAgB,CAC7C2F,cAAerF,SAInBsE,YACK1C,MAAMC,KAAKC,SAASC,iBAAiBpB,KAAKE,YAC1C6B,QAAO4C,MAAQA,KAAKC,UAAUC,SA9OX,YA+OnBzC,SAAQuC,MAAQA,KAAKC,UAAUE,OA/OZ,oCAmPApF,eACfM,KAAK+E,MAAK,eACXC,MAAO,mBAAEhF,MAAMgF,KA3PR,mBA8PNA,OACHA,KAAO,IAAIzF,UAAUS,KAHW,iBAAXN,QAAuBA,4BAI1CM,MAAMgF,KAhQC,eAgQcA,OAGH,iBAAXtF,OAAqB,SACF,IAAjBsF,KAAKtF,cACR,IAAIuF,qCAA8BvF,aAG1CsF,KAAKtF,mCAUXI,QAAQS,GAAGtB,qBAAqB,WAC1BiG,WAAa,GAAGjE,MAAMC,KAAKC,SAASC,iBApQlB,4BAuQnB,IAAIwC,EAFgBsB,WAAWzB,OAELG,KAAM,OAC7BuB,MAAO,mBAAED,WAAWtB,IAC1BrE,UAAU6F,iBAAiBlE,KAAKiE,KAAMA,KAAKH,4BAQ7ClG,GAAGJ,MAAQa,UAAU6F,iCACrBtG,GAAGJ,MAAM2G,YAAc9F,0BACvBT,GAAGJ,MAAM4G,WAAa,qBACpBxG,GAAGJ,MAAQE,mBACNW,UAAU6F,+BAGJ7F"}
-
 
2
1
{"version":3,"file":"scrollspy.min.js","sources":["../../src/bootstrap/scrollspy.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component'\nimport EventHandler from './dom/event-handler'\nimport SelectorEngine from './dom/selector-engine'\nimport {\n  defineJQueryPlugin, getElement, isDisabled, isVisible\n} from './util/index'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${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-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\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_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n  offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n  rootMargin: '0px 0px -25%',\n  smoothScroll: false,\n  target: null,\n  threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n  offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n  rootMargin: 'string',\n  smoothScroll: 'boolean',\n  target: 'element',\n  threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n  constructor(element, config) {\n    super(element, config)\n\n    // this._element is the observablesContainer and config.target the menu links wrapper\n    this._targetLinks = new Map()\n    this._observableSections = new Map()\n    this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n    this._activeTarget = null\n    this._observer = null\n    this._previousScrollData = {\n      visibleEntryTop: 0,\n      parentScrollTop: 0\n    }\n    this.refresh() // initialize\n  }\n\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  refresh() {\n    this._initializeTargetsAndObservables()\n    this._maybeEnableSmoothScroll()\n\n    if (this._observer) {\n      this._observer.disconnect()\n    } else {\n      this._observer = this._getNewObserver()\n    }\n\n    for (const section of this._observableSections.values()) {\n      this._observer.observe(section)\n    }\n  }\n\n  dispose() {\n    this._observer.disconnect()\n    super.dispose()\n  }\n\n  // Private\n  _configAfterMerge(config) {\n    // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n    config.target = getElement(config.target) || document.body\n\n    // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n    config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n    if (typeof config.threshold === 'string') {\n      config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n    }\n\n    return config\n  }\n\n  _maybeEnableSmoothScroll() {\n    if (!this._config.smoothScroll) {\n      return\n    }\n\n    // unregister any previous listeners\n    EventHandler.off(this._config.target, EVENT_CLICK)\n\n    EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n      const observableSection = this._observableSections.get(event.target.hash)\n      if (observableSection) {\n        event.preventDefault()\n        const root = this._rootElement || window\n        const height = observableSection.offsetTop - this._element.offsetTop\n        if (root.scrollTo) {\n          root.scrollTo({ top: height, behavior: 'smooth' })\n          return\n        }\n\n        // Chrome 60 doesn't support `scrollTo`\n        root.scrollTop = height\n      }\n    })\n  }\n\n  _getNewObserver() {\n    const options = {\n      root: this._rootElement,\n      threshold: this._config.threshold,\n      rootMargin: this._config.rootMargin\n    }\n\n    return new IntersectionObserver(entries => this._observerCallback(entries), options)\n  }\n\n  // The logic of selection\n  _observerCallback(entries) {\n    const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n    const activate = entry => {\n      this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n      this._process(targetElement(entry))\n    }\n\n    const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n    const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n    this._previousScrollData.parentScrollTop = parentScrollTop\n\n    for (const entry of entries) {\n      if (!entry.isIntersecting) {\n        this._activeTarget = null\n        this._clearActiveClass(targetElement(entry))\n\n        continue\n      }\n\n      const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n      // if we are scrolling down, pick the bigger offsetTop\n      if (userScrollsDown && entryIsLowerThanPrevious) {\n        activate(entry)\n        // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n        if (!parentScrollTop) {\n          return\n        }\n\n        continue\n      }\n\n      // if we are scrolling up, pick the smallest offsetTop\n      if (!userScrollsDown && !entryIsLowerThanPrevious) {\n        activate(entry)\n      }\n    }\n  }\n\n  _initializeTargetsAndObservables() {\n    this._targetLinks = new Map()\n    this._observableSections = new Map()\n\n    const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n    for (const anchor of targetLinks) {\n      // ensure that the anchor has an id and is not disabled\n      if (!anchor.hash || isDisabled(anchor)) {\n        continue\n      }\n\n      const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n      // ensure that the observableSection exists & is visible\n      if (isVisible(observableSection)) {\n        this._targetLinks.set(decodeURI(anchor.hash), anchor)\n        this._observableSections.set(anchor.hash, observableSection)\n      }\n    }\n  }\n\n  _process(target) {\n    if (this._activeTarget === target) {\n      return\n    }\n\n    this._clearActiveClass(this._config.target)\n    this._activeTarget = target\n    target.classList.add(CLASS_NAME_ACTIVE)\n    this._activateParents(target)\n\n    EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n  }\n\n  _activateParents(target) {\n    // Activate dropdown parents\n    if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n      SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n        .classList.add(CLASS_NAME_ACTIVE)\n      return\n    }\n\n    for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\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      for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n        item.classList.add(CLASS_NAME_ACTIVE)\n      }\n    }\n  }\n\n  _clearActiveClass(parent) {\n    parent.classList.remove(CLASS_NAME_ACTIVE)\n\n    const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent)\n    for (const node of activeNodes) {\n      node.classList.remove(CLASS_NAME_ACTIVE)\n    }\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = ScrollSpy.getOrCreateInstance(this, config)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config]()\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n  for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n    ScrollSpy.getOrCreateInstance(spy)\n  }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n"],"names":["EVENT_KEY","EVENT_ACTIVATE","EVENT_CLICK","EVENT_LOAD_DATA_API","SELECTOR_LINK_ITEMS","Default","offset","rootMargin","smoothScroll","target","threshold","DefaultType","ScrollSpy","BaseComponent","constructor","element","config","_targetLinks","Map","_observableSections","_rootElement","getComputedStyle","this","_element","overflowY","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","NAME","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","values","observe","dispose","_configAfterMerge","document","body","split","map","value","Number","parseFloat","_config","off","on","event","observableSection","get","hash","preventDefault","root","window","height","offsetTop","scrollTo","top","behavior","scrollTop","options","IntersectionObserver","entries","_observerCallback","targetElement","entry","id","activate","_process","documentElement","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","SelectorEngine","find","anchor","findOne","decodeURI","set","classList","add","_activateParents","trigger","relatedTarget","contains","closest","listGroup","parents","item","prev","parent","remove","activeNodes","node","each","data","getOrCreateInstance","undefined","startsWith","TypeError","spy"],"mappings":"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"}
-
 
2
3
3