function _ extends ( ) { _ extends = Object . assign || function ( target ) { for ( var i = 1 ; i < arguments . length ; i ++ ) { var source = arguments [ i ] ; for ( var key in source ) { if ( Object . prototype . hasOwnProperty . call ( source , key ) ) { target [ key ] = source [ key ] ; } } } return target ; } ; return _ extends . apply ( this , arguments ) ; }
function _ defineProperties ( target , props ) { for ( var i = 0 ; i < props . length ; i ++ ) { var descriptor = props [ i ] ; descriptor . enumerable = descriptor . enumerable || false ; descriptor . configurable = true ; if ( "value" in descriptor ) descriptor . writable = true ; Object . defineProperty ( target , descriptor . key , descriptor ) ; } }
function _ createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) _ defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) _ defineProperties ( Constructor , staticProps ) ; return Constructor ; }
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 0.0 ) : scrollspy . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var ScrollSpy = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'scrollspy' ;
var VERSION = '4.0.0' ;
var DATA_KEY = 'bs.scrollspy' ;
var EVENT_KEY = "." + DATA_KEY ;
var DATA_API_KEY = '.data-api' ;
var JQUERY_NO_CONFLICT = $ . fn [ NAME ] ;
var Default = {
offset : 10 ,
method : 'auto' ,
target : ''
} ;
var DefaultType = {
offset : 'number' ,
method : 'string' ,
target : '(string|element)'
} ;
var Event = {
ACTIVATE : "activate" + EVENT_KEY ,
SCROLL : "scroll" + EVENT_KEY ,
LOAD_DATA_API : "load" + EVENT_KEY + DATA_API_KEY
} ;
var ClassName = {
DROPDOWN_ITEM : 'dropdown-item' ,
DROPDOWN_MENU : 'dropdown-menu' ,
ACTIVE : 'active'
} ;
var Selector = {
DATA_SPY : '[data-spy="scroll"]' ,
ACTIVE : '.active' ,
NAV_LIST_GROUP : '.nav, .list-group' ,
NAV_LINKS : '.nav-link' ,
NAV_ITEMS : '.nav-item' ,
LIST_ITEMS : '.list-group-item' ,
DROPDOWN : '.dropdown' ,
DROPDOWN_ITEMS : '.dropdown-item' ,
DROPDOWN_TOGGLE : '.dropdown-toggle'
} ;
var OffsetMethod = {
OFFSET : 'offset' ,
POSITION : 'position'
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
} ;
var ScrollSpy =
/*#__PURE__*/
function ( ) {
function ScrollSpy ( element , config ) {
var _ this = this ;
this . _ element = element ;
this . _ scrollElement = element . tagName === 'BODY' ? window : element ;
this . _ config = this . _ getConfig ( config ) ;
this . _ selector = this . _ config . target + " " + Selector . NAV_LINKS + "," + ( this . _ config . target + " " + Selector . LIST_ITEMS + "," ) + ( this . _ config . target + " " + Selector . DROPDOWN_ITEMS ) ;
this . _ offsets = [ ] ;
this . _ targets = [ ] ;
this . _ activeTarget = null ;
this . _ scrollHeight = 0 ;
$ ( this . _ scrollElement ) . on ( Event . SCROLL , function ( event ) {
return _ this . _ process ( event ) ;
} ) ;
this . refresh ( ) ;
this . _ process ( ) ;
} // Getters
var _ proto = ScrollSpy . prototype ;
// Public
_ proto . refresh = function refresh ( ) {
var _ this2 = this ;
var autoMethod = this . _ scrollElement === this . _ scrollElement . window ? OffsetMethod . OFFSET : OffsetMethod . POSITION ;
var offsetMethod = this . _ config . method === 'auto' ? autoMethod : this . _ config . method ;
var offsetBase = offsetMethod === OffsetMethod . POSITION ? this . _ getScrollTop ( ) : 0 ;
this . _ offsets = [ ] ;
this . _ targets = [ ] ;
this . _ scrollHeight = this . _ getScrollHeight ( ) ;
var targets = $ . makeArray ( $ ( this . _ selector ) ) ;
targets . map ( function ( element ) {
var target ;
var targetSelector = Util . getSelectorFromElement ( element ) ;
if ( targetSelector ) {
target = $ ( targetSelector ) [ 0 ] ;
}
if ( target ) {
var targetBCR = target . getBoundingClientRect ( ) ;
if ( targetBCR . width || targetBCR . height ) {
// TODO (fat): remove sketch reliance on jQuery position/offset
return [ $ ( target ) [ offsetMethod ] ( ) . top + offsetBase , targetSelector ] ;
}
}
return null ;
} ) . filter ( function ( item ) {
return item ;
} ) . sort ( function ( a , b ) {
return a [ 0 ] - b [ 0 ] ;
} ) . forEach ( function ( item ) {
_ this2 . _ offsets . push ( item [ 0 ] ) ;
_ this2 . _ targets . push ( item [ 1 ] ) ;
} ) ;
} ;
_ proto . dispose = function dispose ( ) {
$ . removeData ( this . _ element , DATA_KEY ) ;
$ ( this . _ scrollElement ) . off ( EVENT_KEY ) ;
this . _ element = null ;
this . _ scrollElement = null ;
this . _ config = null ;
this . _ selector = null ;
this . _ offsets = null ;
this . _ targets = null ;
this . _ activeTarget = null ;
this . _ scrollHeight = null ;
} ; // Private
_ proto . _ getConfig = function _ getConfig ( config ) {
config = _ extends ( { } , Default , config ) ;
if ( typeof config . target !== 'string' ) {
var id = $ ( config . target ) . attr ( 'id' ) ;
if ( ! id ) {
id = Util . getUID ( NAME ) ;
$ ( config . target ) . attr ( 'id' , id ) ;
}
config . target = "#" + id ;
}
Util . typeCheckConfig ( NAME , config , DefaultType ) ;
return config ;
} ;
_ proto . _ getScrollTop = function _ getScrollTop ( ) {
return this . _ scrollElement === window ? this . _ scrollElement . pageYOffset : this . _ scrollElement . scrollTop ;
} ;
_ proto . _ getScrollHeight = function _ getScrollHeight ( ) {
return this . _ scrollElement . scrollHeight || Math . max ( document . body . scrollHeight , document . documentElement . scrollHeight ) ;
} ;
_ proto . _ getOffsetHeight = function _ getOffsetHeight ( ) {
return this . _ scrollElement === window ? window . innerHeight : this . _ scrollElement . getBoundingClientRect ( ) . height ;
} ;
_ proto . _ process = function _ process ( ) {
var scrollTop = this . _ getScrollTop ( ) + this . _ config . offset ;
var scrollHeight = this . _ getScrollHeight ( ) ;
var maxScroll = this . _ config . offset + scrollHeight - this . _ getOffsetHeight ( ) ;
if ( this . _ scrollHeight !== scrollHeight ) {
this . refresh ( ) ;
}
if ( scrollTop >= maxScroll ) {
var target = this . _ targets [ this . _ targets . length - 1 ] ;
if ( this . _ activeTarget !== target ) {
this . _ activate ( target ) ;
}
return ;
}
if ( this . _ activeTarget && scrollTop < this . _ offsets [ 0 ] && this . _ offsets [ 0 ] > 0 ) {
this . _ activeTarget = null ;
this . _ clear ( ) ;
return ;
}
for ( var i = this . _ offsets . length ; i -- ; ) {
var isActiveTarget = this . _ activeTarget !== this . _ targets [ i ] && scrollTop >= this . _ offsets [ i ] && ( typeof this . _ offsets [ i + 1 ] === 'undefined' || scrollTop < this . _ offsets [ i + 1 ] ) ;
if ( isActiveTarget ) {
this . _ activate ( this . _ targets [ i ] ) ;
}
}
} ;
_ proto . _ activate = function _ activate ( target ) {
this . _ activeTarget = target ;
this . _ clear ( ) ;
var queries = this . _ selector . split ( ',' ) ; // eslint-disable-next-line arrow-body-style
queries = queries . map ( function ( selector ) {
return selector + "[data-target=\"" + target + "\"]," + ( selector + "[href=\"" + target + "\"]" ) ;
} ) ;
var $link = $ ( queries . join ( ',' ) ) ;
if ( $link . hasClass ( ClassName . DROPDOWN_ITEM ) ) {
$link . closest ( Selector . DROPDOWN ) . find ( Selector . DROPDOWN_TOGGLE ) . addClass ( ClassName . ACTIVE ) ;
$link . addClass ( ClassName . ACTIVE ) ;
} else {
// Set triggered link as active
$link . addClass ( ClassName . ACTIVE ) ; // Set triggered links parents as active
// With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
$link . parents ( Selector . NAV_LIST_GROUP ) . prev ( Selector . NAV_LINKS + ", " + Selector . LIST_ITEMS ) . addClass ( ClassName . ACTIVE ) ; // Handle special case when .nav-link is inside .nav-item
$link . parents ( Selector . NAV_LIST_GROUP ) . prev ( Selector . NAV_ITEMS ) . children ( Selector . NAV_LINKS ) . addClass ( ClassName . ACTIVE ) ;
}
$ ( this . _ scrollElement ) . trigger ( Event . ACTIVATE , {
relatedTarget : target
} ) ;
} ;
_ proto . _ clear = function _ clear ( ) {
$ ( this . _ selector ) . filter ( Selector . ACTIVE ) . removeClass ( ClassName . ACTIVE ) ;
} ; // Static
ScrollSpy . _ jQueryInterface = function _ jQueryInterface ( config ) {
return this . each ( function ( ) {
var data = $ ( this ) . data ( DATA_KEY ) ;
var _ config = typeof config === 'object' && config ;
if ( ! data ) {
data = new ScrollSpy ( this , _ config ) ;
$ ( this ) . data ( DATA_KEY , data ) ;
}
if ( typeof config === 'string' ) {
if ( typeof data [ config ] === 'undefined' ) {
throw new TypeError ( "No method named \"" + config + "\"" ) ;
}
data [ config ] ( ) ;
}
} ) ;
} ;
_ createClass ( ScrollSpy , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION ;
}
} , {
key : "Default" ,
get : function get ( ) {
return Default ;
}
} ] ) ;
return ScrollSpy ;
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
$ ( window ) . on ( Event . LOAD_DATA_API , function ( ) {
var scrollSpys = $ . makeArray ( $ ( Selector . DATA_SPY ) ) ;
for ( var i = scrollSpys . length ; i -- ; ) {
var $spy = $ ( scrollSpys [ i ] ) ;
ScrollSpy . _ jQueryInterface . call ( $spy , $spy . data ( ) ) ;
}
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
$ . fn [ NAME ] = ScrollSpy . _ jQueryInterface ;
$ . fn [ NAME ] . Constructor = ScrollSpy ;
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY_NO_CONFLICT ;
return ScrollSpy . _ jQueryInterface ;
} ;
return ScrollSpy ;
} ( $ ) ;
//# sourceMappingURL=scrollspy.js.map