2018-11-13 07:41:12 +01:00
/ * !
2019-02-11 20:15:34 +01:00
* Bootstrap scrollspy . js v4 . 3.0 ( https : //getbootstrap.com/)
2019-01-04 17:29:45 +01:00
* Copyright 2011 - 2019 The Bootstrap Authors ( https : //github.com/twbs/bootstrap/graphs/contributors)
2018-11-13 07:41:12 +01:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* /
2018-07-24 02:51:14 +02:00
( function ( global , factory ) {
typeof exports === 'object' && typeof module !== 'undefined' ? module . exports = factory ( require ( 'jquery' ) , require ( './util.js' ) ) :
typeof define === 'function' && define . amd ? define ( [ 'jquery' , './util.js' ] , factory ) :
2019-01-04 17:29:45 +01:00
( global = global || self , global . ScrollSpy = factory ( global . jQuery , global . Util ) ) ;
} ( this , function ( $ , Util ) { 'use strict' ;
2018-07-24 02:51:14 +02:00
$ = $ && $ . hasOwnProperty ( 'default' ) ? $ [ 'default' ] : $ ;
Util = Util && Util . hasOwnProperty ( 'default' ) ? Util [ 'default' ] : Util ;
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 ;
}
function _defineProperty ( obj , key , value ) {
if ( key in obj ) {
Object . defineProperty ( obj , key , {
value : value ,
enumerable : true ,
configurable : true ,
writable : true
} ) ;
} else {
obj [ key ] = value ;
}
return obj ;
}
function _objectSpread ( target ) {
for ( var i = 1 ; i < arguments . length ; i ++ ) {
var source = arguments [ i ] != null ? arguments [ i ] : { } ;
var ownKeys = Object . keys ( source ) ;
2018-03-31 22:59:37 +02:00
2018-07-24 02:51:14 +02:00
if ( typeof Object . getOwnPropertySymbols === 'function' ) {
ownKeys = ownKeys . concat ( Object . getOwnPropertySymbols ( source ) . filter ( function ( sym ) {
return Object . getOwnPropertyDescriptor ( source , sym ) . enumerable ;
} ) ) ;
}
2017-12-23 01:21:54 +01:00
2018-07-24 02:51:14 +02:00
ownKeys . forEach ( function ( key ) {
_defineProperty ( target , key , source [ key ] ) ;
} ) ;
}
2017-09-06 06:05:12 +02:00
2018-07-24 02:51:14 +02:00
return target ;
}
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'scrollspy' ;
2019-02-11 20:15:34 +01:00
var VERSION = '4.3.0' ;
2018-11-13 07:41:12 +01:00
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'
2017-09-13 07:24:15 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2018-11-13 07:41:12 +01:00
* Class Definition
2017-09-13 07:24:15 +02:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
} ;
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 ( ) ;
2015-08-13 06:12:03 +02:00
2018-11-13 07:41:12 +01:00
this . _process ( ) ;
} // Getters
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
var _proto = ScrollSpy . prototype ;
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
// Public
_proto . refresh = function refresh ( ) {
var _this2 = this ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
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 = [ ] . slice . call ( document . querySelectorAll ( this . _selector ) ) ;
targets . map ( function ( element ) {
var target ;
var targetSelector = Util . getSelectorFromElement ( element ) ;
2018-07-24 02:51:14 +02:00
2018-11-13 07:41:12 +01:00
if ( targetSelector ) {
target = document . querySelector ( targetSelector ) ;
}
2015-05-13 21:55:11 +02:00
2018-11-13 07:41:12 +01:00
if ( target ) {
var targetBCR = target . getBoundingClientRect ( ) ;
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
if ( targetBCR . width || targetBCR . height ) {
// TODO (fat): remove sketch reliance on jQuery position/offset
return [ $ ( target ) [ offsetMethod ] ( ) . top + offsetBase , targetSelector ] ;
2017-09-30 23:28:03 +02:00
}
2018-11-13 07:41:12 +01:00
}
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
return null ;
} ) . filter ( function ( item ) {
return item ;
} ) . sort ( function ( a , b ) {
return a [ 0 ] - b [ 0 ] ;
} ) . forEach ( function ( item ) {
_this2 . _offsets . push ( item [ 0 ] ) ;
2015-05-13 22:43:56 +02:00
2018-11-13 07:41:12 +01:00
_this2 . _targets . push ( item [ 1 ] ) ;
} ) ;
} ;
2016-10-10 02:26:51 +02:00
2018-11-13 07:41:12 +01:00
_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 ;
2019-01-04 17:29:45 +01:00
} // Private
;
2018-11-13 07:41:12 +01:00
_proto . _getConfig = function _getConfig ( config ) {
config = _objectSpread ( { } , Default , typeof config === 'object' && config ? config : { } ) ;
if ( typeof config . target !== 'string' ) {
var id = $ ( config . target ) . attr ( 'id' ) ;
if ( ! id ) {
id = Util . getUID ( NAME ) ;
$ ( config . target ) . attr ( 'id' , id ) ;
2018-07-24 02:51:14 +02:00
}
2016-01-09 09:40:51 +01:00
2018-11-13 07:41:12 +01:00
config . target = "#" + id ;
}
2016-10-10 02:26:51 +02:00
2018-11-13 07:41:12 +01:00
Util . typeCheckConfig ( NAME , config , DefaultType ) ;
return config ;
} ;
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getScrollTop = function _getScrollTop ( ) {
return this . _scrollElement === window ? this . _scrollElement . pageYOffset : this . _scrollElement . scrollTop ;
} ;
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getScrollHeight = function _getScrollHeight ( ) {
return this . _scrollElement . scrollHeight || Math . max ( document . body . scrollHeight , document . documentElement . scrollHeight ) ;
} ;
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getOffsetHeight = function _getOffsetHeight ( ) {
return this . _scrollElement === window ? window . innerHeight : this . _scrollElement . getBoundingClientRect ( ) . height ;
} ;
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
_proto . _process = function _process ( ) {
var scrollTop = this . _getScrollTop ( ) + this . _config . offset ;
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
var scrollHeight = this . _getScrollHeight ( ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
var maxScroll = this . _config . offset + scrollHeight - this . _getOffsetHeight ( ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _scrollHeight !== scrollHeight ) {
this . refresh ( ) ;
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( scrollTop >= maxScroll ) {
var target = this . _targets [ this . _targets . length - 1 ] ;
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _activeTarget !== target ) {
this . _activate ( target ) ;
2018-07-24 02:51:14 +02:00
}
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
return ;
}
2018-07-24 02:51:14 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _activeTarget && scrollTop < this . _offsets [ 0 ] && this . _offsets [ 0 ] > 0 ) {
this . _activeTarget = null ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
this . _clear ( ) ;
2018-06-22 07:55:23 +02:00
2018-11-13 07:41:12 +01:00
return ;
}
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
var offsetLength = this . _offsets . length ;
2018-07-24 02:51:14 +02:00
2018-11-13 07:41:12 +01:00
for ( var i = offsetLength ; i -- ; ) {
var isActiveTarget = this . _activeTarget !== this . _targets [ i ] && scrollTop >= this . _offsets [ i ] && ( typeof this . _offsets [ i + 1 ] === 'undefined' || scrollTop < this . _offsets [ i + 1 ] ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( isActiveTarget ) {
this . _activate ( this . _targets [ i ] ) ;
}
}
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _activate = function _activate ( target ) {
this . _activeTarget = target ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
this . _clear ( ) ;
2017-09-30 23:28:03 +02:00
2018-11-24 17:22:59 +01:00
var queries = this . _selector . split ( ',' ) . map ( function ( selector ) {
return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]" ;
2018-11-13 07:41:12 +01:00
} ) ;
2018-11-24 17:22:59 +01:00
2018-11-13 07:41:12 +01:00
var $link = $ ( [ ] . slice . call ( document . querySelectorAll ( queries . join ( ',' ) ) ) ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
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
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
$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
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
$link . parents ( Selector . NAV _LIST _GROUP ) . prev ( Selector . NAV _ITEMS ) . children ( Selector . NAV _LINKS ) . addClass ( ClassName . ACTIVE ) ;
}
2016-10-10 02:26:51 +02:00
2018-11-13 07:41:12 +01:00
$ ( this . _scrollElement ) . trigger ( Event . ACTIVATE , {
relatedTarget : target
} ) ;
} ;
2016-10-10 02:26:51 +02:00
2018-11-13 07:41:12 +01:00
_proto . _clear = function _clear ( ) {
2018-11-24 17:22:59 +01:00
[ ] . slice . call ( document . querySelectorAll ( this . _selector ) ) . filter ( function ( node ) {
return node . classList . contains ( ClassName . ACTIVE ) ;
} ) . forEach ( function ( node ) {
return node . classList . remove ( ClassName . ACTIVE ) ;
} ) ;
2019-01-04 17:29:45 +01:00
} // Static
;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
ScrollSpy . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var data = $ ( this ) . data ( DATA _KEY ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
var _config = typeof config === 'object' && config ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( ! data ) {
data = new ScrollSpy ( this , _config ) ;
$ ( this ) . data ( DATA _KEY , data ) ;
}
2018-07-24 02:51:14 +02:00
2018-11-13 07:41:12 +01:00
if ( typeof config === 'string' ) {
if ( typeof data [ config ] === 'undefined' ) {
throw new TypeError ( "No method named \"" + config + "\"" ) ;
2017-09-06 06:05:12 +02:00
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
data [ config ] ( ) ;
2017-09-30 23:28:03 +02:00
}
2018-11-13 07:41:12 +01:00
} ) ;
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_createClass ( ScrollSpy , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION ;
}
} , {
key : "Default" ,
get : function get ( ) {
return Default ;
}
} ] ) ;
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
return ScrollSpy ;
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2015-05-11 21:05:35 +02:00
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
$ ( window ) . on ( Event . LOAD _DATA _API , function ( ) {
var scrollSpys = [ ] . slice . call ( document . querySelectorAll ( Selector . DATA _SPY ) ) ;
var scrollSpysLength = scrollSpys . length ;
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
for ( var i = scrollSpysLength ; i -- ; ) {
var $spy = $ ( scrollSpys [ i ] ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
ScrollSpy . _jQueryInterface . call ( $spy , $spy . data ( ) ) ;
}
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2015-05-11 21:05:35 +02:00
2018-11-13 07:41:12 +01:00
$ . fn [ NAME ] = ScrollSpy . _jQueryInterface ;
$ . fn [ NAME ] . Constructor = ScrollSpy ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return ScrollSpy . _jQueryInterface ;
} ;
2015-05-11 21:05:35 +02:00
return ScrollSpy ;
2018-07-24 02:51:14 +02:00
2019-01-04 17:29:45 +01:00
} ) ) ;
2018-07-24 02:51:14 +02:00
//# sourceMappingURL=scrollspy.js.map