2017-09-06 06:05:12 +02:00
/ * !
2020-11-11 18:07:37 +01:00
* Bootstrap v5 . 0.0 - alpha3 ( https : //getbootstrap.com/)
2020-03-28 11:29:08 +01:00
* Copyright 2011 - 2020 The Bootstrap Authors ( https : //github.com/twbs/bootstrap/graphs/contributors)
2020-06-16 20:50:01 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
2017-09-06 06:05:12 +02:00
* /
2017-12-23 01:21:54 +01:00
( function ( global , factory ) {
2019-03-11 16:13:30 +01:00
typeof exports === 'object' && typeof module !== 'undefined' ? module . exports = factory ( ) :
typeof define === 'function' && define . amd ? define ( factory ) :
2020-09-14 17:12:06 +02:00
( global = typeof globalThis !== 'undefined' ? globalThis : global || self , global . bootstrap = factory ( ) ) ;
2019-11-08 09:11:23 +01:00
} ( this , ( function ( ) { 'use strict' ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
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 ;
2017-11-08 05:45:26 +01:00
}
2020-09-14 17:12:06 +02:00
function _extends ( ) {
_extends = Object . assign || function ( target ) {
for ( var i = 1 ; i < arguments . length ; i ++ ) {
var source = arguments [ i ] ;
2017-12-23 01:21:54 +01:00
2020-09-14 17:12:06 +02:00
for ( var key in source ) {
if ( Object . prototype . hasOwnProperty . call ( source , key ) ) {
target [ key ] = source [ key ] ;
}
}
2017-12-23 01:21:54 +01:00
}
2020-09-14 17:12:06 +02:00
return target ;
} ;
return _extends . apply ( this , arguments ) ;
2018-03-31 22:59:37 +02:00
}
2017-11-08 05:45:26 +01:00
2018-03-31 22:59:37 +02:00
function _inheritsLoose ( subClass , superClass ) {
subClass . prototype = Object . create ( superClass . prototype ) ;
subClass . prototype . constructor = subClass ;
subClass . _ _proto _ _ = superClass ;
}
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* Bootstrap ( v5 . 0.0 - alpha3 ) : util / index . js
2020-06-16 20:50:01 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
2018-03-31 22:59:37 +02:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2017-09-06 06:05:12 +02:00
* /
2019-03-01 17:31:34 +01:00
var MAX _UID = 1000000 ;
var MILLISECONDS _MULTIPLIER = 1000 ;
2019-08-27 15:03:21 +02:00
var TRANSITION _END = 'transitionend' ; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
2019-03-01 17:31:34 +01:00
var toType = function toType ( obj ) {
2020-03-28 11:29:08 +01:00
if ( obj === null || obj === undefined ) {
return "" + obj ;
}
2019-03-01 17:31:34 +01:00
return { } . toString . call ( obj ) . match ( /\s([a-z]+)/i ) [ 1 ] . toLowerCase ( ) ;
} ;
2018-11-13 07:41:12 +01:00
/ * *
2019-03-01 17:31:34 +01:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Public Util Api
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2018-11-13 07:41:12 +01:00
* /
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
var getUID = function getUID ( prefix ) {
do {
2020-06-14 00:40:28 +02:00
prefix += Math . floor ( Math . random ( ) * MAX _UID ) ;
2019-03-01 17:31:34 +01:00
} while ( document . getElementById ( prefix ) ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
return prefix ;
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
var getSelector = function getSelector ( element ) {
2019-03-01 17:31:34 +01:00
var selector = element . getAttribute ( 'data-target' ) ;
if ( ! selector || selector === '#' ) {
var hrefAttr = element . getAttribute ( 'href' ) ;
2019-08-27 15:03:21 +02:00
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr . trim ( ) : null ;
2019-03-01 17:31:34 +01:00
}
2019-08-27 15:03:21 +02:00
return selector ;
} ;
var getSelectorFromElement = function getSelectorFromElement ( element ) {
var selector = getSelector ( element ) ;
if ( selector ) {
2019-03-01 17:31:34 +01:00
return document . querySelector ( selector ) ? selector : null ;
}
2019-08-27 15:03:21 +02:00
return null ;
} ;
var getElementFromSelector = function getElementFromSelector ( element ) {
var selector = getSelector ( element ) ;
return selector ? document . querySelector ( selector ) : null ;
2019-03-01 17:31:34 +01:00
} ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
var getTransitionDurationFromElement = function getTransitionDurationFromElement ( element ) {
if ( ! element ) {
return 0 ;
} // Get transition-duration of the element
var _window$getComputedSt = window . getComputedStyle ( element ) ,
transitionDuration = _window$getComputedSt . transitionDuration ,
transitionDelay = _window$getComputedSt . transitionDelay ;
var floatTransitionDuration = parseFloat ( transitionDuration ) ;
var floatTransitionDelay = parseFloat ( transitionDelay ) ; // Return 0 if element or transition duration is not found
if ( ! floatTransitionDuration && ! floatTransitionDelay ) {
return 0 ;
} // If multiple durations are defined, take the first
transitionDuration = transitionDuration . split ( ',' ) [ 0 ] ;
transitionDelay = transitionDelay . split ( ',' ) [ 0 ] ;
return ( parseFloat ( transitionDuration ) + parseFloat ( transitionDelay ) ) * MILLISECONDS _MULTIPLIER ;
} ;
var triggerTransitionEnd = function triggerTransitionEnd ( element ) {
2020-03-28 11:29:08 +01:00
element . dispatchEvent ( new Event ( TRANSITION _END ) ) ;
2019-03-01 17:31:34 +01:00
} ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
var isElement = function isElement ( obj ) {
return ( obj [ 0 ] || obj ) . nodeType ;
} ;
var emulateTransitionEnd = function emulateTransitionEnd ( element , duration ) {
2018-11-13 07:41:12 +01:00
var called = false ;
2019-03-01 17:31:34 +01:00
var durationPadding = 5 ;
var emulatedDuration = duration + durationPadding ;
function listener ( ) {
2018-11-13 07:41:12 +01:00
called = true ;
2019-03-01 17:31:34 +01:00
element . removeEventListener ( TRANSITION _END , listener ) ;
}
element . addEventListener ( TRANSITION _END , listener ) ;
2018-11-13 07:41:12 +01:00
setTimeout ( function ( ) {
if ( ! called ) {
2019-03-01 17:31:34 +01:00
triggerTransitionEnd ( element ) ;
2018-11-13 07:41:12 +01:00
}
2019-03-01 17:31:34 +01:00
} , emulatedDuration ) ;
} ;
var typeCheckConfig = function typeCheckConfig ( componentName , config , configTypes ) {
Object . keys ( configTypes ) . forEach ( function ( property ) {
var expectedTypes = configTypes [ property ] ;
var value = config [ property ] ;
var valueType = value && isElement ( value ) ? 'element' : toType ( value ) ;
if ( ! new RegExp ( expectedTypes ) . test ( valueType ) ) {
throw new Error ( componentName . toUpperCase ( ) + ": " + ( "Option \"" + property + "\" provided type \"" + valueType + "\" " ) + ( "but expected type \"" + expectedTypes + "\"." ) ) ;
}
} ) ;
} ;
var isVisible = function isVisible ( element ) {
if ( ! element ) {
return false ;
}
if ( element . style && element . parentNode && element . parentNode . style ) {
2019-11-08 09:11:23 +01:00
var elementStyle = getComputedStyle ( element ) ;
var parentNodeStyle = getComputedStyle ( element . parentNode ) ;
return elementStyle . display !== 'none' && parentNodeStyle . display !== 'none' && elementStyle . visibility !== 'hidden' ;
2019-03-01 17:31:34 +01:00
}
return false ;
} ;
var findShadowRoot = function findShadowRoot ( element ) {
if ( ! document . documentElement . attachShadow ) {
return null ;
} // Can find the shadow root otherwise it'll return the document
if ( typeof element . getRootNode === 'function' ) {
var root = element . getRootNode ( ) ;
return root instanceof ShadowRoot ? root : null ;
}
if ( element instanceof ShadowRoot ) {
return element ;
} // when we don't find a shadow root
if ( ! element . parentNode ) {
return null ;
}
return findShadowRoot ( element . parentNode ) ;
2019-10-08 08:39:10 +02:00
} ;
2019-03-01 17:31:34 +01:00
var noop = function noop ( ) {
return function ( ) { } ;
} ;
var reflow = function reflow ( element ) {
return element . offsetHeight ;
} ;
2018-11-13 07:41:12 +01:00
2019-08-27 15:03:21 +02:00
var getjQuery = function getjQuery ( ) {
var _window = window ,
jQuery = _window . jQuery ;
if ( jQuery && ! document . body . hasAttribute ( 'data-no-jquery' ) ) {
return jQuery ;
}
return null ;
} ;
2020-11-11 18:07:37 +01:00
var onDOMContentLoaded = function onDOMContentLoaded ( callback ) {
if ( document . readyState === 'loading' ) {
document . addEventListener ( 'DOMContentLoaded' , callback ) ;
} else {
callback ( ) ;
}
} ;
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* Bootstrap ( v5 . 0.0 - alpha3 ) : dom / data . js
2020-06-16 20:50:01 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
2018-11-13 07:41:12 +01:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var mapData = function ( ) {
var storeData = { } ;
var id = 1 ;
return {
set : function set ( element , key , data ) {
2020-09-14 17:12:06 +02:00
if ( typeof element . bsKey === 'undefined' ) {
element . bsKey = {
2019-03-01 17:31:34 +01:00
key : key ,
id : id
} ;
id ++ ;
}
2020-09-14 17:12:06 +02:00
storeData [ element . bsKey . id ] = data ;
2019-03-01 17:31:34 +01:00
} ,
get : function get ( element , key ) {
2020-09-14 17:12:06 +02:00
if ( ! element || typeof element . bsKey === 'undefined' ) {
2019-03-01 17:31:34 +01:00
return null ;
}
2017-09-06 06:05:12 +02:00
2020-09-14 17:12:06 +02:00
var keyProperties = element . bsKey ;
2017-09-30 23:28:03 +02:00
2019-03-01 17:31:34 +01:00
if ( keyProperties . key === key ) {
return storeData [ keyProperties . id ] ;
}
2017-09-30 23:28:03 +02:00
2019-03-01 17:31:34 +01:00
return null ;
} ,
delete : function _delete ( element , key ) {
2020-09-14 17:12:06 +02:00
if ( typeof element . bsKey === 'undefined' ) {
2019-03-01 17:31:34 +01:00
return ;
}
2020-09-14 17:12:06 +02:00
var keyProperties = element . bsKey ;
2019-03-01 17:31:34 +01:00
if ( keyProperties . key === key ) {
delete storeData [ keyProperties . id ] ;
2020-09-14 17:12:06 +02:00
delete element . bsKey ;
2019-03-01 17:31:34 +01:00
}
2018-11-13 07:41:12 +01:00
}
2019-03-01 17:31:34 +01:00
} ;
} ( ) ;
var Data = {
setData : function setData ( instance , key , data ) {
mapData . set ( instance , key , data ) ;
} ,
getData : function getData ( instance , key ) {
return mapData . get ( instance , key ) ;
} ,
removeData : function removeData ( instance , key ) {
mapData . delete ( instance , key ) ;
}
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* Bootstrap ( v5 . 0.0 - alpha3 ) : dom / event - handler . js
2020-06-16 20:50:01 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
2019-03-01 17:31:34 +01:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var namespaceRegex = /[^.]*(?=\..*)\.|.*/ ;
var stripNameRegex = /\..*/ ;
var stripUidRegex = /::\d+$/ ;
var eventRegistry = { } ; // Events storage
var uidEvent = 1 ;
var customEvents = {
mouseenter : 'mouseover' ,
mouseleave : 'mouseout'
} ;
var nativeEvents = [ 'click' , 'dblclick' , 'mouseup' , 'mousedown' , 'contextmenu' , 'mousewheel' , 'DOMMouseScroll' , 'mouseover' , 'mouseout' , 'mousemove' , 'selectstart' , 'selectend' , 'keydown' , 'keypress' , 'keyup' , 'orientationchange' , 'touchstart' , 'touchmove' , 'touchend' , 'touchcancel' , 'pointerdown' , 'pointermove' , 'pointerup' , 'pointerleave' , 'pointercancel' , 'gesturestart' , 'gesturechange' , 'gestureend' , 'focus' , 'blur' , 'change' , 'reset' , 'select' , 'submit' , 'focusin' , 'focusout' , 'load' , 'unload' , 'beforeunload' , 'resize' , 'move' , 'DOMContentLoaded' , 'readystatechange' , 'error' , 'abort' , 'scroll' ] ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Private methods
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
function getUidEvent ( element , uid ) {
return uid && uid + "::" + uidEvent ++ || element . uidEvent || uidEvent ++ ;
}
function getEvent ( element ) {
var uid = getUidEvent ( element ) ;
element . uidEvent = uid ;
2019-03-11 16:13:30 +01:00
eventRegistry [ uid ] = eventRegistry [ uid ] || { } ;
return eventRegistry [ uid ] ;
2019-03-01 17:31:34 +01:00
}
function bootstrapHandler ( element , fn ) {
return function handler ( event ) {
2020-09-14 17:12:06 +02:00
event . delegateTarget = element ;
2019-03-01 17:31:34 +01:00
if ( handler . oneOff ) {
EventHandler . off ( element , event . type , fn ) ;
}
return fn . apply ( element , [ event ] ) ;
} ;
}
function bootstrapDelegationHandler ( element , selector , fn ) {
return function handler ( event ) {
var domElements = element . querySelectorAll ( selector ) ;
for ( var target = event . target ; target && target !== this ; target = target . parentNode ) {
for ( var i = domElements . length ; i -- ; ) {
if ( domElements [ i ] === target ) {
2020-09-14 17:12:06 +02:00
event . delegateTarget = target ;
2019-03-01 17:31:34 +01:00
if ( handler . oneOff ) {
EventHandler . off ( element , event . type , fn ) ;
}
return fn . apply ( target , [ event ] ) ;
}
}
} // To please ESLint
return null ;
} ;
}
function findHandler ( events , handler , delegationSelector ) {
if ( delegationSelector === void 0 ) {
delegationSelector = null ;
}
2019-07-12 23:56:26 +02:00
var uidEventList = Object . keys ( events ) ;
for ( var i = 0 , len = uidEventList . length ; i < len ; i ++ ) {
var event = events [ uidEventList [ i ] ] ;
2019-03-01 17:31:34 +01:00
if ( event . originalHandler === handler && event . delegationSelector === delegationSelector ) {
2019-07-12 23:56:26 +02:00
return event ;
2019-03-01 17:31:34 +01:00
}
}
return null ;
}
function normalizeParams ( originalTypeEvent , handler , delegationFn ) {
var delegation = typeof handler === 'string' ;
var originalHandler = delegation ? delegationFn : handler ; // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
var typeEvent = originalTypeEvent . replace ( stripNameRegex , '' ) ;
var custom = customEvents [ typeEvent ] ;
if ( custom ) {
typeEvent = custom ;
}
var isNative = nativeEvents . indexOf ( typeEvent ) > - 1 ;
if ( ! isNative ) {
typeEvent = originalTypeEvent ;
}
return [ delegation , originalHandler , typeEvent ] ;
}
function addHandler ( element , originalTypeEvent , handler , delegationFn , oneOff ) {
if ( typeof originalTypeEvent !== 'string' || ! element ) {
return ;
}
if ( ! handler ) {
handler = delegationFn ;
delegationFn = null ;
}
var _normalizeParams = normalizeParams ( originalTypeEvent , handler , delegationFn ) ,
delegation = _normalizeParams [ 0 ] ,
originalHandler = _normalizeParams [ 1 ] ,
typeEvent = _normalizeParams [ 2 ] ;
var events = getEvent ( element ) ;
var handlers = events [ typeEvent ] || ( events [ typeEvent ] = { } ) ;
var previousFn = findHandler ( handlers , originalHandler , delegation ? handler : null ) ;
if ( previousFn ) {
previousFn . oneOff = previousFn . oneOff && oneOff ;
return ;
}
var uid = getUidEvent ( originalHandler , originalTypeEvent . replace ( namespaceRegex , '' ) ) ;
2019-03-11 16:13:30 +01:00
var fn = delegation ? bootstrapDelegationHandler ( element , handler , delegationFn ) : bootstrapHandler ( element , handler ) ;
2019-03-01 17:31:34 +01:00
fn . delegationSelector = delegation ? handler : null ;
fn . originalHandler = originalHandler ;
fn . oneOff = oneOff ;
fn . uidEvent = uid ;
handlers [ uid ] = fn ;
element . addEventListener ( typeEvent , fn , delegation ) ;
}
function removeHandler ( element , events , typeEvent , handler , delegationSelector ) {
var fn = findHandler ( events [ typeEvent ] , handler , delegationSelector ) ;
2019-07-12 23:56:26 +02:00
if ( ! fn ) {
2019-03-01 17:31:34 +01:00
return ;
}
element . removeEventListener ( typeEvent , fn , Boolean ( delegationSelector ) ) ;
delete events [ typeEvent ] [ fn . uidEvent ] ;
}
function removeNamespacedHandlers ( element , events , typeEvent , namespace ) {
var storeElementEvent = events [ typeEvent ] || { } ;
Object . keys ( storeElementEvent ) . forEach ( function ( handlerKey ) {
if ( handlerKey . indexOf ( namespace ) > - 1 ) {
var event = storeElementEvent [ handlerKey ] ;
removeHandler ( element , events , typeEvent , event . originalHandler , event . delegationSelector ) ;
2019-01-04 17:29:45 +01:00
}
2019-03-01 17:31:34 +01:00
} ) ;
}
var EventHandler = {
on : function on ( element , event , handler , delegationFn ) {
addHandler ( element , event , handler , delegationFn , false ) ;
2018-11-13 07:41:12 +01:00
} ,
2019-03-01 17:31:34 +01:00
one : function one ( element , event , handler , delegationFn ) {
addHandler ( element , event , handler , delegationFn , true ) ;
} ,
off : function off ( element , originalTypeEvent , handler , delegationFn ) {
if ( typeof originalTypeEvent !== 'string' || ! element ) {
return ;
}
2018-03-31 22:59:37 +02:00
2019-03-01 17:31:34 +01:00
var _normalizeParams2 = normalizeParams ( originalTypeEvent , handler , delegationFn ) ,
delegation = _normalizeParams2 [ 0 ] ,
originalHandler = _normalizeParams2 [ 1 ] ,
typeEvent = _normalizeParams2 [ 2 ] ;
2018-03-31 22:59:37 +02:00
2019-03-01 17:31:34 +01:00
var inNamespace = typeEvent !== originalTypeEvent ;
var events = getEvent ( element ) ;
var isNamespace = originalTypeEvent . charAt ( 0 ) === '.' ;
2018-03-31 22:59:37 +02:00
2019-03-01 17:31:34 +01:00
if ( typeof originalHandler !== 'undefined' ) {
// Simplest case: handler is passed, remove that listener ONLY.
if ( ! events || ! events [ typeEvent ] ) {
return ;
}
removeHandler ( element , events , typeEvent , originalHandler , delegation ? handler : null ) ;
return ;
}
if ( isNamespace ) {
Object . keys ( events ) . forEach ( function ( elementEvent ) {
2019-10-08 08:39:10 +02:00
removeNamespacedHandlers ( element , events , elementEvent , originalTypeEvent . slice ( 1 ) ) ;
2019-03-01 17:31:34 +01:00
} ) ;
}
2018-03-31 22:59:37 +02:00
2019-03-01 17:31:34 +01:00
var storeElementEvent = events [ typeEvent ] || { } ;
Object . keys ( storeElementEvent ) . forEach ( function ( keyHandlers ) {
var handlerKey = keyHandlers . replace ( stripUidRegex , '' ) ;
2018-03-31 22:59:37 +02:00
2019-03-01 17:31:34 +01:00
if ( ! inNamespace || originalTypeEvent . indexOf ( handlerKey ) > - 1 ) {
var event = storeElementEvent [ keyHandlers ] ;
removeHandler ( element , events , typeEvent , event . originalHandler , event . delegationSelector ) ;
}
} ) ;
2018-11-13 07:41:12 +01:00
} ,
2019-03-01 17:31:34 +01:00
trigger : function trigger ( element , event , args ) {
if ( typeof event !== 'string' || ! element ) {
return null ;
}
2020-11-11 18:07:37 +01:00
var $ = getjQuery ( ) ;
2019-03-01 17:31:34 +01:00
var typeEvent = event . replace ( stripNameRegex , '' ) ;
var inNamespace = event !== typeEvent ;
var isNative = nativeEvents . indexOf ( typeEvent ) > - 1 ;
var jQueryEvent ;
var bubbles = true ;
var nativeDispatch = true ;
var defaultPrevented = false ;
var evt = null ;
2019-08-27 15:03:21 +02:00
if ( inNamespace && $ ) {
jQueryEvent = $ . Event ( event , args ) ;
$ ( element ) . trigger ( jQueryEvent ) ;
2019-03-01 17:31:34 +01:00
bubbles = ! jQueryEvent . isPropagationStopped ( ) ;
nativeDispatch = ! jQueryEvent . isImmediatePropagationStopped ( ) ;
defaultPrevented = jQueryEvent . isDefaultPrevented ( ) ;
}
if ( isNative ) {
evt = document . createEvent ( 'HTMLEvents' ) ;
evt . initEvent ( typeEvent , bubbles , true ) ;
} else {
2020-03-28 11:29:08 +01:00
evt = new CustomEvent ( event , {
2019-03-01 17:31:34 +01:00
bubbles : bubbles ,
cancelable : true
} ) ;
2020-09-14 17:12:06 +02:00
} // merge custom information in our event
2019-03-01 17:31:34 +01:00
if ( typeof args !== 'undefined' ) {
Object . keys ( args ) . forEach ( function ( key ) {
Object . defineProperty ( evt , key , {
get : function get ( ) {
return args [ key ] ;
}
} ) ;
} ) ;
}
if ( defaultPrevented ) {
evt . preventDefault ( ) ;
}
if ( nativeDispatch ) {
element . dispatchEvent ( evt ) ;
}
if ( evt . defaultPrevented && typeof jQueryEvent !== 'undefined' ) {
jQueryEvent . preventDefault ( ) ;
}
return evt ;
}
} ;
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'alert' ;
2020-11-11 18:07:37 +01:00
var VERSION = '5.0.0-alpha3' ;
2018-11-13 07:41:12 +01:00
var DATA _KEY = 'bs.alert' ;
var EVENT _KEY = "." + DATA _KEY ;
var DATA _API _KEY = '.data-api' ;
2020-03-28 11:29:08 +01:00
var SELECTOR _DISMISS = '[data-dismiss="alert"]' ;
var EVENT _CLOSE = "close" + EVENT _KEY ;
var EVENT _CLOSED = "closed" + EVENT _KEY ;
var EVENT _CLICK _DATA _API = "click" + EVENT _KEY + DATA _API _KEY ;
var CLASSNAME _ALERT = 'alert' ;
var CLASSNAME _FADE = 'fade' ;
var CLASSNAME _SHOW = 'show' ;
2019-10-08 08:39:10 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var Alert = /*#__PURE__*/ function ( ) {
2018-11-13 07:41:12 +01:00
function Alert ( element ) {
this . _element = element ;
2019-03-01 17:31:34 +01:00
if ( this . _element ) {
Data . setData ( element , DATA _KEY , this ) ;
}
2018-11-13 07:41:12 +01:00
} // Getters
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var _proto = Alert . prototype ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
// Public
_proto . close = function close ( element ) {
2020-09-14 17:12:06 +02:00
var rootElement = element ? this . _getRootElement ( element ) : this . _element ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
var customEvent = this . _triggerCloseEvent ( rootElement ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( customEvent === null || customEvent . defaultPrevented ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _removeElement ( rootElement ) ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . dispose = function dispose ( ) {
2019-03-01 17:31:34 +01:00
Data . removeData ( this . _element , DATA _KEY ) ;
2018-11-13 07:41:12 +01:00
this . _element = null ;
2019-01-04 17:29:45 +01:00
} // Private
;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getRootElement = function _getRootElement ( element ) {
2020-05-13 20:53:43 +02:00
return getElementFromSelector ( element ) || element . closest ( "." + CLASSNAME _ALERT ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _triggerCloseEvent = function _triggerCloseEvent ( element ) {
2020-03-28 11:29:08 +01:00
return EventHandler . trigger ( element , EVENT _CLOSE ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _removeElement = function _removeElement ( element ) {
var _this = this ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
element . classList . remove ( CLASSNAME _SHOW ) ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( ! element . classList . contains ( CLASSNAME _FADE ) ) {
2018-11-13 07:41:12 +01:00
this . _destroyElement ( element ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
var transitionDuration = getTransitionDurationFromElement ( element ) ;
2019-07-24 08:13:50 +02:00
EventHandler . one ( element , TRANSITION _END , function ( ) {
return _this . _destroyElement ( element ) ;
2019-03-01 17:31:34 +01:00
} ) ;
emulateTransitionEnd ( element , transitionDuration ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _destroyElement = function _destroyElement ( element ) {
2019-03-01 17:31:34 +01:00
if ( element . parentNode ) {
element . parentNode . removeChild ( element ) ;
}
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( element , EVENT _CLOSED ) ;
2019-01-04 17:29:45 +01:00
} // Static
;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Alert . jQueryInterface = function jQueryInterface ( config ) {
2018-11-13 07:41:12 +01:00
return this . each ( function ( ) {
2019-03-01 17:31:34 +01:00
var data = Data . getData ( this , DATA _KEY ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! data ) {
data = new Alert ( this ) ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( config === 'close' ) {
data [ config ] ( this ) ;
}
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Alert . handleDismiss = function handleDismiss ( alertInstance ) {
2018-11-13 07:41:12 +01:00
return function ( event ) {
if ( event ) {
event . preventDefault ( ) ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
alertInstance . close ( this ) ;
2017-09-06 06:05:12 +02:00
} ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Alert . getInstance = function getInstance ( element ) {
2019-03-01 17:31:34 +01:00
return Data . getData ( element , DATA _KEY ) ;
} ;
2018-11-13 07:41:12 +01:00
_createClass ( Alert , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION ;
}
} ] ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
return Alert ;
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-06 06:05:12 +02:00
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . on ( document , EVENT _CLICK _DATA _API , SELECTOR _DISMISS , Alert . handleDismiss ( new Alert ( ) ) ) ;
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* add . Alert to jQuery only if jQuery is present
2018-11-13 07:41:12 +01:00
* /
2017-09-06 06:05:12 +02:00
2020-11-11 18:07:37 +01:00
onDOMContentLoaded ( function ( ) {
var $ = getjQuery ( ) ;
/* istanbul ignore if */
2019-07-24 08:13:50 +02:00
2020-11-11 18:07:37 +01:00
if ( $ ) {
var JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
$ . fn [ NAME ] = Alert . jQueryInterface ;
$ . fn [ NAME ] . Constructor = Alert ;
2017-09-06 06:05:12 +02:00
2020-11-11 18:07:37 +01:00
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return Alert . jQueryInterface ;
} ;
}
} ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME$1 = 'button' ;
2020-11-11 18:07:37 +01:00
var VERSION$1 = '5.0.0-alpha3' ;
2018-11-13 07:41:12 +01:00
var DATA _KEY$1 = 'bs.button' ;
var EVENT _KEY$1 = "." + DATA _KEY$1 ;
var DATA _API _KEY$1 = '.data-api' ;
2020-03-28 11:29:08 +01:00
var CLASS _NAME _ACTIVE = 'active' ;
2020-06-16 20:50:01 +02:00
var SELECTOR _DATA _TOGGLE = '[data-toggle="button"]' ;
2020-03-28 11:29:08 +01:00
var EVENT _CLICK _DATA _API$1 = "click" + EVENT _KEY$1 + DATA _API _KEY$1 ;
2019-10-08 08:39:10 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var Button = /*#__PURE__*/ function ( ) {
2018-11-13 07:41:12 +01:00
function Button ( element ) {
this . _element = element ;
2019-03-01 17:31:34 +01:00
Data . setData ( element , DATA _KEY$1 , this ) ;
2018-11-13 07:41:12 +01:00
} // Getters
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var _proto = Button . prototype ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
// Public
_proto . toggle = function toggle ( ) {
2020-06-16 20:50:01 +02:00
// Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method
this . _element . setAttribute ( 'aria-pressed' , this . _element . classList . toggle ( CLASS _NAME _ACTIVE ) ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . dispose = function dispose ( ) {
2019-03-01 17:31:34 +01:00
Data . removeData ( this . _element , DATA _KEY$1 ) ;
2018-11-13 07:41:12 +01:00
this . _element = null ;
2019-01-04 17:29:45 +01:00
} // Static
;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Button . jQueryInterface = function jQueryInterface ( config ) {
2018-11-13 07:41:12 +01:00
return this . each ( function ( ) {
2019-03-01 17:31:34 +01:00
var data = Data . getData ( this , DATA _KEY$1 ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! data ) {
data = new Button ( this ) ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( config === 'toggle' ) {
data [ config ] ( ) ;
2017-09-06 06:05:12 +02:00
}
2018-11-13 07:41:12 +01:00
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Button . getInstance = function getInstance ( element ) {
2019-03-01 17:31:34 +01:00
return Data . getData ( element , DATA _KEY$1 ) ;
} ;
2018-11-13 07:41:12 +01:00
_createClass ( Button , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION$1 ;
}
} ] ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
return Button ;
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-06 06:05:12 +02:00
2020-06-16 20:50:01 +02:00
EventHandler . on ( document , EVENT _CLICK _DATA _API$1 , SELECTOR _DATA _TOGGLE , function ( event ) {
2018-11-13 07:41:12 +01:00
event . preventDefault ( ) ;
2020-06-16 20:50:01 +02:00
var button = event . target . closest ( SELECTOR _DATA _TOGGLE ) ;
2019-03-01 17:31:34 +01:00
var data = Data . getData ( button , DATA _KEY$1 ) ;
if ( ! data ) {
data = new Button ( button ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-30 23:28:03 +02:00
2019-03-01 17:31:34 +01:00
data . toggle ( ) ;
} ) ;
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* add . Button to jQuery only if jQuery is present
2018-11-13 07:41:12 +01:00
* /
2017-09-06 06:05:12 +02:00
2020-11-11 18:07:37 +01:00
onDOMContentLoaded ( function ( ) {
var $ = getjQuery ( ) ;
/* istanbul ignore if */
2019-07-24 08:13:50 +02:00
2020-11-11 18:07:37 +01:00
if ( $ ) {
var JQUERY _NO _CONFLICT = $ . fn [ NAME$1 ] ;
$ . fn [ NAME$1 ] = Button . jQueryInterface ;
$ . fn [ NAME$1 ] . Constructor = Button ;
2019-03-01 17:31:34 +01:00
2020-11-11 18:07:37 +01:00
$ . fn [ NAME$1 ] . noConflict = function ( ) {
$ . fn [ NAME$1 ] = JQUERY _NO _CONFLICT ;
return Button . jQueryInterface ;
} ;
}
} ) ;
2019-03-01 17:31:34 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* Bootstrap ( v5 . 0.0 - alpha3 ) : dom / manipulator . js
2020-06-16 20:50:01 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
2019-03-01 17:31:34 +01:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
function normalizeData ( val ) {
if ( val === 'true' ) {
return true ;
}
if ( val === 'false' ) {
return false ;
}
if ( val === Number ( val ) . toString ( ) ) {
return Number ( val ) ;
}
if ( val === '' || val === 'null' ) {
return null ;
}
return val ;
}
function normalizeDataKey ( key ) {
return key . replace ( /[A-Z]/g , function ( chr ) {
2019-11-08 09:11:23 +01:00
return "-" + chr . toLowerCase ( ) ;
2019-03-01 17:31:34 +01:00
} ) ;
}
var Manipulator = {
setDataAttribute : function setDataAttribute ( element , key , value ) {
element . setAttribute ( "data-" + normalizeDataKey ( key ) , value ) ;
} ,
removeDataAttribute : function removeDataAttribute ( element , key ) {
element . removeAttribute ( "data-" + normalizeDataKey ( key ) ) ;
} ,
getDataAttributes : function getDataAttributes ( element ) {
if ( ! element ) {
return { } ;
}
2020-09-14 17:12:06 +02:00
var attributes = _extends ( { } , element . dataset ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
Object . keys ( attributes ) . forEach ( function ( key ) {
attributes [ key ] = normalizeData ( attributes [ key ] ) ;
} ) ;
return attributes ;
} ,
getDataAttribute : function getDataAttribute ( element , key ) {
return normalizeData ( element . getAttribute ( "data-" + normalizeDataKey ( key ) ) ) ;
} ,
offset : function offset ( element ) {
var rect = element . getBoundingClientRect ( ) ;
return {
top : rect . top + document . body . scrollTop ,
left : rect . left + document . body . scrollLeft
} ;
} ,
position : function position ( element ) {
return {
top : element . offsetTop ,
left : element . offsetLeft
} ;
}
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2020-06-16 20:50:01 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* Bootstrap ( v5 . 0.0 - alpha3 ) : dom / selector - engine . js
2020-06-16 20:50:01 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2020-11-11 18:07:37 +01:00
2020-06-16 20:50:01 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NODE _TEXT = 3 ;
var SelectorEngine = {
matches : function matches ( element , selector ) {
return element . matches ( selector ) ;
} ,
2020-11-11 18:07:37 +01:00
find : function find ( selector , element ) {
2020-06-16 20:50:01 +02:00
var _ref ;
if ( element === void 0 ) {
element = document . documentElement ;
}
2020-11-11 18:07:37 +01:00
return ( _ref = [ ] ) . concat . apply ( _ref , Element . prototype . querySelectorAll . call ( element , selector ) ) ;
2020-06-16 20:50:01 +02:00
} ,
2020-11-11 18:07:37 +01:00
findOne : function findOne ( selector , element ) {
2020-06-16 20:50:01 +02:00
if ( element === void 0 ) {
element = document . documentElement ;
}
2020-11-11 18:07:37 +01:00
return Element . prototype . querySelector . call ( element , selector ) ;
2020-06-16 20:50:01 +02:00
} ,
children : function children ( element , selector ) {
var _ref2 ;
var children = ( _ref2 = [ ] ) . concat . apply ( _ref2 , element . children ) ;
return children . filter ( function ( child ) {
return child . matches ( selector ) ;
} ) ;
} ,
parents : function parents ( element , selector ) {
var parents = [ ] ;
var ancestor = element . parentNode ;
while ( ancestor && ancestor . nodeType === Node . ELEMENT _NODE && ancestor . nodeType !== NODE _TEXT ) {
if ( this . matches ( ancestor , selector ) ) {
parents . push ( ancestor ) ;
}
ancestor = ancestor . parentNode ;
}
return parents ;
} ,
prev : function prev ( element , selector ) {
var previous = element . previousElementSibling ;
while ( previous ) {
if ( previous . matches ( selector ) ) {
return [ previous ] ;
}
previous = previous . previousElementSibling ;
}
return [ ] ;
} ,
next : function next ( element , selector ) {
var next = element . nextElementSibling ;
while ( next ) {
if ( this . matches ( next , selector ) ) {
return [ next ] ;
}
next = next . nextElementSibling ;
}
return [ ] ;
}
} ;
2017-09-06 06:05:12 +02:00
/ * *
2018-11-13 07:41:12 +01:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
var NAME$2 = 'carousel' ;
2020-11-11 18:07:37 +01:00
var VERSION$2 = '5.0.0-alpha3' ;
2018-11-13 07:41:12 +01:00
var DATA _KEY$2 = 'bs.carousel' ;
var EVENT _KEY$2 = "." + DATA _KEY$2 ;
var DATA _API _KEY$2 = '.data-api' ;
2020-05-13 20:53:43 +02:00
var ARROW _LEFT _KEY = 'ArrowLeft' ;
var ARROW _RIGHT _KEY = 'ArrowRight' ;
2018-11-13 07:41:12 +01:00
var TOUCHEVENT _COMPAT _WAIT = 500 ; // Time for mouse compat events to fire after touch
var SWIPE _THRESHOLD = 40 ;
var Default = {
interval : 5000 ,
keyboard : true ,
slide : false ,
pause : 'hover' ,
wrap : true ,
touch : true
} ;
var DefaultType = {
interval : '(number|boolean)' ,
keyboard : 'boolean' ,
slide : '(boolean|string)' ,
pause : '(string|boolean)' ,
wrap : 'boolean' ,
touch : 'boolean'
} ;
2020-03-28 11:29:08 +01:00
var DIRECTION _NEXT = 'next' ;
var DIRECTION _PREV = 'prev' ;
var DIRECTION _LEFT = 'left' ;
var DIRECTION _RIGHT = 'right' ;
var EVENT _SLIDE = "slide" + EVENT _KEY$2 ;
var EVENT _SLID = "slid" + EVENT _KEY$2 ;
var EVENT _KEYDOWN = "keydown" + EVENT _KEY$2 ;
var EVENT _MOUSEENTER = "mouseenter" + EVENT _KEY$2 ;
var EVENT _MOUSELEAVE = "mouseleave" + EVENT _KEY$2 ;
var EVENT _TOUCHSTART = "touchstart" + EVENT _KEY$2 ;
var EVENT _TOUCHMOVE = "touchmove" + EVENT _KEY$2 ;
var EVENT _TOUCHEND = "touchend" + EVENT _KEY$2 ;
var EVENT _POINTERDOWN = "pointerdown" + EVENT _KEY$2 ;
var EVENT _POINTERUP = "pointerup" + EVENT _KEY$2 ;
var EVENT _DRAG _START = "dragstart" + EVENT _KEY$2 ;
var EVENT _LOAD _DATA _API = "load" + EVENT _KEY$2 + DATA _API _KEY$2 ;
var EVENT _CLICK _DATA _API$2 = "click" + EVENT _KEY$2 + DATA _API _KEY$2 ;
var CLASS _NAME _CAROUSEL = 'carousel' ;
var CLASS _NAME _ACTIVE$1 = 'active' ;
var CLASS _NAME _SLIDE = 'slide' ;
var CLASS _NAME _RIGHT = 'carousel-item-right' ;
var CLASS _NAME _LEFT = 'carousel-item-left' ;
var CLASS _NAME _NEXT = 'carousel-item-next' ;
var CLASS _NAME _PREV = 'carousel-item-prev' ;
var CLASS _NAME _POINTER _EVENT = 'pointer-event' ;
2020-06-16 20:50:01 +02:00
var SELECTOR _ACTIVE = '.active' ;
2020-03-28 11:29:08 +01:00
var SELECTOR _ACTIVE _ITEM = '.active.carousel-item' ;
var SELECTOR _ITEM = '.carousel-item' ;
var SELECTOR _ITEM _IMG = '.carousel-item img' ;
var SELECTOR _NEXT _PREV = '.carousel-item-next, .carousel-item-prev' ;
var SELECTOR _INDICATORS = '.carousel-indicators' ;
var SELECTOR _DATA _SLIDE = '[data-slide], [data-slide-to]' ;
var SELECTOR _DATA _RIDE = '[data-ride="carousel"]' ;
2018-11-13 07:41:12 +01:00
var PointerType = {
TOUCH : 'touch' ,
PEN : 'pen'
} ;
2019-10-08 08:39:10 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-03-31 22:59:37 +02:00
2020-03-28 11:29:08 +01:00
var Carousel = /*#__PURE__*/ function ( ) {
2018-11-13 07:41:12 +01:00
function Carousel ( element , config ) {
this . _items = null ;
this . _interval = null ;
this . _activeElement = null ;
this . _isPaused = false ;
this . _isSliding = false ;
this . touchTimeout = null ;
this . touchStartX = 0 ;
this . touchDeltaX = 0 ;
this . _config = this . _getConfig ( config ) ;
this . _element = element ;
2020-03-28 11:29:08 +01:00
this . _indicatorsElement = SelectorEngine . findOne ( SELECTOR _INDICATORS , this . _element ) ;
2018-11-13 07:41:12 +01:00
this . _touchSupported = 'ontouchstart' in document . documentElement || navigator . maxTouchPoints > 0 ;
2020-05-13 20:53:43 +02:00
this . _pointerEvent = Boolean ( window . PointerEvent ) ;
2018-11-13 07:41:12 +01:00
this . _addEventListeners ( ) ;
2019-03-01 17:31:34 +01:00
Data . setData ( element , DATA _KEY$2 , this ) ;
2018-11-13 07:41:12 +01:00
} // Getters
var _proto = Carousel . prototype ;
// Public
_proto . next = function next ( ) {
if ( ! this . _isSliding ) {
2020-03-28 11:29:08 +01:00
this . _slide ( DIRECTION _NEXT ) ;
2018-11-13 07:41:12 +01:00
}
2018-03-31 22:59:37 +02:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . nextWhenVisible = function nextWhenVisible ( ) {
// Don't call next when the page isn't visible
// or the carousel or its parent isn't visible
2019-03-01 17:31:34 +01:00
if ( ! document . hidden && isVisible ( this . _element ) ) {
2018-11-13 07:41:12 +01:00
this . next ( ) ;
}
2017-09-06 06:05:12 +02:00
} ;
2018-11-13 07:41:12 +01:00
_proto . prev = function prev ( ) {
if ( ! this . _isSliding ) {
2020-03-28 11:29:08 +01:00
this . _slide ( DIRECTION _PREV ) ;
2018-11-13 07:41:12 +01:00
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . pause = function pause ( event ) {
if ( ! event ) {
this . _isPaused = true ;
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( SelectorEngine . findOne ( SELECTOR _NEXT _PREV , this . _element ) ) {
2019-03-01 17:31:34 +01:00
triggerTransitionEnd ( this . _element ) ;
2018-11-13 07:41:12 +01:00
this . cycle ( true ) ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
clearInterval ( this . _interval ) ;
this . _interval = null ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . cycle = function cycle ( event ) {
if ( ! event ) {
this . _isPaused = false ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _interval ) {
2018-03-31 22:59:37 +02:00
clearInterval ( this . _interval ) ;
this . _interval = null ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( this . _config && this . _config . interval && ! this . _isPaused ) {
2020-11-11 18:07:37 +01:00
this . _updateInterval ( ) ;
2018-11-13 07:41:12 +01:00
this . _interval = setInterval ( ( document . visibilityState ? this . nextWhenVisible : this . next ) . bind ( this ) , this . _config . interval ) ;
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . to = function to ( index ) {
var _this = this ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
this . _activeElement = SelectorEngine . findOne ( SELECTOR _ACTIVE _ITEM , this . _element ) ;
2018-02-19 23:50:56 +01:00
2018-11-13 07:41:12 +01:00
var activeIndex = this . _getItemIndex ( this . _activeElement ) ;
2018-02-19 23:50:56 +01:00
2018-11-13 07:41:12 +01:00
if ( index > this . _items . length - 1 || index < 0 ) {
return ;
}
2018-02-19 23:50:56 +01:00
2018-11-13 07:41:12 +01:00
if ( this . _isSliding ) {
2020-03-28 11:29:08 +01:00
EventHandler . one ( this . _element , EVENT _SLID , function ( ) {
2018-11-13 07:41:12 +01:00
return _this . to ( index ) ;
} ) ;
return ;
}
2018-02-19 23:50:56 +01:00
2018-11-13 07:41:12 +01:00
if ( activeIndex === index ) {
this . pause ( ) ;
this . cycle ( ) ;
return ;
}
2018-02-19 23:50:56 +01:00
2020-03-28 11:29:08 +01:00
var direction = index > activeIndex ? DIRECTION _NEXT : DIRECTION _PREV ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _slide ( direction , this . _items [ index ] ) ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . dispose = function dispose ( ) {
2019-03-01 17:31:34 +01:00
EventHandler . off ( this . _element , EVENT _KEY$2 ) ;
Data . removeData ( this . _element , DATA _KEY$2 ) ;
2018-11-13 07:41:12 +01:00
this . _items = null ;
this . _config = null ;
this . _element = null ;
this . _interval = null ;
this . _isPaused = null ;
this . _isSliding = null ;
this . _activeElement = null ;
this . _indicatorsElement = null ;
2019-01-04 17:29:45 +01:00
} // Private
;
2018-11-13 07:41:12 +01:00
_proto . _getConfig = function _getConfig ( config ) {
2020-09-14 17:12:06 +02:00
config = _extends ( { } , Default , config ) ;
2019-03-01 17:31:34 +01:00
typeCheckConfig ( NAME$2 , config , DefaultType ) ;
2018-11-13 07:41:12 +01:00
return config ;
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _handleSwipe = function _handleSwipe ( ) {
var absDeltax = Math . abs ( this . touchDeltaX ) ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
if ( absDeltax <= SWIPE _THRESHOLD ) {
return ;
}
2018-03-31 22:59:37 +02:00
2019-04-18 13:47:52 +02:00
var direction = absDeltax / this . touchDeltaX ;
this . touchDeltaX = 0 ; // swipe left
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
if ( direction > 0 ) {
this . prev ( ) ;
} // swipe right
2018-03-31 22:59:37 +02:00
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( direction < 0 ) {
this . next ( ) ;
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _addEventListeners = function _addEventListeners ( ) {
var _this2 = this ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _config . keyboard ) {
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _KEYDOWN , function ( event ) {
2018-11-13 07:41:12 +01:00
return _this2 . _keydown ( event ) ;
} ) ;
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _config . pause === 'hover' ) {
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _MOUSEENTER , function ( event ) {
2018-11-13 07:41:12 +01:00
return _this2 . pause ( event ) ;
2019-03-01 17:31:34 +01:00
} ) ;
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _MOUSELEAVE , function ( event ) {
2018-11-13 07:41:12 +01:00
return _this2 . cycle ( event ) ;
} ) ;
}
2017-09-30 23:28:03 +02:00
2019-07-24 08:13:50 +02:00
if ( this . _config . touch && this . _touchSupported ) {
2019-02-11 20:15:34 +01:00
this . _addTouchEventListeners ( ) ;
}
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _addTouchEventListeners = function _addTouchEventListeners ( ) {
var _this3 = this ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
var start = function start ( event ) {
2019-03-01 17:31:34 +01:00
if ( _this3 . _pointerEvent && PointerType [ event . pointerType . toUpperCase ( ) ] ) {
_this3 . touchStartX = event . clientX ;
2018-11-13 07:41:12 +01:00
} else if ( ! _this3 . _pointerEvent ) {
2019-03-01 17:31:34 +01:00
_this3 . touchStartX = event . touches [ 0 ] . clientX ;
2018-03-31 22:59:37 +02:00
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var move = function move ( event ) {
// ensure swiping with one touch and not pinching
2019-03-01 17:31:34 +01:00
if ( event . touches && event . touches . length > 1 ) {
2018-11-13 07:41:12 +01:00
_this3 . touchDeltaX = 0 ;
} else {
2019-03-01 17:31:34 +01:00
_this3 . touchDeltaX = event . touches [ 0 ] . clientX - _this3 . touchStartX ;
2018-11-13 07:41:12 +01:00
}
2018-03-31 22:59:37 +02:00
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
var end = function end ( event ) {
2019-03-01 17:31:34 +01:00
if ( _this3 . _pointerEvent && PointerType [ event . pointerType . toUpperCase ( ) ] ) {
_this3 . touchDeltaX = event . clientX - _this3 . touchStartX ;
2018-11-13 07:41:12 +01:00
}
_this3 . _handleSwipe ( ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( _this3 . _config . pause === 'hover' ) {
// If it's a touch-enabled device, mouseenter/leave are fired as
// part of the mouse compatibility events on first tap - the carousel
// would stop cycling until user tapped out of it;
// here, we listen for touchend, explicitly pause the carousel
// (as if it's the second time we tap on it, mouseenter compat event
// is NOT fired) and after a timeout (to allow for mouse compatibility
// events to fire) we explicitly restart cycling
_this3 . pause ( ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( _this3 . touchTimeout ) {
clearTimeout ( _this3 . touchTimeout ) ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_this3 . touchTimeout = setTimeout ( function ( event ) {
return _this3 . cycle ( event ) ;
} , TOUCHEVENT _COMPAT _WAIT + _this3 . _config . interval ) ;
2018-03-31 22:59:37 +02:00
}
} ;
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
SelectorEngine . find ( SELECTOR _ITEM _IMG , this . _element ) . forEach ( function ( itemImg ) {
EventHandler . on ( itemImg , EVENT _DRAG _START , function ( e ) {
2019-03-01 17:31:34 +01:00
return e . preventDefault ( ) ;
} ) ;
2018-11-13 07:41:12 +01:00
} ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _pointerEvent ) {
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _POINTERDOWN , function ( event ) {
2018-11-13 07:41:12 +01:00
return start ( event ) ;
} ) ;
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _POINTERUP , function ( event ) {
2018-11-13 07:41:12 +01:00
return end ( event ) ;
} ) ;
2018-03-31 22:59:37 +02:00
2020-03-28 11:29:08 +01:00
this . _element . classList . add ( CLASS _NAME _POINTER _EVENT ) ;
2018-11-13 07:41:12 +01:00
} else {
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _TOUCHSTART , function ( event ) {
2018-11-13 07:41:12 +01:00
return start ( event ) ;
2018-03-31 22:59:37 +02:00
} ) ;
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _TOUCHMOVE , function ( event ) {
2018-11-13 07:41:12 +01:00
return move ( event ) ;
} ) ;
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _TOUCHEND , function ( event ) {
2018-11-13 07:41:12 +01:00
return end ( event ) ;
} ) ;
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _keydown = function _keydown ( event ) {
if ( /input|textarea/i . test ( event . target . tagName ) ) {
return ;
}
2017-09-06 06:05:12 +02:00
2020-05-13 20:53:43 +02:00
switch ( event . key ) {
case ARROW _LEFT _KEY :
2018-11-13 07:41:12 +01:00
event . preventDefault ( ) ;
this . prev ( ) ;
break ;
2017-09-06 06:05:12 +02:00
2020-05-13 20:53:43 +02:00
case ARROW _RIGHT _KEY :
2018-11-13 07:41:12 +01:00
event . preventDefault ( ) ;
this . next ( ) ;
break ;
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getItemIndex = function _getItemIndex ( element ) {
2020-03-28 11:29:08 +01:00
this . _items = element && element . parentNode ? SelectorEngine . find ( SELECTOR _ITEM , element . parentNode ) : [ ] ;
2018-11-13 07:41:12 +01:00
return this . _items . indexOf ( element ) ;
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getItemByDirection = function _getItemByDirection ( direction , activeElement ) {
2020-03-28 11:29:08 +01:00
var isNextDirection = direction === DIRECTION _NEXT ;
var isPrevDirection = direction === DIRECTION _PREV ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
var activeIndex = this . _getItemIndex ( activeElement ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
var lastItemIndex = this . _items . length - 1 ;
var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( isGoingToWrap && ! this . _config . wrap ) {
return activeElement ;
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var delta = direction === DIRECTION _PREV ? - 1 : 1 ;
2018-11-13 07:41:12 +01:00
var itemIndex = ( activeIndex + delta ) % this . _items . length ;
return itemIndex === - 1 ? this . _items [ this . _items . length - 1 ] : this . _items [ itemIndex ] ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _triggerSlideEvent = function _triggerSlideEvent ( relatedTarget , eventDirectionName ) {
var targetIndex = this . _getItemIndex ( relatedTarget ) ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var fromIndex = this . _getItemIndex ( SelectorEngine . findOne ( SELECTOR _ACTIVE _ITEM , this . _element ) ) ;
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
return EventHandler . trigger ( this . _element , EVENT _SLIDE , {
2018-11-13 07:41:12 +01:00
relatedTarget : relatedTarget ,
direction : eventDirectionName ,
from : fromIndex ,
to : targetIndex
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _setActiveIndicatorElement = function _setActiveIndicatorElement ( element ) {
if ( this . _indicatorsElement ) {
2020-06-16 20:50:01 +02:00
var indicators = SelectorEngine . find ( SELECTOR _ACTIVE , this . _indicatorsElement ) ;
2019-03-01 17:31:34 +01:00
for ( var i = 0 ; i < indicators . length ; i ++ ) {
2020-03-28 11:29:08 +01:00
indicators [ i ] . classList . remove ( CLASS _NAME _ACTIVE$1 ) ;
2019-03-01 17:31:34 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var nextIndicator = this . _indicatorsElement . children [ this . _getItemIndex ( element ) ] ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( nextIndicator ) {
2020-03-28 11:29:08 +01:00
nextIndicator . classList . add ( CLASS _NAME _ACTIVE$1 ) ;
2018-03-31 22:59:37 +02:00
}
2018-11-13 07:41:12 +01:00
}
} ;
2017-09-06 06:05:12 +02:00
2020-11-11 18:07:37 +01:00
_proto . _updateInterval = function _updateInterval ( ) {
var element = this . _activeElement || SelectorEngine . findOne ( SELECTOR _ACTIVE _ITEM , this . _element ) ;
if ( ! element ) {
return ;
}
var elementInterval = parseInt ( element . getAttribute ( 'data-interval' ) , 10 ) ;
if ( elementInterval ) {
this . _config . defaultInterval = this . _config . defaultInterval || this . _config . interval ;
this . _config . interval = elementInterval ;
} else {
this . _config . interval = this . _config . defaultInterval || this . _config . interval ;
}
} ;
2018-11-13 07:41:12 +01:00
_proto . _slide = function _slide ( direction , element ) {
var _this4 = this ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var activeElement = SelectorEngine . findOne ( SELECTOR _ACTIVE _ITEM , this . _element ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var activeElementIndex = this . _getItemIndex ( activeElement ) ;
2018-09-19 06:35:40 +02:00
2018-11-13 07:41:12 +01:00
var nextElement = element || activeElement && this . _getItemByDirection ( direction , activeElement ) ;
2018-09-19 06:35:40 +02:00
2018-11-13 07:41:12 +01:00
var nextElementIndex = this . _getItemIndex ( nextElement ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var isCycling = Boolean ( this . _interval ) ;
var directionalClassName ;
var orderClassName ;
var eventDirectionName ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( direction === DIRECTION _NEXT ) {
directionalClassName = CLASS _NAME _LEFT ;
orderClassName = CLASS _NAME _NEXT ;
eventDirectionName = DIRECTION _LEFT ;
2018-11-13 07:41:12 +01:00
} else {
2020-03-28 11:29:08 +01:00
directionalClassName = CLASS _NAME _RIGHT ;
orderClassName = CLASS _NAME _PREV ;
eventDirectionName = DIRECTION _RIGHT ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( nextElement && nextElement . classList . contains ( CLASS _NAME _ACTIVE$1 ) ) {
2018-11-13 07:41:12 +01:00
this . _isSliding = false ;
return ;
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
var slideEvent = this . _triggerSlideEvent ( nextElement , eventDirectionName ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( slideEvent . defaultPrevented ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! activeElement || ! nextElement ) {
// Some weirdness is happening, so we bail
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _isSliding = true ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
if ( isCycling ) {
this . pause ( ) ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _setActiveIndicatorElement ( nextElement ) ;
2017-09-30 23:28:03 +02:00
2020-11-11 18:07:37 +01:00
this . _activeElement = nextElement ;
2020-03-28 11:29:08 +01:00
if ( this . _element . classList . contains ( CLASS _NAME _SLIDE ) ) {
2019-03-01 17:31:34 +01:00
nextElement . classList . add ( orderClassName ) ;
reflow ( nextElement ) ;
activeElement . classList . add ( directionalClassName ) ;
nextElement . classList . add ( directionalClassName ) ;
var transitionDuration = getTransitionDurationFromElement ( activeElement ) ;
EventHandler . one ( activeElement , TRANSITION _END , function ( ) {
2020-05-13 20:53:43 +02:00
nextElement . classList . remove ( directionalClassName , orderClassName ) ;
2020-03-28 11:29:08 +01:00
nextElement . classList . add ( CLASS _NAME _ACTIVE$1 ) ;
2020-05-13 20:53:43 +02:00
activeElement . classList . remove ( CLASS _NAME _ACTIVE$1 , orderClassName , directionalClassName ) ;
2018-11-13 07:41:12 +01:00
_this4 . _isSliding = false ;
setTimeout ( function ( ) {
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( _this4 . _element , EVENT _SLID , {
2019-03-01 17:31:34 +01:00
relatedTarget : nextElement ,
direction : eventDirectionName ,
from : activeElementIndex ,
to : nextElementIndex
} ) ;
2018-11-13 07:41:12 +01:00
} , 0 ) ;
2019-03-01 17:31:34 +01:00
} ) ;
emulateTransitionEnd ( activeElement , transitionDuration ) ;
2018-11-13 07:41:12 +01:00
} else {
2020-03-28 11:29:08 +01:00
activeElement . classList . remove ( CLASS _NAME _ACTIVE$1 ) ;
nextElement . classList . add ( CLASS _NAME _ACTIVE$1 ) ;
2018-11-13 07:41:12 +01:00
this . _isSliding = false ;
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( this . _element , EVENT _SLID , {
2019-03-01 17:31:34 +01:00
relatedTarget : nextElement ,
direction : eventDirectionName ,
from : activeElementIndex ,
to : nextElementIndex
} ) ;
2018-11-13 07:41:12 +01:00
}
if ( isCycling ) {
this . cycle ( ) ;
}
2019-01-04 17:29:45 +01:00
} // Static
;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Carousel . carouselInterface = function carouselInterface ( element , config ) {
2019-03-01 17:31:34 +01:00
var data = Data . getData ( element , DATA _KEY$2 ) ;
2017-09-06 06:05:12 +02:00
2020-09-14 17:12:06 +02:00
var _config = _extends ( { } , Default , Manipulator . getDataAttributes ( element ) ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( typeof config === 'object' ) {
2020-09-14 17:12:06 +02:00
_config = _extends ( { } , _config , config ) ;
2019-03-01 17:31:34 +01:00
}
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
var action = typeof config === 'string' ? config : _config . slide ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( ! data ) {
data = new Carousel ( element , _config ) ;
}
if ( typeof config === 'number' ) {
data . to ( config ) ;
} else if ( typeof action === 'string' ) {
if ( typeof data [ action ] === 'undefined' ) {
2019-03-11 16:13:30 +01:00
throw new TypeError ( "No method named \"" + action + "\"" ) ;
2018-03-31 22:59:37 +02:00
}
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
data [ action ] ( ) ;
} else if ( _config . interval && _config . ride ) {
data . pause ( ) ;
data . cycle ( ) ;
}
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Carousel . jQueryInterface = function jQueryInterface ( config ) {
2019-03-01 17:31:34 +01:00
return this . each ( function ( ) {
2019-08-27 15:03:21 +02:00
Carousel . carouselInterface ( this , config ) ;
2018-11-13 07:41:12 +01:00
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Carousel . dataApiClickHandler = function dataApiClickHandler ( event ) {
var target = getElementFromSelector ( this ) ;
2018-11-13 07:41:12 +01:00
2020-03-28 11:29:08 +01:00
if ( ! target || ! target . classList . contains ( CLASS _NAME _CAROUSEL ) ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2020-09-14 17:12:06 +02:00
var config = _extends ( { } , Manipulator . getDataAttributes ( target ) , Manipulator . getDataAttributes ( this ) ) ;
2018-06-22 07:55:23 +02:00
2018-11-13 07:41:12 +01:00
var slideIndex = this . getAttribute ( 'data-slide-to' ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( slideIndex ) {
config . interval = false ;
2018-06-22 07:55:23 +02:00
}
2017-09-30 23:28:03 +02:00
2019-08-27 15:03:21 +02:00
Carousel . carouselInterface ( target , config ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( slideIndex ) {
2019-03-01 17:31:34 +01:00
Data . getData ( target , DATA _KEY$2 ) . to ( slideIndex ) ;
2018-11-13 07:41:12 +01:00
}
event . preventDefault ( ) ;
2018-03-31 22:59:37 +02:00
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Carousel . getInstance = function getInstance ( element ) {
2019-03-01 17:31:34 +01:00
return Data . getData ( element , DATA _KEY$2 ) ;
} ;
2018-11-13 07:41:12 +01:00
_createClass ( Carousel , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION$2 ;
}
} , {
key : "Default" ,
get : function get ( ) {
return Default ;
}
} ] ) ;
2018-03-31 22:59:37 +02:00
return Carousel ;
2018-11-13 07:41:12 +01:00
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2020-03-28 11:29:08 +01:00
EventHandler . on ( document , EVENT _CLICK _DATA _API$2 , SELECTOR _DATA _SLIDE , Carousel . dataApiClickHandler ) ;
EventHandler . on ( window , EVENT _LOAD _DATA _API , function ( ) {
var carousels = SelectorEngine . find ( SELECTOR _DATA _RIDE ) ;
2018-11-13 07:41:12 +01:00
for ( var i = 0 , len = carousels . length ; i < len ; i ++ ) {
2019-08-27 15:03:21 +02:00
Carousel . carouselInterface ( carousels [ i ] , Data . getData ( carousels [ i ] , DATA _KEY$2 ) ) ;
2018-11-13 07:41:12 +01:00
}
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* add . Carousel to jQuery only if jQuery is present
2018-11-13 07:41:12 +01:00
* /
2020-11-11 18:07:37 +01:00
onDOMContentLoaded ( function ( ) {
var $ = getjQuery ( ) ;
/* istanbul ignore if */
2019-07-24 08:13:50 +02:00
2020-11-11 18:07:37 +01:00
if ( $ ) {
var JQUERY _NO _CONFLICT = $ . fn [ NAME$2 ] ;
$ . fn [ NAME$2 ] = Carousel . jQueryInterface ;
$ . fn [ NAME$2 ] . Constructor = Carousel ;
2018-11-13 07:41:12 +01:00
2020-11-11 18:07:37 +01:00
$ . fn [ NAME$2 ] . noConflict = function ( ) {
$ . fn [ NAME$2 ] = JQUERY _NO _CONFLICT ;
return Carousel . jQueryInterface ;
} ;
}
} ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var NAME$3 = 'collapse' ;
2020-11-11 18:07:37 +01:00
var VERSION$3 = '5.0.0-alpha3' ;
2018-11-13 07:41:12 +01:00
var DATA _KEY$3 = 'bs.collapse' ;
var EVENT _KEY$3 = "." + DATA _KEY$3 ;
var DATA _API _KEY$3 = '.data-api' ;
var Default$1 = {
toggle : true ,
parent : ''
} ;
var DefaultType$1 = {
toggle : 'boolean' ,
parent : '(string|element)'
} ;
2020-03-28 11:29:08 +01:00
var EVENT _SHOW = "show" + EVENT _KEY$3 ;
var EVENT _SHOWN = "shown" + EVENT _KEY$3 ;
var EVENT _HIDE = "hide" + EVENT _KEY$3 ;
var EVENT _HIDDEN = "hidden" + EVENT _KEY$3 ;
var EVENT _CLICK _DATA _API$3 = "click" + EVENT _KEY$3 + DATA _API _KEY$3 ;
var CLASS _NAME _SHOW = 'show' ;
var CLASS _NAME _COLLAPSE = 'collapse' ;
var CLASS _NAME _COLLAPSING = 'collapsing' ;
var CLASS _NAME _COLLAPSED = 'collapsed' ;
var WIDTH = 'width' ;
var HEIGHT = 'height' ;
var SELECTOR _ACTIVES = '.show, .collapsing' ;
var SELECTOR _DATA _TOGGLE$1 = '[data-toggle="collapse"]' ;
2019-10-08 08:39:10 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-04 01:03:22 +01:00
2020-03-28 11:29:08 +01:00
var Collapse = /*#__PURE__*/ function ( ) {
2018-11-13 07:41:12 +01:00
function Collapse ( element , config ) {
this . _isTransitioning = false ;
this . _element = element ;
this . _config = this . _getConfig ( config ) ;
2020-03-28 11:29:08 +01:00
this . _triggerArray = SelectorEngine . find ( SELECTOR _DATA _TOGGLE$1 + "[href=\"#" + element . id + "\"]," + ( SELECTOR _DATA _TOGGLE$1 + "[data-target=\"#" + element . id + "\"]" ) ) ;
var toggleList = SelectorEngine . find ( SELECTOR _DATA _TOGGLE$1 ) ;
2018-11-13 07:41:12 +01:00
for ( var i = 0 , len = toggleList . length ; i < len ; i ++ ) {
var elem = toggleList [ i ] ;
2019-03-01 17:31:34 +01:00
var selector = getSelectorFromElement ( elem ) ;
2020-03-28 11:29:08 +01:00
var filterElement = SelectorEngine . find ( selector ) . filter ( function ( foundElem ) {
2018-11-13 07:41:12 +01:00
return foundElem === element ;
} ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( selector !== null && filterElement . length ) {
2018-11-13 07:41:12 +01:00
this . _selector = selector ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _triggerArray . push ( elem ) ;
2018-03-31 22:59:37 +02:00
}
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _parent = this . _config . parent ? this . _getParent ( ) : null ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! this . _config . parent ) {
this . _addAriaAndCollapsedClass ( this . _element , this . _triggerArray ) ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _config . toggle ) {
this . toggle ( ) ;
}
2019-03-01 17:31:34 +01:00
Data . setData ( element , DATA _KEY$3 , this ) ;
2018-11-13 07:41:12 +01:00
} // Getters
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var _proto = Collapse . prototype ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
// Public
_proto . toggle = function toggle ( ) {
2020-03-28 11:29:08 +01:00
if ( this . _element . classList . contains ( CLASS _NAME _SHOW ) ) {
2018-11-13 07:41:12 +01:00
this . hide ( ) ;
} else {
this . show ( ) ;
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . show = function show ( ) {
var _this = this ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( this . _isTransitioning || this . _element . classList . contains ( CLASS _NAME _SHOW ) ) {
2018-11-13 07:41:12 +01:00
return ;
}
2018-09-17 21:34:34 +02:00
2018-11-13 07:41:12 +01:00
var actives ;
var activesData ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _parent ) {
2020-03-28 11:29:08 +01:00
actives = SelectorEngine . find ( SELECTOR _ACTIVES , this . _parent ) . filter ( function ( elem ) {
2018-11-13 07:41:12 +01:00
if ( typeof _this . _config . parent === 'string' ) {
return elem . getAttribute ( 'data-parent' ) === _this . _config . parent ;
2018-03-31 22:59:37 +02:00
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
return elem . classList . contains ( CLASS _NAME _COLLAPSE ) ;
2018-11-13 07:41:12 +01:00
} ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( actives . length === 0 ) {
actives = null ;
2017-09-06 06:05:12 +02:00
}
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
var container = SelectorEngine . findOne ( this . _selector ) ;
2018-11-13 07:41:12 +01:00
if ( actives ) {
2019-03-01 17:31:34 +01:00
var tempActiveData = actives . filter ( function ( elem ) {
return container !== elem ;
} ) ;
activesData = tempActiveData [ 0 ] ? Data . getData ( tempActiveData [ 0 ] , DATA _KEY$3 ) : null ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( activesData && activesData . _isTransitioning ) {
2018-03-31 22:59:37 +02:00
return ;
}
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var startEvent = EventHandler . trigger ( this . _element , EVENT _SHOW ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( startEvent . defaultPrevented ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( actives ) {
2019-03-01 17:31:34 +01:00
actives . forEach ( function ( elemActive ) {
if ( container !== elemActive ) {
2019-08-27 15:03:21 +02:00
Collapse . collapseInterface ( elemActive , 'hide' ) ;
2019-03-01 17:31:34 +01:00
}
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( ! activesData ) {
Data . setData ( elemActive , DATA _KEY$3 , null ) ;
}
} ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var dimension = this . _getDimension ( ) ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
this . _element . classList . remove ( CLASS _NAME _COLLAPSE ) ;
2019-03-01 17:31:34 +01:00
2020-03-28 11:29:08 +01:00
this . _element . classList . add ( CLASS _NAME _COLLAPSING ) ;
2019-03-01 17:31:34 +01:00
2018-11-13 07:41:12 +01:00
this . _element . style [ dimension ] = 0 ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _triggerArray . length ) {
2019-03-01 17:31:34 +01:00
this . _triggerArray . forEach ( function ( element ) {
2020-03-28 11:29:08 +01:00
element . classList . remove ( CLASS _NAME _COLLAPSED ) ;
2019-03-01 17:31:34 +01:00
element . setAttribute ( 'aria-expanded' , true ) ;
} ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . setTransitioning ( true ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var complete = function complete ( ) {
2020-03-28 11:29:08 +01:00
_this . _element . classList . remove ( CLASS _NAME _COLLAPSING ) ;
2019-03-01 17:31:34 +01:00
2020-05-13 20:53:43 +02:00
_this . _element . classList . add ( CLASS _NAME _COLLAPSE , CLASS _NAME _SHOW ) ;
2019-03-01 17:31:34 +01:00
2018-11-13 07:41:12 +01:00
_this . _element . style [ dimension ] = '' ;
_this . setTransitioning ( false ) ;
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( _this . _element , EVENT _SHOWN ) ;
2018-03-31 22:59:37 +02:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var capitalizedDimension = dimension [ 0 ] . toUpperCase ( ) + dimension . slice ( 1 ) ;
var scrollSize = "scroll" + capitalizedDimension ;
2019-03-01 17:31:34 +01:00
var transitionDuration = getTransitionDurationFromElement ( this . _element ) ;
EventHandler . one ( this . _element , TRANSITION _END , complete ) ;
emulateTransitionEnd ( this . _element , transitionDuration ) ;
2018-11-13 07:41:12 +01:00
this . _element . style [ dimension ] = this . _element [ scrollSize ] + "px" ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . hide = function hide ( ) {
var _this2 = this ;
2020-03-28 11:29:08 +01:00
if ( this . _isTransitioning || ! this . _element . classList . contains ( CLASS _NAME _SHOW ) ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var startEvent = EventHandler . trigger ( this . _element , EVENT _HIDE ) ;
2017-09-30 23:28:03 +02:00
2019-03-01 17:31:34 +01:00
if ( startEvent . defaultPrevented ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var dimension = this . _getDimension ( ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _element . style [ dimension ] = this . _element . getBoundingClientRect ( ) [ dimension ] + "px" ;
2019-03-01 17:31:34 +01:00
reflow ( this . _element ) ;
2020-03-28 11:29:08 +01:00
this . _element . classList . add ( CLASS _NAME _COLLAPSING ) ;
2019-03-01 17:31:34 +01:00
2020-05-13 20:53:43 +02:00
this . _element . classList . remove ( CLASS _NAME _COLLAPSE , CLASS _NAME _SHOW ) ;
2019-03-01 17:31:34 +01:00
2018-11-13 07:41:12 +01:00
var triggerArrayLength = this . _triggerArray . length ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( triggerArrayLength > 0 ) {
for ( var i = 0 ; i < triggerArrayLength ; i ++ ) {
var trigger = this . _triggerArray [ i ] ;
2019-08-27 15:03:21 +02:00
var elem = getElementFromSelector ( trigger ) ;
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
if ( elem && ! elem . classList . contains ( CLASS _NAME _SHOW ) ) {
trigger . classList . add ( CLASS _NAME _COLLAPSED ) ;
2019-08-27 15:03:21 +02:00
trigger . setAttribute ( 'aria-expanded' , false ) ;
2017-09-06 06:05:12 +02:00
}
}
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . setTransitioning ( true ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var complete = function complete ( ) {
_this2 . setTransitioning ( false ) ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
_this2 . _element . classList . remove ( CLASS _NAME _COLLAPSING ) ;
2019-03-01 17:31:34 +01:00
2020-03-28 11:29:08 +01:00
_this2 . _element . classList . add ( CLASS _NAME _COLLAPSE ) ;
2019-03-01 17:31:34 +01:00
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( _this2 . _element , EVENT _HIDDEN ) ;
2018-03-31 22:59:37 +02:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _element . style [ dimension ] = '' ;
2019-03-01 17:31:34 +01:00
var transitionDuration = getTransitionDurationFromElement ( this . _element ) ;
EventHandler . one ( this . _element , TRANSITION _END , complete ) ;
emulateTransitionEnd ( this . _element , transitionDuration ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . setTransitioning = function setTransitioning ( isTransitioning ) {
this . _isTransitioning = isTransitioning ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . dispose = function dispose ( ) {
2019-03-01 17:31:34 +01:00
Data . removeData ( this . _element , DATA _KEY$3 ) ;
2018-11-13 07:41:12 +01:00
this . _config = null ;
this . _parent = null ;
this . _element = null ;
this . _triggerArray = null ;
this . _isTransitioning = null ;
2019-01-04 17:29:45 +01:00
} // Private
;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getConfig = function _getConfig ( config ) {
2020-09-14 17:12:06 +02:00
config = _extends ( { } , Default$1 , config ) ;
2018-11-13 07:41:12 +01:00
config . toggle = Boolean ( config . toggle ) ; // Coerce string values
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
typeCheckConfig ( NAME$3 , config , DefaultType$1 ) ;
2018-11-13 07:41:12 +01:00
return config ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getDimension = function _getDimension ( ) {
2020-09-14 17:12:06 +02:00
return this . _element . classList . contains ( WIDTH ) ? WIDTH : HEIGHT ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getParent = function _getParent ( ) {
var _this3 = this ;
2017-09-06 06:05:12 +02:00
2019-03-11 16:13:30 +01:00
var parent = this . _config . parent ;
2017-09-30 23:28:03 +02:00
2019-03-11 16:13:30 +01:00
if ( isElement ( parent ) ) {
// it's a jQuery object
if ( typeof parent . jquery !== 'undefined' || typeof parent [ 0 ] !== 'undefined' ) {
parent = parent [ 0 ] ;
2018-11-13 07:41:12 +01:00
}
} else {
2019-03-11 16:13:30 +01:00
parent = SelectorEngine . findOne ( parent ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var selector = SELECTOR _DATA _TOGGLE$1 + "[data-parent=\"" + parent + "\"]" ;
SelectorEngine . find ( selector , parent ) . forEach ( function ( element ) {
2019-08-27 15:03:21 +02:00
var selected = getElementFromSelector ( element ) ;
2019-07-24 08:13:50 +02:00
_this3 . _addAriaAndCollapsedClass ( selected , [ element ] ) ;
2018-11-13 07:41:12 +01:00
} ) ;
return parent ;
} ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
_proto . _addAriaAndCollapsedClass = function _addAriaAndCollapsedClass ( element , triggerArray ) {
2020-09-14 17:12:06 +02:00
if ( ! element || ! triggerArray . length ) {
return ;
}
2017-09-06 06:05:12 +02:00
2020-09-14 17:12:06 +02:00
var isOpen = element . classList . contains ( CLASS _NAME _SHOW ) ;
triggerArray . forEach ( function ( elem ) {
if ( isOpen ) {
elem . classList . remove ( CLASS _NAME _COLLAPSED ) ;
} else {
elem . classList . add ( CLASS _NAME _COLLAPSED ) ;
2019-03-01 17:31:34 +01:00
}
2020-09-14 17:12:06 +02:00
elem . setAttribute ( 'aria-expanded' , isOpen ) ;
} ) ;
2019-01-04 17:29:45 +01:00
} // Static
;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Collapse . collapseInterface = function collapseInterface ( element , config ) {
2019-03-01 17:31:34 +01:00
var data = Data . getData ( element , DATA _KEY$3 ) ;
2017-09-06 06:05:12 +02:00
2020-09-14 17:12:06 +02:00
var _config = _extends ( { } , Default$1 , Manipulator . getDataAttributes ( element ) , typeof config === 'object' && config ? config : { } ) ;
2017-09-06 06:05:12 +02:00
2020-05-13 20:53:43 +02:00
if ( ! data && _config . toggle && typeof config === 'string' && /show|hide/ . test ( config ) ) {
2019-03-01 17:31:34 +01:00
_config . toggle = false ;
}
2018-03-31 22:59:37 +02:00
2019-03-01 17:31:34 +01:00
if ( ! data ) {
data = new Collapse ( element , _config ) ;
}
if ( typeof config === 'string' ) {
if ( typeof data [ config ] === 'undefined' ) {
2019-03-11 16:13:30 +01:00
throw new TypeError ( "No method named \"" + config + "\"" ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
data [ config ] ( ) ;
}
} ;
2017-09-30 23:28:03 +02:00
2019-08-27 15:03:21 +02:00
Collapse . jQueryInterface = function jQueryInterface ( config ) {
2019-03-01 17:31:34 +01:00
return this . each ( function ( ) {
2019-08-27 15:03:21 +02:00
Collapse . collapseInterface ( this , config ) ;
2018-11-13 07:41:12 +01:00
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Collapse . getInstance = function getInstance ( element ) {
2019-03-01 17:31:34 +01:00
return Data . getData ( element , DATA _KEY$3 ) ;
} ;
2018-11-13 07:41:12 +01:00
_createClass ( Collapse , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION$3 ;
}
} , {
key : "Default" ,
get : function get ( ) {
return Default$1 ;
}
} ] ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
return Collapse ;
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-30 23:28:03 +02:00
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . on ( document , EVENT _CLICK _DATA _API$3 , SELECTOR _DATA _TOGGLE$1 , function ( event ) {
2018-11-13 07:41:12 +01:00
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
2019-03-01 17:31:34 +01:00
if ( event . target . tagName === 'A' ) {
2018-11-13 07:41:12 +01:00
event . preventDefault ( ) ;
}
2017-09-30 23:28:03 +02:00
2019-03-01 17:31:34 +01:00
var triggerData = Manipulator . getDataAttributes ( this ) ;
var selector = getSelectorFromElement ( this ) ;
2020-03-28 11:29:08 +01:00
var selectorElements = SelectorEngine . find ( selector ) ;
2019-03-01 17:31:34 +01:00
selectorElements . forEach ( function ( element ) {
var data = Data . getData ( element , DATA _KEY$3 ) ;
var config ;
if ( data ) {
// update parent attribute
if ( data . _parent === null && typeof triggerData . parent === 'string' ) {
data . _config . parent = triggerData . parent ;
data . _parent = data . _getParent ( ) ;
}
config = 'toggle' ;
} else {
config = triggerData ;
}
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Collapse . collapseInterface ( element , config ) ;
2018-11-13 07:41:12 +01:00
} ) ;
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* add . Collapse to jQuery only if jQuery is present
2018-11-13 07:41:12 +01:00
* /
2017-09-30 23:28:03 +02:00
2020-11-11 18:07:37 +01:00
onDOMContentLoaded ( function ( ) {
var $ = getjQuery ( ) ;
/* istanbul ignore if */
2019-07-24 08:13:50 +02:00
2020-11-11 18:07:37 +01:00
if ( $ ) {
var JQUERY _NO _CONFLICT = $ . fn [ NAME$3 ] ;
$ . fn [ NAME$3 ] = Collapse . jQueryInterface ;
$ . fn [ NAME$3 ] . Constructor = Collapse ;
2017-09-06 06:05:12 +02:00
2020-11-11 18:07:37 +01:00
$ . fn [ NAME$3 ] . noConflict = function ( ) {
$ . fn [ NAME$3 ] = JQUERY _NO _CONFLICT ;
return Collapse . jQueryInterface ;
} ;
}
} ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ * * !
* @ fileOverview Kickass library to create and place poppers near their reference elements .
2020-09-14 17:12:06 +02:00
* @ version 1.16 . 1
2018-03-31 22:59:37 +02:00
* @ license
* Copyright ( c ) 2016 Federico Zivolo and contributors
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the "Software" ) , to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED "AS IS" , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE .
* /
2019-11-08 09:11:23 +01:00
var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined' ;
var timeoutDuration = function ( ) {
var longerTimeoutBrowsers = [ 'Edge' , 'Trident' , 'Firefox' ] ;
for ( var i = 0 ; i < longerTimeoutBrowsers . length ; i += 1 ) {
if ( isBrowser && navigator . userAgent . indexOf ( longerTimeoutBrowsers [ i ] ) >= 0 ) {
return 1 ;
}
2017-09-06 06:05:12 +02:00
}
2019-11-08 09:11:23 +01:00
return 0 ;
} ( ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
function microtaskDebounce ( fn ) {
var called = false ;
return function ( ) {
if ( called ) {
return ;
}
called = true ;
window . Promise . resolve ( ) . then ( function ( ) {
called = false ;
2017-09-06 06:05:12 +02:00
fn ( ) ;
2018-03-31 22:59:37 +02:00
} ) ;
} ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
function taskDebounce ( fn ) {
var scheduled = false ;
return function ( ) {
if ( ! scheduled ) {
scheduled = true ;
setTimeout ( function ( ) {
scheduled = false ;
fn ( ) ;
} , timeoutDuration ) ;
}
} ;
2017-10-25 21:35:07 +02:00
}
2018-03-31 22:59:37 +02:00
var supportsMicroTasks = isBrowser && window . Promise ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ * *
* Create a debounced version of a method , that ' s asynchronously deferred
* but called in the minimum time possible .
*
* @ method
* @ memberof Popper . Utils
* @ argument { Function } fn
* @ returns { Function }
* /
var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ * *
* Check if the given variable is a function
* @ method
* @ memberof Popper . Utils
* @ argument { Any } functionToCheck - variable to check
* @ returns { Boolean } answer to : is a function ?
* /
function isFunction ( functionToCheck ) {
var getType = { } ;
return functionToCheck && getType . toString . call ( functionToCheck ) === '[object Function]' ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
/ * *
* Get CSS computed property of the given element
* @ method
* @ memberof Popper . Utils
* @ argument { Eement } element
* @ argument { String } property
* /
function getStyleComputedProperty ( element , property ) {
if ( element . nodeType !== 1 ) {
return [ ] ;
2017-10-25 21:35:07 +02:00
}
2018-03-31 22:59:37 +02:00
// NOTE: 1 DOM access here
2018-11-24 17:22:59 +01:00
var window = element . ownerDocument . defaultView ;
var css = window . getComputedStyle ( element , null ) ;
2018-03-31 22:59:37 +02:00
return property ? css [ property ] : css ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
/ * *
* Returns the parentNode or the host of the element
* @ method
* @ memberof Popper . Utils
* @ argument { Element } element
* @ returns { Element } parent
* /
function getParentNode ( element ) {
if ( element . nodeName === 'HTML' ) {
return element ;
}
return element . parentNode || element . host ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
/ * *
* Returns the scrolling parent of the given element
* @ method
* @ memberof Popper . Utils
* @ argument { Element } element
* @ returns { Element } scroll parent
* /
function getScrollParent ( element ) {
// Return body, `getScroll` will take care to get the correct `scrollTop` from it
if ( ! element ) {
return document . body ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
switch ( element . nodeName ) {
case 'HTML' :
case 'BODY' :
return element . ownerDocument . body ;
case '#document' :
return element . body ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// Firefox want us to check `-x` and `-y` variations as well
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
var _getStyleComputedProp = getStyleComputedProperty ( element ) ,
overflow = _getStyleComputedProp . overflow ,
overflowX = _getStyleComputedProp . overflowX ,
overflowY = _getStyleComputedProp . overflowY ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
if ( /(auto|scroll|overlay)/ . test ( overflow + overflowY + overflowX ) ) {
return element ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
return getScrollParent ( getParentNode ( element ) ) ;
2017-09-06 06:05:12 +02:00
}
2019-11-08 09:11:23 +01:00
/ * *
* Returns the reference node of the reference object , or the reference object itself .
* @ method
* @ memberof Popper . Utils
* @ param { Element | Object } reference - the reference element ( the popper will be relative to this )
* @ returns { Element } parent
* /
function getReferenceNode ( reference ) {
return reference && reference . referenceNode ? reference . referenceNode : reference ;
}
2018-04-30 07:22:04 +02:00
var isIE11 = isBrowser && ! ! ( window . MSInputMethodContext && document . documentMode ) ;
var isIE10 = isBrowser && /MSIE 10/ . test ( navigator . userAgent ) ;
2018-03-31 22:59:37 +02:00
/ * *
2018-04-30 07:22:04 +02:00
* Determines if the browser is Internet Explorer
2018-03-31 22:59:37 +02:00
* @ method
* @ memberof Popper . Utils
2018-04-30 07:22:04 +02:00
* @ param { Number } version to check
2018-03-31 22:59:37 +02:00
* @ returns { Boolean } isIE
* /
2018-04-30 07:22:04 +02:00
function isIE ( version ) {
if ( version === 11 ) {
return isIE11 ;
2018-03-31 22:59:37 +02:00
}
2018-04-30 07:22:04 +02:00
if ( version === 10 ) {
return isIE10 ;
2018-03-31 22:59:37 +02:00
}
2018-04-30 07:22:04 +02:00
return isIE11 || isIE10 ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ * *
* Returns the offset parent of the given element
* @ method
* @ memberof Popper . Utils
* @ argument { Element } element
* @ returns { Element } offset parent
* /
function getOffsetParent ( element ) {
if ( ! element ) {
return document . documentElement ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
var noOffsetParent = isIE ( 10 ) ? document . body : null ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// NOTE: 1 DOM access here
2018-11-24 17:22:59 +01:00
var offsetParent = element . offsetParent || null ;
2018-03-31 22:59:37 +02:00
// Skip hidden elements which don't have an offsetParent
while ( offsetParent === noOffsetParent && element . nextElementSibling ) {
offsetParent = ( element = element . nextElementSibling ) . offsetParent ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
var nodeName = offsetParent && offsetParent . nodeName ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
if ( ! nodeName || nodeName === 'BODY' || nodeName === 'HTML' ) {
return element ? element . ownerDocument . documentElement : document . documentElement ;
}
2017-09-06 06:05:12 +02:00
2018-11-24 17:22:59 +01:00
// .offsetParent will return the closest TH, TD or TABLE in case
2018-03-31 22:59:37 +02:00
// no offsetParent is present, I hate this job...
2018-11-24 17:22:59 +01:00
if ( [ 'TH' , 'TD' , 'TABLE' ] . indexOf ( offsetParent . nodeName ) !== - 1 && getStyleComputedProperty ( offsetParent , 'position' ) === 'static' ) {
2018-03-31 22:59:37 +02:00
return getOffsetParent ( offsetParent ) ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
return offsetParent ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
function isOffsetContainer ( element ) {
var nodeName = element . nodeName ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
if ( nodeName === 'BODY' ) {
return false ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
return nodeName === 'HTML' || getOffsetParent ( element . firstElementChild ) === element ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
/ * *
* Finds the root node ( document , shadowDOM root ) of the given element
* @ method
* @ memberof Popper . Utils
* @ argument { Element } node
* @ returns { Element } root node
* /
function getRoot ( node ) {
if ( node . parentNode !== null ) {
return getRoot ( node . parentNode ) ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
return node ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
/ * *
* Finds the offset parent common to the two provided nodes
* @ method
* @ memberof Popper . Utils
* @ argument { Element } element1
* @ argument { Element } element2
* @ returns { Element } common offset parent
* /
function findCommonOffsetParent ( element1 , element2 ) {
// This check is needed to avoid errors in case one of the elements isn't defined for any reason
if ( ! element1 || ! element1 . nodeType || ! element2 || ! element2 . nodeType ) {
return document . documentElement ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// Here we make sure to give as "start" the element that comes first in the DOM
var order = element1 . compareDocumentPosition ( element2 ) & Node . DOCUMENT _POSITION _FOLLOWING ;
var start = order ? element1 : element2 ;
var end = order ? element2 : element1 ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// Get common ancestor container
var range = document . createRange ( ) ;
range . setStart ( start , 0 ) ;
range . setEnd ( end , 0 ) ;
var commonAncestorContainer = range . commonAncestorContainer ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// Both nodes are inside #document
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
if ( element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start . contains ( end ) ) {
if ( isOffsetContainer ( commonAncestorContainer ) ) {
return commonAncestorContainer ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
return getOffsetParent ( commonAncestorContainer ) ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// one of the nodes is inside shadowDOM, find which one
var element1root = getRoot ( element1 ) ;
if ( element1root . host ) {
return findCommonOffsetParent ( element1root . host , element2 ) ;
2017-09-06 06:05:12 +02:00
} else {
2018-03-31 22:59:37 +02:00
return findCommonOffsetParent ( element1 , getRoot ( element2 ) . host ) ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ * *
* Gets the scroll value of the given element in the given side ( top and left )
* @ method
* @ memberof Popper . Utils
* @ argument { Element } element
* @ argument { String } side ` top ` or ` left `
* @ returns { number } amount of scrolled pixels
* /
function getScroll ( element ) {
var side = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : 'top' ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft' ;
var nodeName = element . nodeName ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
if ( nodeName === 'BODY' || nodeName === 'HTML' ) {
var html = element . ownerDocument . documentElement ;
var scrollingElement = element . ownerDocument . scrollingElement || html ;
return scrollingElement [ upperSide ] ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
return element [ upperSide ] ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
/ *
* Sum or subtract the element scroll values ( left and top ) from a given rect object
* @ method
* @ memberof Popper . Utils
* @ param { Object } rect - Rect object you want to change
* @ param { HTMLElement } element - The element from the function reads the scroll values
* @ param { Boolean } subtract - set to true if you want to subtract the scroll values
* @ return { Object } rect - The modifier rect object
* /
function includeScroll ( rect , element ) {
var subtract = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : false ;
var scrollTop = getScroll ( element , 'top' ) ;
var scrollLeft = getScroll ( element , 'left' ) ;
var modifier = subtract ? - 1 : 1 ;
rect . top += scrollTop * modifier ;
rect . bottom += scrollTop * modifier ;
rect . left += scrollLeft * modifier ;
rect . right += scrollLeft * modifier ;
return rect ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ *
* Helper to detect borders of a given element
* @ method
* @ memberof Popper . Utils
* @ param { CSSStyleDeclaration } styles
* Result of ` getStyleComputedProperty ` on the given element
* @ param { String } axis - ` x ` or ` y `
* @ return { number } borders - The borders size of the given axis
* /
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
function getBordersSize ( styles , axis ) {
var sideA = axis === 'x' ? 'Left' : 'Top' ;
var sideB = sideA === 'Left' ? 'Right' : 'Bottom' ;
2017-09-06 06:05:12 +02:00
2020-09-14 17:12:06 +02:00
return parseFloat ( styles [ 'border' + sideA + 'Width' ] ) + parseFloat ( styles [ 'border' + sideB + 'Width' ] ) ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
function getSize ( axis , body , html , computedStyle ) {
2018-08-19 05:22:08 +02:00
return Math . max ( body [ 'offset' + axis ] , body [ 'scroll' + axis ] , html [ 'client' + axis ] , html [ 'offset' + axis ] , html [ 'scroll' + axis ] , isIE ( 10 ) ? parseInt ( html [ 'offset' + axis ] ) + parseInt ( computedStyle [ 'margin' + ( axis === 'Height' ? 'Top' : 'Left' ) ] ) + parseInt ( computedStyle [ 'margin' + ( axis === 'Height' ? 'Bottom' : 'Right' ) ] ) : 0 ) ;
2017-09-06 06:05:12 +02:00
}
2018-08-19 05:22:08 +02:00
function getWindowSizes ( document ) {
2018-03-31 22:59:37 +02:00
var body = document . body ;
var html = document . documentElement ;
var computedStyle = isIE ( 10 ) && getComputedStyle ( html ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
return {
height : getSize ( 'Height' , body , html , computedStyle ) ,
width : getSize ( 'Width' , body , html , computedStyle )
} ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
var classCallCheck = function ( instance , Constructor ) {
if ( ! ( instance instanceof Constructor ) ) {
throw new TypeError ( "Cannot call a class as a function" ) ;
}
2017-09-06 06:05:12 +02:00
} ;
2018-03-31 22:59:37 +02:00
var createClass = function ( ) {
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 ) ;
}
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
return function ( Constructor , protoProps , staticProps ) {
if ( protoProps ) defineProperties ( Constructor . prototype , protoProps ) ;
if ( staticProps ) defineProperties ( Constructor , staticProps ) ;
return Constructor ;
} ;
} ( ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
var defineProperty = function ( obj , key , value ) {
if ( key in obj ) {
Object . defineProperty ( obj , key , {
value : value ,
enumerable : true ,
configurable : true ,
writable : true
} ) ;
2017-09-06 06:05:12 +02:00
} else {
2018-03-31 22:59:37 +02:00
obj [ key ] = value ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
return obj ;
} ;
2017-09-06 06:05:12 +02:00
2020-09-14 17:12:06 +02:00
var _extends$1 = Object . assign || function ( target ) {
2018-03-31 22:59:37 +02:00
for ( var i = 1 ; i < arguments . length ; i ++ ) {
var source = arguments [ i ] ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
for ( var key in source ) {
if ( Object . prototype . hasOwnProperty . call ( source , key ) ) {
target [ key ] = source [ key ] ;
}
}
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
return target ;
2017-09-06 06:05:12 +02:00
} ;
2018-03-31 22:59:37 +02:00
/ * *
* Given element offsets , generate an output similar to getBoundingClientRect
* @ method
* @ memberof Popper . Utils
* @ argument { Object } offsets
* @ returns { Object } ClientRect like output
* /
function getClientRect ( offsets ) {
2020-09-14 17:12:06 +02:00
return _extends$1 ( { } , offsets , {
2018-03-31 22:59:37 +02:00
right : offsets . left + offsets . width ,
bottom : offsets . top + offsets . height
} ) ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
/ * *
* Get bounding client rect of given element
* @ method
* @ memberof Popper . Utils
* @ param { HTMLElement } element
* @ return { Object } client rect
* /
function getBoundingClientRect ( element ) {
var rect = { } ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// IE10 10 FIX: Please, don't ask, the element isn't
// considered in DOM in some circumstances...
// This isn't reproducible in IE10 compatibility mode of IE11
try {
if ( isIE ( 10 ) ) {
rect = element . getBoundingClientRect ( ) ;
var scrollTop = getScroll ( element , 'top' ) ;
var scrollLeft = getScroll ( element , 'left' ) ;
rect . top += scrollTop ;
rect . left += scrollLeft ;
rect . bottom += scrollTop ;
rect . right += scrollLeft ;
} else {
rect = element . getBoundingClientRect ( ) ;
}
} catch ( e ) { }
var result = {
left : rect . left ,
top : rect . top ,
width : rect . right - rect . left ,
height : rect . bottom - rect . top
} ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// subtract scrollbar size from sizes
2018-08-19 05:22:08 +02:00
var sizes = element . nodeName === 'HTML' ? getWindowSizes ( element . ownerDocument ) : { } ;
2019-11-08 09:11:23 +01:00
var width = sizes . width || element . clientWidth || result . width ;
var height = sizes . height || element . clientHeight || result . height ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
var horizScrollbar = element . offsetWidth - width ;
var vertScrollbar = element . offsetHeight - height ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// if an hypothetical scrollbar is detected, we must be sure it's not a `border`
// we make this check conditional for performance reasons
if ( horizScrollbar || vertScrollbar ) {
var styles = getStyleComputedProperty ( element ) ;
horizScrollbar -= getBordersSize ( styles , 'x' ) ;
vertScrollbar -= getBordersSize ( styles , 'y' ) ;
result . width -= horizScrollbar ;
result . height -= vertScrollbar ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
return getClientRect ( result ) ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
function getOffsetRectRelativeToArbitraryNode ( children , parent ) {
var fixedPosition = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : false ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
var isIE10 = isIE ( 10 ) ;
var isHTML = parent . nodeName === 'HTML' ;
var childrenRect = getBoundingClientRect ( children ) ;
var parentRect = getBoundingClientRect ( parent ) ;
var scrollParent = getScrollParent ( children ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
var styles = getStyleComputedProperty ( parent ) ;
2020-09-14 17:12:06 +02:00
var borderTopWidth = parseFloat ( styles . borderTopWidth ) ;
var borderLeftWidth = parseFloat ( styles . borderLeftWidth ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// In cases where the parent is fixed, we must ignore negative scroll in offset calc
2018-08-19 05:22:08 +02:00
if ( fixedPosition && isHTML ) {
2018-03-31 22:59:37 +02:00
parentRect . top = Math . max ( parentRect . top , 0 ) ;
parentRect . left = Math . max ( parentRect . left , 0 ) ;
}
var offsets = getClientRect ( {
top : childrenRect . top - parentRect . top - borderTopWidth ,
left : childrenRect . left - parentRect . left - borderLeftWidth ,
width : childrenRect . width ,
height : childrenRect . height
} ) ;
offsets . marginTop = 0 ;
offsets . marginLeft = 0 ;
// Subtract margins of documentElement in case it's being used as parent
// we do this only on HTML because it's the only element that behaves
// differently when margins are applied to it. The margins are included in
// the box of the documentElement, in the other cases not.
if ( ! isIE10 && isHTML ) {
2020-09-14 17:12:06 +02:00
var marginTop = parseFloat ( styles . marginTop ) ;
var marginLeft = parseFloat ( styles . marginLeft ) ;
2018-03-31 22:59:37 +02:00
offsets . top -= borderTopWidth - marginTop ;
offsets . bottom -= borderTopWidth - marginTop ;
offsets . left -= borderLeftWidth - marginLeft ;
offsets . right -= borderLeftWidth - marginLeft ;
// Attach marginTop and marginLeft because in some circumstances we may need them
offsets . marginTop = marginTop ;
offsets . marginLeft = marginLeft ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
if ( isIE10 && ! fixedPosition ? parent . contains ( scrollParent ) : parent === scrollParent && scrollParent . nodeName !== 'BODY' ) {
offsets = includeScroll ( offsets , parent ) ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
return offsets ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
function getViewportOffsetRectRelativeToArtbitraryNode ( element ) {
var excludeScroll = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : false ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
var html = element . ownerDocument . documentElement ;
var relativeOffset = getOffsetRectRelativeToArbitraryNode ( element , html ) ;
var width = Math . max ( html . clientWidth , window . innerWidth || 0 ) ;
var height = Math . max ( html . clientHeight , window . innerHeight || 0 ) ;
var scrollTop = ! excludeScroll ? getScroll ( html ) : 0 ;
var scrollLeft = ! excludeScroll ? getScroll ( html , 'left' ) : 0 ;
var offset = {
top : scrollTop - relativeOffset . top + relativeOffset . marginTop ,
left : scrollLeft - relativeOffset . left + relativeOffset . marginLeft ,
width : width ,
height : height
} ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
return getClientRect ( offset ) ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
/ * *
* Check if the given element is fixed or is inside a fixed parent
* @ method
* @ memberof Popper . Utils
* @ argument { Element } element
* @ argument { Element } customContainer
* @ returns { Boolean } answer to "isFixed?"
* /
function isFixed ( element ) {
var nodeName = element . nodeName ;
if ( nodeName === 'BODY' || nodeName === 'HTML' ) {
return false ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
if ( getStyleComputedProperty ( element , 'position' ) === 'fixed' ) {
return true ;
}
2019-02-11 20:15:34 +01:00
var parentNode = getParentNode ( element ) ;
if ( ! parentNode ) {
return false ;
}
return isFixed ( parentNode ) ;
2018-03-31 22:59:37 +02:00
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ * *
* Finds the first parent of an element that has a transformed property defined
* @ method
* @ memberof Popper . Utils
* @ argument { Element } element
* @ returns { Element } first transformed parent or documentElement
* /
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
function getFixedPositionOffsetParent ( element ) {
// This check is needed to avoid errors in case one of the elements isn't defined for any reason
if ( ! element || ! element . parentElement || isIE ( ) ) {
return document . documentElement ;
}
var el = element . parentElement ;
while ( el && getStyleComputedProperty ( el , 'transform' ) === 'none' ) {
el = el . parentElement ;
}
return el || document . documentElement ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ * *
* Computed the boundaries limits and return them
* @ method
* @ memberof Popper . Utils
* @ param { HTMLElement } popper
* @ param { HTMLElement } reference
* @ param { number } padding
* @ param { HTMLElement } boundariesElement - Element used to define the boundaries
* @ param { Boolean } fixedPosition - Is in fixed position mode
* @ returns { Object } Coordinates of the boundaries
* /
function getBoundaries ( popper , reference , padding , boundariesElement ) {
var fixedPosition = arguments . length > 4 && arguments [ 4 ] !== undefined ? arguments [ 4 ] : false ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// NOTE: 1 DOM access here
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
var boundaries = { top : 0 , left : 0 } ;
2019-11-08 09:11:23 +01:00
var offsetParent = fixedPosition ? getFixedPositionOffsetParent ( popper ) : findCommonOffsetParent ( popper , getReferenceNode ( reference ) ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// Handle viewport case
if ( boundariesElement === 'viewport' ) {
boundaries = getViewportOffsetRectRelativeToArtbitraryNode ( offsetParent , fixedPosition ) ;
} else {
// Handle other cases based on DOM element used as boundaries
var boundariesNode = void 0 ;
if ( boundariesElement === 'scrollParent' ) {
boundariesNode = getScrollParent ( getParentNode ( reference ) ) ;
if ( boundariesNode . nodeName === 'BODY' ) {
boundariesNode = popper . ownerDocument . documentElement ;
}
} else if ( boundariesElement === 'window' ) {
boundariesNode = popper . ownerDocument . documentElement ;
} else {
boundariesNode = boundariesElement ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
var offsets = getOffsetRectRelativeToArbitraryNode ( boundariesNode , offsetParent , fixedPosition ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// In case of HTML, we need a different computation
if ( boundariesNode . nodeName === 'HTML' && ! isFixed ( offsetParent ) ) {
2018-08-19 05:22:08 +02:00
var _getWindowSizes = getWindowSizes ( popper . ownerDocument ) ,
2018-03-31 22:59:37 +02:00
height = _getWindowSizes . height ,
width = _getWindowSizes . width ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
boundaries . top += offsets . top - offsets . marginTop ;
boundaries . bottom = height + offsets . top ;
boundaries . left += offsets . left - offsets . marginLeft ;
boundaries . right = width + offsets . left ;
} else {
// for all the other DOM elements, this one is good
boundaries = offsets ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// Add paddings
2018-08-19 05:22:08 +02:00
padding = padding || 0 ;
var isPaddingNumber = typeof padding === 'number' ;
boundaries . left += isPaddingNumber ? padding : padding . left || 0 ;
boundaries . top += isPaddingNumber ? padding : padding . top || 0 ;
boundaries . right -= isPaddingNumber ? padding : padding . right || 0 ;
boundaries . bottom -= isPaddingNumber ? padding : padding . bottom || 0 ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
return boundaries ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
function getArea ( _ref ) {
var width = _ref . width ,
height = _ref . height ;
return width * height ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
/ * *
* Utility used to transform the ` auto ` placement to the placement with more
* available space .
* @ method
* @ memberof Popper . Utils
* @ argument { Object } data - The data object generated by update method
* @ argument { Object } options - Modifiers configuration and options
* @ returns { Object } The data object , properly modified
* /
function computeAutoPlacement ( placement , refRect , popper , reference , boundariesElement ) {
var padding = arguments . length > 5 && arguments [ 5 ] !== undefined ? arguments [ 5 ] : 0 ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
if ( placement . indexOf ( 'auto' ) === - 1 ) {
return placement ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
var boundaries = getBoundaries ( popper , reference , padding , boundariesElement ) ;
var rects = {
top : {
width : boundaries . width ,
height : refRect . top - boundaries . top
} ,
right : {
width : boundaries . right - refRect . right ,
height : boundaries . height
} ,
bottom : {
width : boundaries . width ,
height : boundaries . bottom - refRect . bottom
} ,
left : {
width : refRect . left - boundaries . left ,
height : boundaries . height
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
} ;
var sortedAreas = Object . keys ( rects ) . map ( function ( key ) {
2020-09-14 17:12:06 +02:00
return _extends$1 ( {
2018-03-31 22:59:37 +02:00
key : key
} , rects [ key ] , {
area : getArea ( rects [ key ] )
} ) ;
} ) . sort ( function ( a , b ) {
return b . area - a . area ;
2017-09-06 06:05:12 +02:00
} ) ;
2018-03-31 22:59:37 +02:00
var filteredAreas = sortedAreas . filter ( function ( _ref2 ) {
var width = _ref2 . width ,
height = _ref2 . height ;
return width >= popper . clientWidth && height >= popper . clientHeight ;
2017-09-06 06:05:12 +02:00
} ) ;
2018-03-31 22:59:37 +02:00
var computedPlacement = filteredAreas . length > 0 ? filteredAreas [ 0 ] . key : sortedAreas [ 0 ] . key ;
var variation = placement . split ( '-' ) [ 1 ] ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
return computedPlacement + ( variation ? '-' + variation : '' ) ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
/ * *
* Get offsets to the reference element
* @ method
* @ memberof Popper . Utils
* @ param { Object } state
* @ param { Element } popper - the popper element
* @ param { Element } reference - the reference element ( the popper will be relative to this )
* @ param { Element } fixedPosition - is in fixed position mode
* @ returns { Object } An object containing the offsets which will be applied to the popper
* /
function getReferenceOffsets ( state , popper , reference ) {
var fixedPosition = arguments . length > 3 && arguments [ 3 ] !== undefined ? arguments [ 3 ] : null ;
2017-09-06 06:05:12 +02:00
2019-11-08 09:11:23 +01:00
var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent ( popper ) : findCommonOffsetParent ( popper , getReferenceNode ( reference ) ) ;
2018-03-31 22:59:37 +02:00
return getOffsetRectRelativeToArbitraryNode ( reference , commonOffsetParent , fixedPosition ) ;
}
/ * *
* Get the outer sizes of the given element ( offset size + margins )
* @ method
* @ memberof Popper . Utils
* @ argument { Element } element
* @ returns { Object } object containing width and height properties
* /
function getOuterSizes ( element ) {
2018-11-24 17:22:59 +01:00
var window = element . ownerDocument . defaultView ;
var styles = window . getComputedStyle ( element ) ;
2018-12-16 00:13:22 +01:00
var x = parseFloat ( styles . marginTop || 0 ) + parseFloat ( styles . marginBottom || 0 ) ;
var y = parseFloat ( styles . marginLeft || 0 ) + parseFloat ( styles . marginRight || 0 ) ;
2018-03-31 22:59:37 +02:00
var result = {
width : element . offsetWidth + y ,
height : element . offsetHeight + x
} ;
return result ;
}
/ * *
* Get the opposite placement of the given one
* @ method
* @ memberof Popper . Utils
* @ argument { String } placement
* @ returns { String } flipped placement
* /
function getOppositePlacement ( placement ) {
var hash = { left : 'right' , right : 'left' , bottom : 'top' , top : 'bottom' } ;
return placement . replace ( /left|right|bottom|top/g , function ( matched ) {
return hash [ matched ] ;
} ) ;
}
/ * *
* Get offsets to the popper
* @ method
* @ memberof Popper . Utils
* @ param { Object } position - CSS position the Popper will get applied
* @ param { HTMLElement } popper - the popper element
* @ param { Object } referenceOffsets - the reference offsets ( the popper will be relative to this )
* @ param { String } placement - one of the valid placement options
* @ returns { Object } popperOffsets - An object containing the offsets which will be applied to the popper
* /
function getPopperOffsets ( popper , referenceOffsets , placement ) {
placement = placement . split ( '-' ) [ 0 ] ;
// Get popper node sizes
var popperRect = getOuterSizes ( popper ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// Add position, width and height to our offsets object
var popperOffsets = {
width : popperRect . width ,
height : popperRect . height
} ;
// depending by the popper placement we have to compute its offsets slightly differently
var isHoriz = [ 'right' , 'left' ] . indexOf ( placement ) !== - 1 ;
var mainSide = isHoriz ? 'top' : 'left' ;
var secondarySide = isHoriz ? 'left' : 'top' ;
var measurement = isHoriz ? 'height' : 'width' ;
var secondaryMeasurement = ! isHoriz ? 'height' : 'width' ;
popperOffsets [ mainSide ] = referenceOffsets [ mainSide ] + referenceOffsets [ measurement ] / 2 - popperRect [ measurement ] / 2 ;
if ( placement === secondarySide ) {
popperOffsets [ secondarySide ] = referenceOffsets [ secondarySide ] - popperRect [ secondaryMeasurement ] ;
} else {
popperOffsets [ secondarySide ] = referenceOffsets [ getOppositePlacement ( secondarySide ) ] ;
}
return popperOffsets ;
}
/ * *
* Mimics the ` find ` method of Array
* @ method
* @ memberof Popper . Utils
* @ argument { Array } arr
* @ argument prop
* @ argument value
* @ returns index or - 1
* /
2020-11-11 18:07:37 +01:00
function find ( arr , check ) {
2018-03-31 22:59:37 +02:00
// use native find if supported
if ( Array . prototype . find ) {
return arr . find ( check ) ;
}
// use `filter` to obtain the same behavior of `find`
return arr . filter ( check ) [ 0 ] ;
}
/ * *
* Return the index of the matching object
* @ method
* @ memberof Popper . Utils
* @ argument { Array } arr
* @ argument prop
* @ argument value
* @ returns index or - 1
* /
function findIndex ( arr , prop , value ) {
// use native findIndex if supported
if ( Array . prototype . findIndex ) {
return arr . findIndex ( function ( cur ) {
return cur [ prop ] === value ;
} ) ;
}
// use `find` + `indexOf` if `findIndex` isn't supported
2020-11-11 18:07:37 +01:00
var match = find ( arr , function ( obj ) {
2018-03-31 22:59:37 +02:00
return obj [ prop ] === value ;
} ) ;
return arr . indexOf ( match ) ;
}
/ * *
* Loop trough the list of modifiers and run them in order ,
* each of them will then edit the data object .
* @ method
* @ memberof Popper . Utils
* @ param { dataObject } data
* @ param { Array } modifiers
* @ param { String } ends - Optional modifier name used as stopper
* @ returns { dataObject }
* /
function runModifiers ( modifiers , data , ends ) {
var modifiersToRun = ends === undefined ? modifiers : modifiers . slice ( 0 , findIndex ( modifiers , 'name' , ends ) ) ;
modifiersToRun . forEach ( function ( modifier ) {
if ( modifier [ 'function' ] ) {
// eslint-disable-line dot-notation
console . warn ( '`modifier.function` is deprecated, use `modifier.fn`!' ) ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
var fn = modifier [ 'function' ] || modifier . fn ; // eslint-disable-line dot-notation
if ( modifier . enabled && isFunction ( fn ) ) {
// Add properties to offsets to make them a complete clientRect object
// we do this before each modifier to make sure the previous one doesn't
// mess with these values
data . offsets . popper = getClientRect ( data . offsets . popper ) ;
data . offsets . reference = getClientRect ( data . offsets . reference ) ;
data = fn ( data , modifier ) ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
} ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
return data ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ * *
* Updates the position of the popper , computing the new offsets and applying
* the new style . < br / >
* Prefer ` scheduleUpdate ` over ` update ` because of performance reasons .
* @ method
* @ memberof Popper
* /
function update ( ) {
// if popper is destroyed, don't perform any further update
if ( this . state . isDestroyed ) {
return ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
var data = {
instance : this ,
styles : { } ,
arrowStyles : { } ,
attributes : { } ,
flipped : false ,
offsets : { }
2017-09-06 06:05:12 +02:00
} ;
2018-03-31 22:59:37 +02:00
// compute reference element offsets
data . offsets . reference = getReferenceOffsets ( this . state , this . popper , this . reference , this . options . positionFixed ) ;
// compute auto placement, store placement inside the data object,
// modifiers will be able to edit `placement` if needed
// and refer to originalPlacement to know the original value
data . placement = computeAutoPlacement ( this . options . placement , data . offsets . reference , this . popper , this . reference , this . options . modifiers . flip . boundariesElement , this . options . modifiers . flip . padding ) ;
// store the computed placement inside `originalPlacement`
data . originalPlacement = data . placement ;
data . positionFixed = this . options . positionFixed ;
// compute the popper offsets
data . offsets . popper = getPopperOffsets ( this . popper , data . offsets . reference , data . placement ) ;
2018-04-30 07:22:04 +02:00
2018-03-31 22:59:37 +02:00
data . offsets . popper . position = this . options . positionFixed ? 'fixed' : 'absolute' ;
// run the modifiers
data = runModifiers ( this . modifiers , data ) ;
// the first `update` will call `onCreate` callback
// the other ones will call `onUpdate` callback
if ( ! this . state . isCreated ) {
this . state . isCreated = true ;
this . options . onCreate ( data ) ;
} else {
this . options . onUpdate ( data ) ;
}
}
/ * *
* Helper used to know if the given modifier is enabled .
* @ method
* @ memberof Popper . Utils
* @ returns { Boolean }
* /
function isModifierEnabled ( modifiers , modifierName ) {
return modifiers . some ( function ( _ref ) {
var name = _ref . name ,
enabled = _ref . enabled ;
return enabled && name === modifierName ;
} ) ;
}
/ * *
* Get the prefixed supported property name
* @ method
* @ memberof Popper . Utils
* @ argument { String } property ( camelCase )
* @ returns { String } prefixed property ( camelCase or PascalCase , depending on the vendor prefix )
* /
function getSupportedPropertyName ( property ) {
var prefixes = [ false , 'ms' , 'Webkit' , 'Moz' , 'O' ] ;
var upperProp = property . charAt ( 0 ) . toUpperCase ( ) + property . slice ( 1 ) ;
for ( var i = 0 ; i < prefixes . length ; i ++ ) {
var prefix = prefixes [ i ] ;
var toCheck = prefix ? '' + prefix + upperProp : property ;
if ( typeof document . body . style [ toCheck ] !== 'undefined' ) {
return toCheck ;
}
}
return null ;
}
/ * *
2018-08-19 05:22:08 +02:00
* Destroys the popper .
2018-03-31 22:59:37 +02:00
* @ method
* @ memberof Popper
* /
function destroy ( ) {
this . state . isDestroyed = true ;
// touch DOM only if `applyStyle` modifier is enabled
if ( isModifierEnabled ( this . modifiers , 'applyStyle' ) ) {
this . popper . removeAttribute ( 'x-placement' ) ;
this . popper . style . position = '' ;
this . popper . style . top = '' ;
this . popper . style . left = '' ;
this . popper . style . right = '' ;
this . popper . style . bottom = '' ;
this . popper . style . willChange = '' ;
this . popper . style [ getSupportedPropertyName ( 'transform' ) ] = '' ;
}
this . disableEventListeners ( ) ;
2019-11-08 09:11:23 +01:00
// remove the popper if user explicitly asked for the deletion on destroy
2018-03-31 22:59:37 +02:00
// do not use `remove` because IE11 doesn't support it
if ( this . options . removeOnDestroy ) {
this . popper . parentNode . removeChild ( this . popper ) ;
}
return this ;
}
/ * *
* Get the window associated with the element
* @ argument { Element } element
* @ returns { Window }
* /
function getWindow ( element ) {
var ownerDocument = element . ownerDocument ;
return ownerDocument ? ownerDocument . defaultView : window ;
}
function attachToScrollParents ( scrollParent , event , callback , scrollParents ) {
var isBody = scrollParent . nodeName === 'BODY' ;
var target = isBody ? scrollParent . ownerDocument . defaultView : scrollParent ;
target . addEventListener ( event , callback , { passive : true } ) ;
if ( ! isBody ) {
attachToScrollParents ( getScrollParent ( target . parentNode ) , event , callback , scrollParents ) ;
}
scrollParents . push ( target ) ;
}
/ * *
* Setup needed event listeners used to update the popper position
* @ method
* @ memberof Popper . Utils
* @ private
* /
function setupEventListeners ( reference , options , state , updateBound ) {
// Resize event listener on window
state . updateBound = updateBound ;
getWindow ( reference ) . addEventListener ( 'resize' , state . updateBound , { passive : true } ) ;
// Scroll event listener on scroll parents
var scrollElement = getScrollParent ( reference ) ;
attachToScrollParents ( scrollElement , 'scroll' , state . updateBound , state . scrollParents ) ;
state . scrollElement = scrollElement ;
state . eventsEnabled = true ;
return state ;
}
/ * *
* It will add resize / scroll events and start recalculating
* position of the popper element when they are triggered .
* @ method
* @ memberof Popper
* /
function enableEventListeners ( ) {
if ( ! this . state . eventsEnabled ) {
this . state = setupEventListeners ( this . reference , this . options , this . state , this . scheduleUpdate ) ;
}
}
/ * *
* Remove event listeners used to update the popper position
* @ method
* @ memberof Popper . Utils
* @ private
* /
function removeEventListeners ( reference , state ) {
// Remove resize event listener on window
getWindow ( reference ) . removeEventListener ( 'resize' , state . updateBound ) ;
// Remove scroll event listener on scroll parents
state . scrollParents . forEach ( function ( target ) {
target . removeEventListener ( 'scroll' , state . updateBound ) ;
} ) ;
// Reset state
state . updateBound = null ;
state . scrollParents = [ ] ;
state . scrollElement = null ;
state . eventsEnabled = false ;
return state ;
}
/ * *
* It will remove resize / scroll events and won ' t recalculate popper position
2018-08-19 05:22:08 +02:00
* when they are triggered . It also won ' t trigger ` onUpdate ` callback anymore ,
2018-03-31 22:59:37 +02:00
* unless you call ` update ` method manually .
* @ method
* @ memberof Popper
* /
function disableEventListeners ( ) {
if ( this . state . eventsEnabled ) {
cancelAnimationFrame ( this . scheduleUpdate ) ;
this . state = removeEventListeners ( this . reference , this . state ) ;
}
}
/ * *
* Tells if a given input is a number
* @ method
* @ memberof Popper . Utils
* @ param { * } input to check
* @ return { Boolean }
* /
function isNumeric ( n ) {
return n !== '' && ! isNaN ( parseFloat ( n ) ) && isFinite ( n ) ;
}
/ * *
* Set the style to the given popper
* @ method
* @ memberof Popper . Utils
* @ argument { Element } element - Element to apply the style to
* @ argument { Object } styles
* Object with a list of properties and values which will be applied to the element
* /
function setStyles ( element , styles ) {
Object . keys ( styles ) . forEach ( function ( prop ) {
var unit = '' ;
// add unit if the value is numeric and is one of the following
if ( [ 'width' , 'height' , 'top' , 'right' , 'bottom' , 'left' ] . indexOf ( prop ) !== - 1 && isNumeric ( styles [ prop ] ) ) {
unit = 'px' ;
}
element . style [ prop ] = styles [ prop ] + unit ;
} ) ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
/ * *
* Set the attributes to the given popper
* @ method
* @ memberof Popper . Utils
* @ argument { Element } element - Element to apply the attributes to
* @ argument { Object } styles
* Object with a list of properties and values which will be applied to the element
* /
function setAttributes ( element , attributes ) {
Object . keys ( attributes ) . forEach ( function ( prop ) {
var value = attributes [ prop ] ;
if ( value !== false ) {
element . setAttribute ( prop , attributes [ prop ] ) ;
} else {
element . removeAttribute ( prop ) ;
}
} ) ;
}
/ * *
* @ function
* @ memberof Modifiers
* @ argument { Object } data - The data object generated by ` update ` method
* @ argument { Object } data . styles - List of style properties - values to apply to popper element
* @ argument { Object } data . attributes - List of attribute properties - values to apply to popper element
* @ argument { Object } options - Modifiers configuration and options
* @ returns { Object } The same data object
* /
function applyStyle ( data ) {
// any property present in `data.styles` will be applied to the popper,
// in this way we can make the 3rd party modifiers add custom styles to it
// Be aware, modifiers could override the properties defined in the previous
// lines of this modifier!
setStyles ( data . instance . popper , data . styles ) ;
// any property present in `data.attributes` will be applied to the popper,
// they will be set as HTML attributes of the element
setAttributes ( data . instance . popper , data . attributes ) ;
// if arrowElement is defined and arrowStyles has some properties
if ( data . arrowElement && Object . keys ( data . arrowStyles ) . length ) {
setStyles ( data . arrowElement , data . arrowStyles ) ;
}
2017-09-06 06:05:12 +02:00
return data ;
}
2018-03-31 22:59:37 +02:00
/ * *
* Set the x - placement attribute before everything else because it could be used
* to add margins to the popper margins needs to be calculated to get the
* correct popper offsets .
* @ method
* @ memberof Popper . modifiers
* @ param { HTMLElement } reference - The reference element used to position the popper
* @ param { HTMLElement } popper - The HTML element used as popper
* @ param { Object } options - Popper . js options
* /
function applyStyleOnLoad ( reference , popper , options , modifierOptions , state ) {
// compute reference element offsets
var referenceOffsets = getReferenceOffsets ( state , popper , reference , options . positionFixed ) ;
// compute auto placement, store placement inside the data object,
// modifiers will be able to edit `placement` if needed
// and refer to originalPlacement to know the original value
var placement = computeAutoPlacement ( options . placement , referenceOffsets , popper , reference , options . modifiers . flip . boundariesElement , options . modifiers . flip . padding ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
popper . setAttribute ( 'x-placement' , placement ) ;
// Apply `position` to popper before anything else because
// without the position applied we can't guarantee correct computations
setStyles ( popper , { position : options . positionFixed ? 'fixed' : 'absolute' } ) ;
return options ;
}
2018-12-16 00:13:22 +01:00
/ * *
* @ function
* @ memberof Popper . Utils
* @ argument { Object } data - The data object generated by ` update ` method
* @ argument { Boolean } shouldRound - If the offsets should be rounded at all
* @ returns { Object } The popper ' s position offsets rounded
*
* The tale of pixel - perfect positioning . It ' s still not 100 % perfect , but as
* good as it can be within reason .
* Discussion here : https : //github.com/FezVrasta/popper.js/pull/715
*
* Low DPI screens cause a popper to be blurry if not using full pixels ( Safari
* as well on High DPI screens ) .
*
* Firefox prefers no rounding for positioning and does not have blurriness on
* high DPI screens .
*
* Only horizontal placement and left / right values need to be considered .
* /
function getRoundedOffsets ( data , shouldRound ) {
var _data$offsets = data . offsets ,
popper = _data$offsets . popper ,
reference = _data$offsets . reference ;
2019-02-11 20:15:34 +01:00
var round = Math . round ,
floor = Math . floor ;
2018-12-16 00:13:22 +01:00
var noRound = function noRound ( v ) {
return v ;
} ;
2019-02-11 20:15:34 +01:00
var referenceWidth = round ( reference . width ) ;
var popperWidth = round ( popper . width ) ;
var isVertical = [ 'left' , 'right' ] . indexOf ( data . placement ) !== - 1 ;
var isVariation = data . placement . indexOf ( '-' ) !== - 1 ;
var sameWidthParity = referenceWidth % 2 === popperWidth % 2 ;
var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1 ;
var horizontalToInteger = ! shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor ;
var verticalToInteger = ! shouldRound ? noRound : round ;
2018-12-16 00:13:22 +01:00
return {
left : horizontalToInteger ( bothOddWidth && ! isVariation && shouldRound ? popper . left - 1 : popper . left ) ,
top : verticalToInteger ( popper . top ) ,
bottom : verticalToInteger ( popper . bottom ) ,
right : horizontalToInteger ( popper . right )
} ;
}
var isFirefox = isBrowser && /Firefox/i . test ( navigator . userAgent ) ;
2018-03-31 22:59:37 +02:00
/ * *
* @ function
* @ memberof Modifiers
* @ argument { Object } data - The data object generated by ` update ` method
* @ argument { Object } options - Modifiers configuration and options
* @ returns { Object } The data object , properly modified
* /
function computeStyle ( data , options ) {
var x = options . x ,
y = options . y ;
var popper = data . offsets . popper ;
// Remove this legacy support in Popper.js v2
2020-11-11 18:07:37 +01:00
var legacyGpuAccelerationOption = find ( data . instance . modifiers , function ( modifier ) {
2018-03-31 22:59:37 +02:00
return modifier . name === 'applyStyle' ;
} ) . gpuAcceleration ;
if ( legacyGpuAccelerationOption !== undefined ) {
console . warn ( 'WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!' ) ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options . gpuAcceleration ;
var offsetParent = getOffsetParent ( data . instance . popper ) ;
var offsetParentRect = getBoundingClientRect ( offsetParent ) ;
// Styles
var styles = {
position : popper . position
} ;
2017-09-06 06:05:12 +02:00
2018-12-16 00:13:22 +01:00
var offsets = getRoundedOffsets ( data , window . devicePixelRatio < 2 || ! isFirefox ) ;
2018-03-31 22:59:37 +02:00
var sideA = x === 'bottom' ? 'top' : 'bottom' ;
var sideB = y === 'right' ? 'left' : 'right' ;
// if gpuAcceleration is set to `true` and transform is supported,
// we use `translate3d` to apply the position to the popper we
// automatically use the supported prefixed version if needed
var prefixedProperty = getSupportedPropertyName ( 'transform' ) ;
// now, let's make a step back and look at this code closely (wtf?)
// If the content of the popper grows once it's been positioned, it
// may happen that the popper gets misplaced because of the new content
// overflowing its reference element
// To avoid this problem, we provide two options (x and y), which allow
// the consumer to define the offset origin.
// If we position a popper on top of a reference element, we can set
// `x` to `top` to make the popper grow towards its top instead of
// its bottom.
var left = void 0 ,
top = void 0 ;
if ( sideA === 'bottom' ) {
2018-08-19 05:22:08 +02:00
// when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)
// and not the bottom of the html element
if ( offsetParent . nodeName === 'HTML' ) {
top = - offsetParent . clientHeight + offsets . bottom ;
} else {
top = - offsetParentRect . height + offsets . bottom ;
}
2018-03-31 22:59:37 +02:00
} else {
top = offsets . top ;
}
if ( sideB === 'right' ) {
2018-08-19 05:22:08 +02:00
if ( offsetParent . nodeName === 'HTML' ) {
left = - offsetParent . clientWidth + offsets . right ;
} else {
left = - offsetParentRect . width + offsets . right ;
}
2018-03-31 22:59:37 +02:00
} else {
left = offsets . left ;
}
if ( gpuAcceleration && prefixedProperty ) {
styles [ prefixedProperty ] = 'translate3d(' + left + 'px, ' + top + 'px, 0)' ;
styles [ sideA ] = 0 ;
styles [ sideB ] = 0 ;
styles . willChange = 'transform' ;
} else {
// othwerise, we use the standard `top`, `left`, `bottom` and `right` properties
var invertTop = sideA === 'bottom' ? - 1 : 1 ;
var invertLeft = sideB === 'right' ? - 1 : 1 ;
styles [ sideA ] = top * invertTop ;
styles [ sideB ] = left * invertLeft ;
styles . willChange = sideA + ', ' + sideB ;
}
// Attributes
var attributes = {
'x-placement' : data . placement
} ;
// Update `data` attributes, styles and arrowStyles
2020-09-14 17:12:06 +02:00
data . attributes = _extends$1 ( { } , attributes , data . attributes ) ;
data . styles = _extends$1 ( { } , styles , data . styles ) ;
data . arrowStyles = _extends$1 ( { } , data . offsets . arrow , data . arrowStyles ) ;
2018-03-31 22:59:37 +02:00
return data ;
}
/ * *
* Helper used to know if the given modifier depends from another one . < br / >
* It checks if the needed modifier is listed and enabled .
* @ method
* @ memberof Popper . Utils
* @ param { Array } modifiers - list of modifiers
* @ param { String } requestingName - name of requesting modifier
* @ param { String } requestedName - name of requested modifier
* @ returns { Boolean }
* /
function isModifierRequired ( modifiers , requestingName , requestedName ) {
2020-11-11 18:07:37 +01:00
var requesting = find ( modifiers , function ( _ref ) {
2018-03-31 22:59:37 +02:00
var name = _ref . name ;
return name === requestingName ;
} ) ;
var isRequired = ! ! requesting && modifiers . some ( function ( modifier ) {
return modifier . name === requestedName && modifier . enabled && modifier . order < requesting . order ;
} ) ;
if ( ! isRequired ) {
var _requesting = '`' + requestingName + '`' ;
var requested = '`' + requestedName + '`' ;
console . warn ( requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!' ) ;
}
return isRequired ;
}
/ * *
* @ function
* @ memberof Modifiers
* @ argument { Object } data - The data object generated by update method
* @ argument { Object } options - Modifiers configuration and options
* @ returns { Object } The data object , properly modified
* /
function arrow ( data , options ) {
var _data$offsets$arrow ;
// arrow depends on keepTogether in order to work
if ( ! isModifierRequired ( data . instance . modifiers , 'arrow' , 'keepTogether' ) ) {
2017-09-06 06:05:12 +02:00
return data ;
}
2018-03-31 22:59:37 +02:00
var arrowElement = options . element ;
// if arrowElement is a string, suppose it's a CSS selector
if ( typeof arrowElement === 'string' ) {
arrowElement = data . instance . popper . querySelector ( arrowElement ) ;
// if arrowElement is not found, don't run the modifier
if ( ! arrowElement ) {
return data ;
}
} else {
// if the arrowElement isn't a query selector we must check that the
// provided DOM node is child of its popper node
if ( ! data . instance . popper . contains ( arrowElement ) ) {
console . warn ( 'WARNING: `arrow.element` must be child of its popper element!' ) ;
return data ;
}
}
var placement = data . placement . split ( '-' ) [ 0 ] ;
var _data$offsets = data . offsets ,
popper = _data$offsets . popper ,
reference = _data$offsets . reference ;
var isVertical = [ 'left' , 'right' ] . indexOf ( placement ) !== - 1 ;
var len = isVertical ? 'height' : 'width' ;
var sideCapitalized = isVertical ? 'Top' : 'Left' ;
var side = sideCapitalized . toLowerCase ( ) ;
var altSide = isVertical ? 'left' : 'top' ;
var opSide = isVertical ? 'bottom' : 'right' ;
var arrowElementSize = getOuterSizes ( arrowElement ) [ len ] ;
//
// extends keepTogether behavior making sure the popper and its
2018-08-19 05:22:08 +02:00
// reference have enough pixels in conjunction
2018-03-31 22:59:37 +02:00
//
// top/left side
if ( reference [ opSide ] - arrowElementSize < popper [ side ] ) {
data . offsets . popper [ side ] -= popper [ side ] - ( reference [ opSide ] - arrowElementSize ) ;
}
// bottom/right side
if ( reference [ side ] + arrowElementSize > popper [ opSide ] ) {
data . offsets . popper [ side ] += reference [ side ] + arrowElementSize - popper [ opSide ] ;
}
data . offsets . popper = getClientRect ( data . offsets . popper ) ;
// compute center of the popper
var center = reference [ side ] + reference [ len ] / 2 - arrowElementSize / 2 ;
// Compute the sideValue using the updated popper offsets
// take popper margin in account because we don't have this info available
var css = getStyleComputedProperty ( data . instance . popper ) ;
2020-09-14 17:12:06 +02:00
var popperMarginSide = parseFloat ( css [ 'margin' + sideCapitalized ] ) ;
var popperBorderSide = parseFloat ( css [ 'border' + sideCapitalized + 'Width' ] ) ;
2018-03-31 22:59:37 +02:00
var sideValue = center - data . offsets . popper [ side ] - popperMarginSide - popperBorderSide ;
// prevent arrowElement from being placed not contiguously to its popper
sideValue = Math . max ( Math . min ( popper [ len ] - arrowElementSize , sideValue ) , 0 ) ;
data . arrowElement = arrowElement ;
data . offsets . arrow = ( _data$offsets$arrow = { } , defineProperty ( _data$offsets$arrow , side , Math . round ( sideValue ) ) , defineProperty ( _data$offsets$arrow , altSide , '' ) , _data$offsets$arrow ) ;
return data ;
2017-09-06 06:05:12 +02:00
}
/ * *
2018-03-31 22:59:37 +02:00
* Get the opposite placement variation of the given one
* @ method
* @ memberof Popper . Utils
* @ argument { String } placement variation
* @ returns { String } flipped placement variation
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
function getOppositeVariation ( variation ) {
if ( variation === 'end' ) {
return 'start' ;
} else if ( variation === 'start' ) {
return 'end' ;
}
return variation ;
}
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* List of accepted placements to use as values of the ` placement ` option . < br / >
* Valid placements are :
* - ` auto `
* - ` top `
* - ` right `
* - ` bottom `
* - ` left `
2017-09-06 06:05:12 +02:00
*
2018-03-31 22:59:37 +02:00
* Each placement can have a variation from this list :
* - ` -start `
* - ` -end `
2017-09-06 06:05:12 +02:00
*
2018-03-31 22:59:37 +02:00
* Variations are interpreted easily if you think of them as the left to right
* written languages . Horizontally ( ` top ` and ` bottom ` ) , ` start ` is left and ` end `
* is right . < br / >
* Vertically ( ` left ` and ` right ` ) , ` start ` is top and ` end ` is bottom .
2017-09-06 06:05:12 +02:00
*
2018-03-31 22:59:37 +02:00
* Some valid examples are :
* - ` top-end ` ( on top of reference , right aligned )
* - ` right-start ` ( on right of reference , top aligned )
* - ` bottom ` ( on bottom , centered )
2018-08-19 05:22:08 +02:00
* - ` auto-end ` ( on the side with more space available , alignment depends by placement )
2017-09-06 06:05:12 +02:00
*
2018-03-31 22:59:37 +02:00
* @ static
* @ type { Array }
* @ enum { String }
* @ readonly
* @ method placements
* @ memberof Popper
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
var placements = [ 'auto-start' , 'auto' , 'auto-end' , 'top-start' , 'top' , 'top-end' , 'right-start' , 'right' , 'right-end' , 'bottom-end' , 'bottom' , 'bottom-start' , 'left-end' , 'left' , 'left-start' ] ;
// Get rid of `auto` `auto-start` and `auto-end`
var validPlacements = placements . slice ( 3 ) ;
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* Given an initial placement , returns all the subsequent placements
* clockwise ( or counter - clockwise ) .
2017-09-06 06:05:12 +02:00
*
2018-03-31 22:59:37 +02:00
* @ method
* @ memberof Popper . Utils
* @ argument { String } placement - A valid placement ( it accepts variations )
* @ argument { Boolean } counter - Set to true to walk the placements counterclockwise
* @ returns { Array } placements including their variations
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
function clockwise ( placement ) {
var counter = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : false ;
var index = validPlacements . indexOf ( placement ) ;
var arr = validPlacements . slice ( index + 1 ) . concat ( validPlacements . slice ( 0 , index ) ) ;
return counter ? arr . reverse ( ) : arr ;
}
var BEHAVIORS = {
FLIP : 'flip' ,
CLOCKWISE : 'clockwise' ,
COUNTERCLOCKWISE : 'counterclockwise'
} ;
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* @ function
* @ memberof Modifiers
* @ argument { Object } data - The data object generated by update method
* @ argument { Object } options - Modifiers configuration and options
* @ returns { Object } The data object , properly modified
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
function flip ( data , options ) {
// if `inner` modifier is enabled, we can't use the `flip` modifier
if ( isModifierEnabled ( data . instance . modifiers , 'inner' ) ) {
return data ;
}
if ( data . flipped && data . placement === data . originalPlacement ) {
// seems like flip is trying to loop, probably there's not enough space on any of the flippable sides
return data ;
}
var boundaries = getBoundaries ( data . instance . popper , data . instance . reference , options . padding , options . boundariesElement , data . positionFixed ) ;
var placement = data . placement . split ( '-' ) [ 0 ] ;
var placementOpposite = getOppositePlacement ( placement ) ;
var variation = data . placement . split ( '-' ) [ 1 ] || '' ;
var flipOrder = [ ] ;
switch ( options . behavior ) {
case BEHAVIORS . FLIP :
flipOrder = [ placement , placementOpposite ] ;
break ;
case BEHAVIORS . CLOCKWISE :
flipOrder = clockwise ( placement ) ;
break ;
case BEHAVIORS . COUNTERCLOCKWISE :
flipOrder = clockwise ( placement , true ) ;
break ;
default :
flipOrder = options . behavior ;
}
flipOrder . forEach ( function ( step , index ) {
if ( placement !== step || flipOrder . length === index + 1 ) {
return data ;
}
placement = data . placement . split ( '-' ) [ 0 ] ;
placementOpposite = getOppositePlacement ( placement ) ;
var popperOffsets = data . offsets . popper ;
var refOffsets = data . offsets . reference ;
// using floor because the reference offsets may contain decimals we are not going to consider here
var floor = Math . floor ;
var overlapsRef = placement === 'left' && floor ( popperOffsets . right ) > floor ( refOffsets . left ) || placement === 'right' && floor ( popperOffsets . left ) < floor ( refOffsets . right ) || placement === 'top' && floor ( popperOffsets . bottom ) > floor ( refOffsets . top ) || placement === 'bottom' && floor ( popperOffsets . top ) < floor ( refOffsets . bottom ) ;
var overflowsLeft = floor ( popperOffsets . left ) < floor ( boundaries . left ) ;
var overflowsRight = floor ( popperOffsets . right ) > floor ( boundaries . right ) ;
var overflowsTop = floor ( popperOffsets . top ) < floor ( boundaries . top ) ;
var overflowsBottom = floor ( popperOffsets . bottom ) > floor ( boundaries . bottom ) ;
var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom ;
// flip the variation if required
var isVertical = [ 'top' , 'bottom' ] . indexOf ( placement ) !== - 1 ;
2019-04-18 13:47:52 +02:00
// flips variation if reference element overflows boundaries
var flippedVariationByRef = ! ! options . flipVariations && ( isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || ! isVertical && variation === 'start' && overflowsTop || ! isVertical && variation === 'end' && overflowsBottom ) ;
// flips variation if popper content overflows boundaries
var flippedVariationByContent = ! ! options . flipVariationsByContent && ( isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || ! isVertical && variation === 'start' && overflowsBottom || ! isVertical && variation === 'end' && overflowsTop ) ;
var flippedVariation = flippedVariationByRef || flippedVariationByContent ;
2018-03-31 22:59:37 +02:00
if ( overlapsRef || overflowsBoundaries || flippedVariation ) {
// this boolean to detect any flip loop
data . flipped = true ;
if ( overlapsRef || overflowsBoundaries ) {
placement = flipOrder [ index + 1 ] ;
}
if ( flippedVariation ) {
variation = getOppositeVariation ( variation ) ;
}
data . placement = placement + ( variation ? '-' + variation : '' ) ;
// this object contains `position`, we want to preserve it along with
// any additional property we may add in the future
2020-09-14 17:12:06 +02:00
data . offsets . popper = _extends$1 ( { } , data . offsets . popper , getPopperOffsets ( data . instance . popper , data . offsets . reference , data . placement ) ) ;
2018-03-31 22:59:37 +02:00
data = runModifiers ( data . instance . modifiers , data , 'flip' ) ;
}
} ) ;
return data ;
}
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* @ function
* @ memberof Modifiers
* @ argument { Object } data - The data object generated by update method
* @ argument { Object } options - Modifiers configuration and options
* @ returns { Object } The data object , properly modified
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
function keepTogether ( data ) {
var _data$offsets = data . offsets ,
popper = _data$offsets . popper ,
reference = _data$offsets . reference ;
var placement = data . placement . split ( '-' ) [ 0 ] ;
var floor = Math . floor ;
var isVertical = [ 'top' , 'bottom' ] . indexOf ( placement ) !== - 1 ;
var side = isVertical ? 'right' : 'bottom' ;
var opSide = isVertical ? 'left' : 'top' ;
var measurement = isVertical ? 'width' : 'height' ;
if ( popper [ side ] < floor ( reference [ opSide ] ) ) {
data . offsets . popper [ opSide ] = floor ( reference [ opSide ] ) - popper [ measurement ] ;
}
if ( popper [ opSide ] > floor ( reference [ side ] ) ) {
data . offsets . popper [ opSide ] = floor ( reference [ side ] ) ;
}
return data ;
}
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* Converts a string containing value + unit into a px value number
* @ function
* @ memberof { modifiers ~ offset }
* @ private
* @ argument { String } str - Value + unit string
* @ argument { String } measurement - ` height ` or ` width `
* @ argument { Object } popperOffsets
* @ argument { Object } referenceOffsets
* @ returns { Number | String }
* Value in pixels , or original string if no values were extracted
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
function toValue ( str , measurement , popperOffsets , referenceOffsets ) {
// separate value from unit
var split = str . match ( /((?:\-|\+)?\d*\.?\d*)(.*)/ ) ;
var value = + split [ 1 ] ;
var unit = split [ 2 ] ;
// If it's not a number it's an operator, I guess
if ( ! value ) {
return str ;
}
if ( unit . indexOf ( '%' ) === 0 ) {
var element = void 0 ;
switch ( unit ) {
case '%p' :
element = popperOffsets ;
break ;
case '%' :
case '%r' :
default :
element = referenceOffsets ;
}
var rect = getClientRect ( element ) ;
return rect [ measurement ] / 100 * value ;
} else if ( unit === 'vh' || unit === 'vw' ) {
// if is a vh or vw, we calculate the size based on the viewport
var size = void 0 ;
if ( unit === 'vh' ) {
size = Math . max ( document . documentElement . clientHeight , window . innerHeight || 0 ) ;
} else {
size = Math . max ( document . documentElement . clientWidth , window . innerWidth || 0 ) ;
}
return size / 100 * value ;
} else {
// if is an explicit pixel unit, we get rid of the unit and keep the value
// if is an implicit unit, it's px, and we return just the value
return value ;
}
}
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* Parse an ` offset ` string to extrapolate ` x ` and ` y ` numeric offsets .
* @ function
* @ memberof { modifiers ~ offset }
* @ private
* @ argument { String } offset
* @ argument { Object } popperOffsets
* @ argument { Object } referenceOffsets
* @ argument { String } basePlacement
* @ returns { Array } a two cells array with x and y offsets in numbers
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
function parseOffset ( offset , popperOffsets , referenceOffsets , basePlacement ) {
var offsets = [ 0 , 0 ] ;
// Use height if placement is left or right and index is 0 otherwise use width
// in this way the first offset will use an axis and the second one
// will use the other one
var useHeight = [ 'right' , 'left' ] . indexOf ( basePlacement ) !== - 1 ;
// Split the offset string to obtain a list of values and operands
// The regex addresses values with the plus or minus sign in front (+10, -20, etc)
var fragments = offset . split ( /(\+|\-)/ ) . map ( function ( frag ) {
return frag . trim ( ) ;
} ) ;
// Detect if the offset string contains a pair of values or a single one
// they could be separated by comma or space
2020-11-11 18:07:37 +01:00
var divider = fragments . indexOf ( find ( fragments , function ( frag ) {
2018-03-31 22:59:37 +02:00
return frag . search ( /,|\s/ ) !== - 1 ;
} ) ) ;
if ( fragments [ divider ] && fragments [ divider ] . indexOf ( ',' ) === - 1 ) {
console . warn ( 'Offsets separated by white space(s) are deprecated, use a comma (,) instead.' ) ;
}
// If divider is found, we divide the list of values and operands to divide
// them by ofset X and Y.
var splitRegex = /\s*,\s*|\s+/ ;
var ops = divider !== - 1 ? [ fragments . slice ( 0 , divider ) . concat ( [ fragments [ divider ] . split ( splitRegex ) [ 0 ] ] ) , [ fragments [ divider ] . split ( splitRegex ) [ 1 ] ] . concat ( fragments . slice ( divider + 1 ) ) ] : [ fragments ] ;
// Convert the values with units to absolute pixels to allow our computations
ops = ops . map ( function ( op , index ) {
// Most of the units rely on the orientation of the popper
var measurement = ( index === 1 ? ! useHeight : useHeight ) ? 'height' : 'width' ;
var mergeWithPrevious = false ;
return op
// This aggregates any `+` or `-` sign that aren't considered operators
// e.g.: 10 + +5 => [10, +, +5]
. reduce ( function ( a , b ) {
if ( a [ a . length - 1 ] === '' && [ '+' , '-' ] . indexOf ( b ) !== - 1 ) {
a [ a . length - 1 ] = b ;
mergeWithPrevious = true ;
return a ;
} else if ( mergeWithPrevious ) {
a [ a . length - 1 ] += b ;
mergeWithPrevious = false ;
return a ;
} else {
return a . concat ( b ) ;
}
} , [ ] )
// Here we convert the string values into number values (in px)
. map ( function ( str ) {
return toValue ( str , measurement , popperOffsets , referenceOffsets ) ;
} ) ;
} ) ;
// Loop trough the offsets arrays and execute the operations
ops . forEach ( function ( op , index ) {
op . forEach ( function ( frag , index2 ) {
if ( isNumeric ( frag ) ) {
offsets [ index ] += frag * ( op [ index2 - 1 ] === '-' ? - 1 : 1 ) ;
}
} ) ;
} ) ;
return offsets ;
}
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* @ function
* @ memberof Modifiers
* @ argument { Object } data - The data object generated by update method
* @ argument { Object } options - Modifiers configuration and options
* @ argument { Number | String } options . offset = 0
* The offset value as described in the modifier description
* @ returns { Object } The data object , properly modified
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
function offset ( data , _ref ) {
var offset = _ref . offset ;
var placement = data . placement ,
_data$offsets = data . offsets ,
popper = _data$offsets . popper ,
reference = _data$offsets . reference ;
var basePlacement = placement . split ( '-' ) [ 0 ] ;
var offsets = void 0 ;
if ( isNumeric ( + offset ) ) {
offsets = [ + offset , 0 ] ;
} else {
offsets = parseOffset ( offset , popper , reference , basePlacement ) ;
}
if ( basePlacement === 'left' ) {
popper . top += offsets [ 0 ] ;
popper . left -= offsets [ 1 ] ;
} else if ( basePlacement === 'right' ) {
popper . top += offsets [ 0 ] ;
popper . left += offsets [ 1 ] ;
} else if ( basePlacement === 'top' ) {
popper . left += offsets [ 0 ] ;
popper . top -= offsets [ 1 ] ;
} else if ( basePlacement === 'bottom' ) {
popper . left += offsets [ 0 ] ;
popper . top += offsets [ 1 ] ;
}
data . popper = popper ;
return data ;
}
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* @ function
* @ memberof Modifiers
* @ argument { Object } data - The data object generated by ` update ` method
* @ argument { Object } options - Modifiers configuration and options
* @ returns { Object } The data object , properly modified
* /
function preventOverflow ( data , options ) {
var boundariesElement = options . boundariesElement || getOffsetParent ( data . instance . popper ) ;
// If offsetParent is the reference element, we really want to
// go one step up and use the next offsetParent as reference to
// avoid to make this modifier completely useless and look like broken
if ( data . instance . reference === boundariesElement ) {
boundariesElement = getOffsetParent ( boundariesElement ) ;
}
2018-04-30 07:22:04 +02:00
// NOTE: DOM access here
// resets the popper's position so that the document size can be calculated excluding
// the size of the popper element itself
var transformProp = getSupportedPropertyName ( 'transform' ) ;
var popperStyles = data . instance . popper . style ; // assignment to help minification
var top = popperStyles . top ,
left = popperStyles . left ,
transform = popperStyles [ transformProp ] ;
popperStyles . top = '' ;
popperStyles . left = '' ;
popperStyles [ transformProp ] = '' ;
2018-03-31 22:59:37 +02:00
var boundaries = getBoundaries ( data . instance . popper , data . instance . reference , options . padding , boundariesElement , data . positionFixed ) ;
2018-04-30 07:22:04 +02:00
// NOTE: DOM access here
// restores the original style properties after the offsets have been computed
popperStyles . top = top ;
popperStyles . left = left ;
popperStyles [ transformProp ] = transform ;
2018-03-31 22:59:37 +02:00
options . boundaries = boundaries ;
var order = options . priority ;
var popper = data . offsets . popper ;
var check = {
primary : function primary ( placement ) {
var value = popper [ placement ] ;
if ( popper [ placement ] < boundaries [ placement ] && ! options . escapeWithReference ) {
value = Math . max ( popper [ placement ] , boundaries [ placement ] ) ;
}
return defineProperty ( { } , placement , value ) ;
} ,
secondary : function secondary ( placement ) {
var mainSide = placement === 'right' ? 'left' : 'top' ;
var value = popper [ mainSide ] ;
if ( popper [ placement ] > boundaries [ placement ] && ! options . escapeWithReference ) {
value = Math . min ( popper [ mainSide ] , boundaries [ placement ] - ( placement === 'right' ? popper . width : popper . height ) ) ;
}
return defineProperty ( { } , mainSide , value ) ;
}
} ;
order . forEach ( function ( placement ) {
var side = [ 'left' , 'top' ] . indexOf ( placement ) !== - 1 ? 'primary' : 'secondary' ;
2020-09-14 17:12:06 +02:00
popper = _extends$1 ( { } , popper , check [ side ] ( placement ) ) ;
2018-03-31 22:59:37 +02:00
} ) ;
data . offsets . popper = popper ;
return data ;
}
/ * *
* @ function
* @ memberof Modifiers
* @ argument { Object } data - The data object generated by ` update ` method
* @ argument { Object } options - Modifiers configuration and options
* @ returns { Object } The data object , properly modified
* /
function shift ( data ) {
var placement = data . placement ;
var basePlacement = placement . split ( '-' ) [ 0 ] ;
var shiftvariation = placement . split ( '-' ) [ 1 ] ;
// if shift shiftvariation is specified, run the modifier
if ( shiftvariation ) {
var _data$offsets = data . offsets ,
reference = _data$offsets . reference ,
popper = _data$offsets . popper ;
var isVertical = [ 'bottom' , 'top' ] . indexOf ( basePlacement ) !== - 1 ;
var side = isVertical ? 'left' : 'top' ;
var measurement = isVertical ? 'width' : 'height' ;
var shiftOffsets = {
start : defineProperty ( { } , side , reference [ side ] ) ,
end : defineProperty ( { } , side , reference [ side ] + reference [ measurement ] - popper [ measurement ] )
} ;
2020-09-14 17:12:06 +02:00
data . offsets . popper = _extends$1 ( { } , popper , shiftOffsets [ shiftvariation ] ) ;
2018-03-31 22:59:37 +02:00
}
return data ;
}
/ * *
* @ function
* @ memberof Modifiers
* @ argument { Object } data - The data object generated by update method
* @ argument { Object } options - Modifiers configuration and options
* @ returns { Object } The data object , properly modified
* /
function hide ( data ) {
if ( ! isModifierRequired ( data . instance . modifiers , 'hide' , 'preventOverflow' ) ) {
return data ;
}
var refRect = data . offsets . reference ;
2020-11-11 18:07:37 +01:00
var bound = find ( data . instance . modifiers , function ( modifier ) {
2018-03-31 22:59:37 +02:00
return modifier . name === 'preventOverflow' ;
} ) . boundaries ;
if ( refRect . bottom < bound . top || refRect . left > bound . right || refRect . top > bound . bottom || refRect . right < bound . left ) {
// Avoid unnecessary DOM access if visibility hasn't changed
if ( data . hide === true ) {
return data ;
}
data . hide = true ;
data . attributes [ 'x-out-of-boundaries' ] = '' ;
} else {
// Avoid unnecessary DOM access if visibility hasn't changed
if ( data . hide === false ) {
return data ;
}
data . hide = false ;
data . attributes [ 'x-out-of-boundaries' ] = false ;
}
return data ;
}
/ * *
* @ function
* @ memberof Modifiers
* @ argument { Object } data - The data object generated by ` update ` method
* @ argument { Object } options - Modifiers configuration and options
* @ returns { Object } The data object , properly modified
* /
function inner ( data ) {
var placement = data . placement ;
var basePlacement = placement . split ( '-' ) [ 0 ] ;
var _data$offsets = data . offsets ,
popper = _data$offsets . popper ,
reference = _data$offsets . reference ;
var isHoriz = [ 'left' , 'right' ] . indexOf ( basePlacement ) !== - 1 ;
var subtractLength = [ 'top' , 'left' ] . indexOf ( basePlacement ) === - 1 ;
popper [ isHoriz ? 'left' : 'top' ] = reference [ basePlacement ] - ( subtractLength ? popper [ isHoriz ? 'width' : 'height' ] : 0 ) ;
data . placement = getOppositePlacement ( placement ) ;
data . offsets . popper = getClientRect ( popper ) ;
return data ;
}
/ * *
* Modifier function , each modifier can have a function of this type assigned
* to its ` fn ` property . < br / >
* These functions will be called on each update , this means that you must
* make sure they are performant enough to avoid performance bottlenecks .
2017-09-06 06:05:12 +02:00
*
2018-03-31 22:59:37 +02:00
* @ function ModifierFn
* @ argument { dataObject } data - The data object generated by ` update ` method
* @ argument { Object } options - Modifiers configuration and options
* @ returns { dataObject } The data object , properly modified
* /
/ * *
* Modifiers are plugins used to alter the behavior of your poppers . < br / >
* Popper . js uses a set of 9 modifiers to provide all the basic functionalities
* needed by the library .
2017-09-06 06:05:12 +02:00
*
2018-03-31 22:59:37 +02:00
* Usually you don ' t want to override the ` order ` , ` fn ` and ` onLoad ` props .
* All the other properties are configurations that could be tweaked .
* @ namespace modifiers
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
var modifiers = {
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* Modifier used to shift the popper on the start or end of its reference
* element . < br / >
* It will read the variation of the ` placement ` property . < br / >
* It can be one either ` -end ` or ` -start ` .
* @ memberof modifiers
* @ inner
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
shift : {
/** @prop {number} order=100 - Index used to define the order of execution */
order : 100 ,
/** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
enabled : true ,
/** @prop {ModifierFn} */
fn : shift
} ,
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* The ` offset ` modifier can shift your popper on both its axis .
*
* It accepts the following units :
2018-08-19 05:22:08 +02:00
* - ` px ` or unit - less , interpreted as pixels
2018-03-31 22:59:37 +02:00
* - ` % ` or ` %r ` , percentage relative to the length of the reference element
* - ` %p ` , percentage relative to the length of the popper element
* - ` vw ` , CSS viewport width unit
* - ` vh ` , CSS viewport height unit
*
* For length is intended the main axis relative to the placement of the popper . < br / >
* This means that if the placement is ` top ` or ` bottom ` , the length will be the
2018-08-19 05:22:08 +02:00
* ` width ` . In case of ` left ` or ` right ` , it will be the ` height ` .
2018-03-31 22:59:37 +02:00
*
* You can provide a single value ( as ` Number ` or ` String ` ) , or a pair of values
* as ` String ` divided by a comma or one ( or more ) white spaces . < br / >
* The latter is a deprecated method because it leads to confusion and will be
* removed in v2 . < br / >
* Additionally , it accepts additions and subtractions between different units .
* Note that multiplications and divisions aren ' t supported .
*
* Valid examples are :
* ` ` `
* 10
* '10%'
* '10, 10'
* '10%, 10'
* '10 + 10%'
* '10 - 5vh + 3%'
* '-10px + 5vh, 5px - 6%'
* ` ` `
* > * * NB * * : If you desire to apply offsets to your poppers in a way that may make them overlap
* > with their reference element , unfortunately , you will have to disable the ` flip ` modifier .
2018-08-19 05:22:08 +02:00
* > You can read more on this at this [ issue ] ( https : //github.com/FezVrasta/popper.js/issues/373).
2018-03-31 22:59:37 +02:00
*
* @ memberof modifiers
* @ inner
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
offset : {
/** @prop {number} order=200 - Index used to define the order of execution */
order : 200 ,
/** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
enabled : true ,
/** @prop {ModifierFn} */
fn : offset ,
/ * * @ p r o p { N u m b e r | S t r i n g } o f f s e t = 0
* The offset value as described in the modifier description
* /
offset : 0
} ,
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* Modifier used to prevent the popper from being positioned outside the boundary .
*
2018-08-19 05:22:08 +02:00
* A scenario exists where the reference itself is not within the boundaries . < br / >
2018-03-31 22:59:37 +02:00
* We can say it has "escaped the boundaries" — or just "escaped" . < br / >
* In this case we need to decide whether the popper should either :
*
* - detach from the reference and remain "trapped" in the boundaries , or
* - if it should ignore the boundary and "escape with its reference"
*
* When ` escapeWithReference ` is set to ` true ` and reference is completely
* outside its boundaries , the popper will overflow ( or completely leave )
* the boundaries in order to remain attached to the edge of the reference .
*
* @ memberof modifiers
* @ inner
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
preventOverflow : {
/** @prop {number} order=300 - Index used to define the order of execution */
order : 300 ,
/** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
enabled : true ,
/** @prop {ModifierFn} */
fn : preventOverflow ,
/ * *
* @ prop { Array } [ priority = [ 'left' , 'right' , 'top' , 'bottom' ] ]
* Popper will try to prevent overflow following these priorities by default ,
* then , it could overflow on the left and on top of the ` boundariesElement `
* /
priority : [ 'left' , 'right' , 'top' , 'bottom' ] ,
/ * *
* @ prop { number } padding = 5
* Amount of pixel used to define a minimum distance between the boundaries
2018-08-19 05:22:08 +02:00
* and the popper . This makes sure the popper always has a little padding
2018-03-31 22:59:37 +02:00
* between the edges of its container
* /
padding : 5 ,
/ * *
* @ prop { String | HTMLElement } boundariesElement = 'scrollParent'
2018-08-19 05:22:08 +02:00
* Boundaries used by the modifier . Can be ` scrollParent ` , ` window ` ,
2018-03-31 22:59:37 +02:00
* ` viewport ` or any DOM element .
* /
boundariesElement : 'scrollParent'
} ,
2017-09-06 06:05:12 +02:00
/ * *
2018-08-19 05:22:08 +02:00
* Modifier used to make sure the reference and its popper stay near each other
* without leaving any gap between the two . Especially useful when the arrow is
* enabled and you want to ensure that it points to its reference element .
* It cares only about the first axis . You can still have poppers with margin
2018-03-31 22:59:37 +02:00
* between the popper and its reference element .
* @ memberof modifiers
* @ inner
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
keepTogether : {
/** @prop {number} order=400 - Index used to define the order of execution */
order : 400 ,
/** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
enabled : true ,
/** @prop {ModifierFn} */
fn : keepTogether
} ,
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ * *
* This modifier is used to move the ` arrowElement ` of the popper to make
* sure it is positioned between the reference element and its popper element .
* It will read the outer size of the ` arrowElement ` node to detect how many
2018-08-19 05:22:08 +02:00
* pixels of conjunction are needed .
2018-03-31 22:59:37 +02:00
*
* It has no effect if no ` arrowElement ` is provided .
* @ memberof modifiers
* @ inner
* /
arrow : {
/** @prop {number} order=500 - Index used to define the order of execution */
order : 500 ,
/** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
enabled : true ,
/** @prop {ModifierFn} */
fn : arrow ,
/** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */
element : '[x-arrow]'
} ,
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ * *
* Modifier used to flip the popper ' s placement when it starts to overlap its
* reference element .
*
* Requires the ` preventOverflow ` modifier before it in order to work .
*
* * * NOTE : * * this modifier will interrupt the current update cycle and will
* restart it if it detects the need to flip the placement .
* @ memberof modifiers
* @ inner
* /
flip : {
/** @prop {number} order=600 - Index used to define the order of execution */
order : 600 ,
/** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
enabled : true ,
/** @prop {ModifierFn} */
fn : flip ,
/ * *
* @ prop { String | Array } behavior = 'flip'
* The behavior used to change the popper ' s placement . It can be one of
* ` flip ` , ` clockwise ` , ` counterclockwise ` or an array with a list of valid
2018-08-19 05:22:08 +02:00
* placements ( with optional variations )
2018-03-31 22:59:37 +02:00
* /
behavior : 'flip' ,
/ * *
* @ prop { number } padding = 5
* The popper will flip if it hits the edges of the ` boundariesElement `
* /
padding : 5 ,
/ * *
* @ prop { String | HTMLElement } boundariesElement = 'viewport'
2018-08-19 05:22:08 +02:00
* The element which will define the boundaries of the popper position .
* The popper will never be placed outside of the defined boundaries
* ( except if ` keepTogether ` is enabled )
2018-03-31 22:59:37 +02:00
* /
2019-04-18 13:47:52 +02:00
boundariesElement : 'viewport' ,
/ * *
* @ prop { Boolean } flipVariations = false
* The popper will switch placement variation between ` -start ` and ` -end ` when
* the reference element overlaps its boundaries .
*
* The original placement should have a set variation .
* /
flipVariations : false ,
/ * *
* @ prop { Boolean } flipVariationsByContent = false
* The popper will switch placement variation between ` -start ` and ` -end ` when
* the popper element overlaps its reference boundaries .
*
* The original placement should have a set variation .
* /
flipVariationsByContent : false
2018-03-31 22:59:37 +02:00
} ,
/ * *
* Modifier used to make the popper flow toward the inner of the reference element .
* By default , when this modifier is disabled , the popper will be placed outside
* the reference element .
* @ memberof modifiers
* @ inner
* /
inner : {
/** @prop {number} order=700 - Index used to define the order of execution */
order : 700 ,
/** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */
enabled : false ,
/** @prop {ModifierFn} */
fn : inner
} ,
/ * *
* Modifier used to hide the popper when its reference element is outside of the
* popper boundaries . It will set a ` x-out-of-boundaries ` attribute which can
* be used to hide with a CSS selector the popper when its reference is
* out of boundaries .
*
* Requires the ` preventOverflow ` modifier before it in order to work .
* @ memberof modifiers
* @ inner
* /
hide : {
/** @prop {number} order=800 - Index used to define the order of execution */
order : 800 ,
/** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
enabled : true ,
/** @prop {ModifierFn} */
fn : hide
} ,
/ * *
* Computes the style that will be applied to the popper element to gets
* properly positioned .
*
* Note that this modifier will not touch the DOM , it just prepares the styles
* so that ` applyStyle ` modifier can apply it . This separation is useful
* in case you need to replace ` applyStyle ` with a custom implementation .
*
* This modifier has ` 850 ` as ` order ` value to maintain backward compatibility
* with previous versions of Popper . js . Expect the modifiers ordering method
* to change in future major versions of the library .
*
* @ memberof modifiers
* @ inner
* /
computeStyle : {
/** @prop {number} order=850 - Index used to define the order of execution */
order : 850 ,
/** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
enabled : true ,
/** @prop {ModifierFn} */
fn : computeStyle ,
/ * *
* @ prop { Boolean } gpuAcceleration = true
2018-08-19 05:22:08 +02:00
* If true , it uses the CSS 3 D transformation to position the popper .
* Otherwise , it will use the ` top ` and ` left ` properties
2018-03-31 22:59:37 +02:00
* /
gpuAcceleration : true ,
/ * *
* @ prop { string } [ x = 'bottom' ]
* Where to anchor the X axis ( ` bottom ` or ` top ` ) . AKA X offset origin .
* Change this if your popper should grow in a direction different from ` bottom `
* /
x : 'bottom' ,
/ * *
* @ prop { string } [ x = 'left' ]
* Where to anchor the Y axis ( ` left ` or ` right ` ) . AKA Y offset origin .
* Change this if your popper should grow in a direction different from ` right `
* /
y : 'right'
} ,
/ * *
* Applies the computed styles to the popper element .
*
* All the DOM manipulations are limited to this modifier . This is useful in case
* you want to integrate Popper . js inside a framework or view library and you
* want to delegate all the DOM manipulations to it .
*
* Note that if you disable this modifier , you must make sure the popper element
* has its position set to ` absolute ` before Popper . js can do its work !
*
2018-08-19 05:22:08 +02:00
* Just disable this modifier and define your own to achieve the desired effect .
2018-03-31 22:59:37 +02:00
*
* @ memberof modifiers
* @ inner
* /
applyStyle : {
/** @prop {number} order=900 - Index used to define the order of execution */
order : 900 ,
/** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
enabled : true ,
/** @prop {ModifierFn} */
fn : applyStyle ,
/** @prop {Function} */
onLoad : applyStyleOnLoad ,
/ * *
* @ deprecated since version 1.10 . 0 , the property moved to ` computeStyle ` modifier
* @ prop { Boolean } gpuAcceleration = true
2018-08-19 05:22:08 +02:00
* If true , it uses the CSS 3 D transformation to position the popper .
* Otherwise , it will use the ` top ` and ` left ` properties
2018-03-31 22:59:37 +02:00
* /
gpuAcceleration : undefined
}
} ;
2017-09-06 06:05:12 +02:00
/ * *
2018-08-19 05:22:08 +02:00
* The ` dataObject ` is an object containing all the information used by Popper . js .
* This object is passed to modifiers and to the ` onCreate ` and ` onUpdate ` callbacks .
2018-03-31 22:59:37 +02:00
* @ name dataObject
* @ property { Object } data . instance The Popper . js instance
* @ property { String } data . placement Placement applied to popper
* @ property { String } data . originalPlacement Placement originally defined on init
* @ property { Boolean } data . flipped True if popper has been flipped by flip modifier
2018-08-19 05:22:08 +02:00
* @ property { Boolean } data . hide True if the reference element is out of boundaries , useful to know when to hide the popper
2018-03-31 22:59:37 +02:00
* @ property { HTMLElement } data . arrowElement Node used as arrow by arrow modifier
2018-08-19 05:22:08 +02:00
* @ property { Object } data . styles Any CSS property defined here will be applied to the popper . It expects the JavaScript nomenclature ( eg . ` marginBottom ` )
* @ property { Object } data . arrowStyles Any CSS property defined here will be applied to the popper arrow . It expects the JavaScript nomenclature ( eg . ` marginBottom ` )
2018-03-31 22:59:37 +02:00
* @ property { Object } data . boundaries Offsets of the popper boundaries
2018-08-19 05:22:08 +02:00
* @ property { Object } data . offsets The measurements of popper , reference and arrow elements
2018-03-31 22:59:37 +02:00
* @ property { Object } data . offsets . popper ` top ` , ` left ` , ` width ` , ` height ` values
* @ property { Object } data . offsets . reference ` top ` , ` left ` , ` width ` , ` height ` values
* @ property { Object } data . offsets . arrow ] ` top ` and ` left ` offsets , only one of them will be different from 0
2017-09-06 06:05:12 +02:00
* /
/ * *
2018-03-31 22:59:37 +02:00
* Default options provided to Popper . js constructor . < br / >
2018-08-19 05:22:08 +02:00
* These can be overridden using the ` options ` argument of Popper . js . < br / >
* To override an option , simply pass an object with the same
* structure of the ` options ` object , as the 3 rd argument . For example :
2018-03-31 22:59:37 +02:00
* ` ` `
* new Popper ( ref , pop , {
* modifiers : {
* preventOverflow : { enabled : false }
* }
* } )
* ` ` `
* @ type { Object }
* @ static
* @ memberof Popper
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
var Defaults = {
/ * *
2018-08-19 05:22:08 +02:00
* Popper ' s placement .
2018-03-31 22:59:37 +02:00
* @ prop { Popper . placements } placement = 'bottom'
* /
placement : 'bottom' ,
/ * *
* Set this to true if you want popper to position it self in 'fixed' mode
* @ prop { Boolean } positionFixed = false
* /
positionFixed : false ,
/ * *
2018-08-19 05:22:08 +02:00
* Whether events ( resize , scroll ) are initially enabled .
2018-03-31 22:59:37 +02:00
* @ prop { Boolean } eventsEnabled = true
* /
eventsEnabled : true ,
/ * *
* Set to true if you want to automatically remove the popper when
* you call the ` destroy ` method .
* @ prop { Boolean } removeOnDestroy = false
* /
removeOnDestroy : false ,
/ * *
* Callback called when the popper is created . < br / >
2018-08-19 05:22:08 +02:00
* By default , it is set to no - op . < br / >
2018-03-31 22:59:37 +02:00
* Access Popper . js instance with ` data.instance ` .
* @ prop { onCreate }
* /
onCreate : function onCreate ( ) { } ,
/ * *
2018-08-19 05:22:08 +02:00
* Callback called when the popper is updated . This callback is not called
2018-03-31 22:59:37 +02:00
* on the initialization / creation of the popper , but only on subsequent
* updates . < br / >
2018-08-19 05:22:08 +02:00
* By default , it is set to no - op . < br / >
2018-03-31 22:59:37 +02:00
* Access Popper . js instance with ` data.instance ` .
* @ prop { onUpdate }
* /
onUpdate : function onUpdate ( ) { } ,
/ * *
* List of modifiers used to modify the offsets before they are applied to the popper .
2018-08-19 05:22:08 +02:00
* They provide most of the functionalities of Popper . js .
2018-03-31 22:59:37 +02:00
* @ prop { modifiers }
* /
modifiers : modifiers
} ;
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* @ callback onCreate
* @ param { dataObject } data
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* @ callback onUpdate
* @ param { dataObject } data
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
// Utils
// Methods
var Popper = function ( ) {
/ * *
2018-08-19 05:22:08 +02:00
* Creates a new Popper . js instance .
2018-03-31 22:59:37 +02:00
* @ class Popper
2019-04-18 13:47:52 +02:00
* @ param { Element | referenceObject } reference - The reference element used to position the popper
* @ param { Element } popper - The HTML / XML element used as the popper
2018-03-31 22:59:37 +02:00
* @ param { Object } options - Your custom options to override the ones defined in [ Defaults ] ( # defaults )
* @ return { Object } instance - The generated Popper . js instance
* /
function Popper ( reference , popper ) {
var _this = this ;
var options = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : { } ;
classCallCheck ( this , Popper ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
this . scheduleUpdate = function ( ) {
return requestAnimationFrame ( _this . update ) ;
} ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// make update() debounced, so that it only runs at most once-per-tick
this . update = debounce ( this . update . bind ( this ) ) ;
// with {} we create a new object with the options inside it
2020-09-14 17:12:06 +02:00
this . options = _extends$1 ( { } , Popper . Defaults , options ) ;
2018-03-31 22:59:37 +02:00
// init state
this . state = {
isDestroyed : false ,
isCreated : false ,
scrollParents : [ ]
} ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// get reference and popper elements (allow jQuery wrappers)
this . reference = reference && reference . jquery ? reference [ 0 ] : reference ;
this . popper = popper && popper . jquery ? popper [ 0 ] : popper ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// Deep merge modifiers options
this . options . modifiers = { } ;
2020-09-14 17:12:06 +02:00
Object . keys ( _extends$1 ( { } , Popper . Defaults . modifiers , options . modifiers ) ) . forEach ( function ( name ) {
_this . options . modifiers [ name ] = _extends$1 ( { } , Popper . Defaults . modifiers [ name ] || { } , options . modifiers ? options . modifiers [ name ] : { } ) ;
2018-03-31 22:59:37 +02:00
} ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// Refactoring modifiers' list (Object => Array)
this . modifiers = Object . keys ( this . options . modifiers ) . map ( function ( name ) {
2020-09-14 17:12:06 +02:00
return _extends$1 ( {
2018-03-31 22:59:37 +02:00
name : name
} , _this . options . modifiers [ name ] ) ;
} )
// sort the modifiers by order
. sort ( function ( a , b ) {
return a . order - b . order ;
} ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// modifiers have the ability to execute arbitrary code when Popper.js get inited
// such code is executed in the same order of its modifier
// they could add new properties to their options configuration
// BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!
this . modifiers . forEach ( function ( modifierOptions ) {
if ( modifierOptions . enabled && isFunction ( modifierOptions . onLoad ) ) {
modifierOptions . onLoad ( _this . reference , _this . popper , _this . options , modifierOptions , _this . state ) ;
}
} ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
// fire the first update to position the popper in the right place
this . update ( ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
var eventsEnabled = this . options . eventsEnabled ;
if ( eventsEnabled ) {
// setup event listeners, they will take care of update the position in specific situations
this . enableEventListeners ( ) ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
this . state . eventsEnabled = eventsEnabled ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
// We can't use class properties because they don't get listed in the
// class prototype and break stuff like Sinon stubs
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
createClass ( Popper , [ {
key : 'update' ,
value : function update$$1 ( ) {
return update . call ( this ) ;
}
} , {
key : 'destroy' ,
value : function destroy$$1 ( ) {
return destroy . call ( this ) ;
}
} , {
key : 'enableEventListeners' ,
value : function enableEventListeners$$1 ( ) {
return enableEventListeners . call ( this ) ;
}
} , {
key : 'disableEventListeners' ,
value : function disableEventListeners$$1 ( ) {
return disableEventListeners . call ( this ) ;
}
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ * *
2018-08-19 05:22:08 +02:00
* Schedules an update . It will run on the next UI update available .
2018-03-31 22:59:37 +02:00
* @ method scheduleUpdate
* @ memberof Popper
* /
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ * *
* Collection of utilities useful when writing custom modifiers .
* Starting from version 1.7 , this method is available only if you
* include ` popper-utils.js ` before ` popper.js ` .
*
* * * DEPRECATION * * : This way to access PopperUtils is deprecated
* and will be removed in v2 ! Use the PopperUtils module directly instead .
* Due to the high instability of the methods contained in Utils , we can ' t
* guarantee them to follow semver . Use them at your own risk !
* @ static
* @ private
* @ type { Object }
* @ deprecated since version 1.8
* @ member Utils
* @ memberof Popper
* /
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
} ] ) ;
return Popper ;
} ( ) ;
2017-09-06 06:05:12 +02:00
/ * *
2018-03-31 22:59:37 +02:00
* The ` referenceObject ` is an object that provides an interface compatible with Popper . js
* and lets you use it as replacement of a real DOM node . < br / >
* You can use this method to position a popper relatively to a set of coordinates
* in case you don ' t have a DOM node to use as reference .
*
* ` ` `
* new Popper ( referenceObject , popperNode ) ;
* ` ` `
*
2018-08-19 05:22:08 +02:00
* NB : This feature isn ' t supported in Internet Explorer 10.
2018-03-31 22:59:37 +02:00
* @ name referenceObject
* @ property { Function } data . getBoundingClientRect
* A function that returns a set of coordinates compatible with the native ` getBoundingClientRect ` method .
* @ property { number } data . clientWidth
* An ES6 getter that will return the width of the virtual reference element .
* @ property { number } data . clientHeight
* An ES6 getter that will return the height of the virtual reference element .
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
Popper . Utils = ( typeof window !== 'undefined' ? window : global ) . PopperUtils ;
Popper . placements = placements ;
Popper . Defaults = Defaults ;
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME$4 = 'dropdown' ;
2020-11-11 18:07:37 +01:00
var VERSION$4 = '5.0.0-alpha3' ;
2018-11-13 07:41:12 +01:00
var DATA _KEY$4 = 'bs.dropdown' ;
var EVENT _KEY$4 = "." + DATA _KEY$4 ;
var DATA _API _KEY$4 = '.data-api' ;
2020-05-13 20:53:43 +02:00
var ESCAPE _KEY = 'Escape' ;
var SPACE _KEY = 'Space' ;
var TAB _KEY = 'Tab' ;
var ARROW _UP _KEY = 'ArrowUp' ;
var ARROW _DOWN _KEY = 'ArrowDown' ;
var RIGHT _MOUSE _BUTTON = 2 ; // MouseEvent.button value for the secondary button, usually the right button
var REGEXP _KEYDOWN = new RegExp ( ARROW _UP _KEY + "|" + ARROW _DOWN _KEY + "|" + ESCAPE _KEY ) ;
2020-03-28 11:29:08 +01:00
var EVENT _HIDE$1 = "hide" + EVENT _KEY$4 ;
var EVENT _HIDDEN$1 = "hidden" + EVENT _KEY$4 ;
var EVENT _SHOW$1 = "show" + EVENT _KEY$4 ;
var EVENT _SHOWN$1 = "shown" + EVENT _KEY$4 ;
var EVENT _CLICK = "click" + EVENT _KEY$4 ;
var EVENT _CLICK _DATA _API$4 = "click" + EVENT _KEY$4 + DATA _API _KEY$4 ;
var EVENT _KEYDOWN _DATA _API = "keydown" + EVENT _KEY$4 + DATA _API _KEY$4 ;
var EVENT _KEYUP _DATA _API = "keyup" + EVENT _KEY$4 + DATA _API _KEY$4 ;
2020-06-16 20:50:01 +02:00
var CLASS _NAME _DISABLED = 'disabled' ;
2020-03-28 11:29:08 +01:00
var CLASS _NAME _SHOW$1 = 'show' ;
var CLASS _NAME _DROPUP = 'dropup' ;
var CLASS _NAME _DROPRIGHT = 'dropright' ;
var CLASS _NAME _DROPLEFT = 'dropleft' ;
var CLASS _NAME _MENURIGHT = 'dropdown-menu-right' ;
var CLASS _NAME _NAVBAR = 'navbar' ;
var CLASS _NAME _POSITION _STATIC = 'position-static' ;
var SELECTOR _DATA _TOGGLE$2 = '[data-toggle="dropdown"]' ;
var SELECTOR _FORM _CHILD = '.dropdown form' ;
var SELECTOR _MENU = '.dropdown-menu' ;
var SELECTOR _NAVBAR _NAV = '.navbar-nav' ;
var SELECTOR _VISIBLE _ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)' ;
var PLACEMENT _TOP = 'top-start' ;
var PLACEMENT _TOPEND = 'top-end' ;
var PLACEMENT _BOTTOM = 'bottom-start' ;
var PLACEMENT _BOTTOMEND = 'bottom-end' ;
var PLACEMENT _RIGHT = 'right-start' ;
var PLACEMENT _LEFT = 'left-start' ;
2018-11-13 07:41:12 +01:00
var Default$2 = {
offset : 0 ,
flip : true ,
boundary : 'scrollParent' ,
reference : 'toggle' ,
2019-08-27 15:03:21 +02:00
display : 'dynamic' ,
popperConfig : null
2018-11-13 07:41:12 +01:00
} ;
var DefaultType$2 = {
offset : '(number|string|function)' ,
flip : 'boolean' ,
boundary : '(string|element)' ,
reference : '(string|element)' ,
2019-08-27 15:03:21 +02:00
display : 'string' ,
popperConfig : '(null|object)'
2018-11-13 07:41:12 +01:00
} ;
2019-10-08 08:39:10 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-03-31 22:59:37 +02:00
2020-03-28 11:29:08 +01:00
var Dropdown = /*#__PURE__*/ function ( ) {
2018-11-13 07:41:12 +01:00
function Dropdown ( element , config ) {
this . _element = element ;
this . _popper = null ;
this . _config = this . _getConfig ( config ) ;
this . _menu = this . _getMenuElement ( ) ;
this . _inNavbar = this . _detectNavbar ( ) ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
this . _addEventListeners ( ) ;
2019-03-01 17:31:34 +01:00
Data . setData ( element , DATA _KEY$4 , this ) ;
2018-11-13 07:41:12 +01:00
} // Getters
2018-03-31 22:59:37 +02:00
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var _proto = Dropdown . prototype ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
// Public
_proto . toggle = function toggle ( ) {
2020-06-16 20:50:01 +02:00
if ( this . _element . disabled || this . _element . classList . contains ( CLASS _NAME _DISABLED ) ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var isActive = this . _element . classList . contains ( CLASS _NAME _SHOW$1 ) ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Dropdown . clearMenus ( ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( isActive ) {
return ;
}
2018-03-31 22:59:37 +02:00
2019-08-27 15:03:21 +02:00
this . show ( ) ;
} ;
_proto . show = function show ( ) {
2020-06-16 20:50:01 +02:00
if ( this . _element . disabled || this . _element . classList . contains ( CLASS _NAME _DISABLED ) || this . _menu . classList . contains ( CLASS _NAME _SHOW$1 ) ) {
2019-08-27 15:03:21 +02:00
return ;
}
var parent = Dropdown . getParentFromElement ( this . _element ) ;
2018-11-13 07:41:12 +01:00
var relatedTarget = {
relatedTarget : this . _element
} ;
2020-03-28 11:29:08 +01:00
var showEvent = EventHandler . trigger ( this . _element , EVENT _SHOW$1 , relatedTarget ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( showEvent . defaultPrevented ) {
2018-11-13 07:41:12 +01:00
return ;
} // Disable totally Popper.js for Dropdown in Navbar
2017-09-30 23:28:03 +02:00
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! this . _inNavbar ) {
if ( typeof Popper === 'undefined' ) {
2019-03-01 17:31:34 +01:00
throw new TypeError ( 'Bootstrap\'s dropdowns require Popper.js (https://popper.js.org)' ) ;
2018-03-31 22:59:37 +02:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var referenceElement = this . _element ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _config . reference === 'parent' ) {
referenceElement = parent ;
2019-03-01 17:31:34 +01:00
} else if ( isElement ( this . _config . reference ) ) {
2018-11-13 07:41:12 +01:00
referenceElement = this . _config . reference ; // Check if it's jQuery element
2017-10-30 00:19:14 +01:00
2018-11-13 07:41:12 +01:00
if ( typeof this . _config . reference . jquery !== 'undefined' ) {
referenceElement = this . _config . reference [ 0 ] ;
2018-03-31 22:59:37 +02:00
}
2018-11-13 07:41:12 +01:00
} // If boundary is not `scrollParent`, then set position to `static`
// to allow the menu to "escape" the scroll parent's boundaries
// https://github.com/twbs/bootstrap/issues/24251
2017-10-30 00:19:14 +01:00
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _config . boundary !== 'scrollParent' ) {
2020-03-28 11:29:08 +01:00
parent . classList . add ( CLASS _NAME _POSITION _STATIC ) ;
2018-11-13 07:41:12 +01:00
}
2018-02-11 23:53:29 +01:00
2018-11-13 07:41:12 +01:00
this . _popper = new Popper ( referenceElement , this . _menu , this . _getPopperConfig ( ) ) ;
} // If this is a touch-enabled device we add extra
// empty mouseover listeners to the body's immediate children;
// only needed because of broken event delegation on iOS
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
2017-09-30 23:28:03 +02:00
2018-03-31 22:59:37 +02:00
2020-05-13 20:53:43 +02:00
if ( 'ontouchstart' in document . documentElement && ! parent . closest ( SELECTOR _NAVBAR _NAV ) ) {
2020-03-28 11:29:08 +01:00
var _ref ;
( _ref = [ ] ) . concat . apply ( _ref , document . body . children ) . forEach ( function ( elem ) {
2019-03-01 17:31:34 +01:00
return EventHandler . on ( elem , 'mouseover' , null , noop ( ) ) ;
} ) ;
2018-11-13 07:41:12 +01:00
}
2017-12-23 01:21:54 +01:00
2018-11-13 07:41:12 +01:00
this . _element . focus ( ) ;
2017-12-23 01:21:54 +01:00
2018-11-13 07:41:12 +01:00
this . _element . setAttribute ( 'aria-expanded' , true ) ;
2017-09-06 06:05:12 +02:00
2020-10-28 04:45:48 +01:00
this . _menu . classList . toggle ( CLASS _NAME _SHOW$1 ) ;
this . _element . classList . toggle ( CLASS _NAME _SHOW$1 ) ;
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( parent , EVENT _SHOWN$1 , relatedTarget ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . hide = function hide ( ) {
2020-06-16 20:50:01 +02:00
if ( this . _element . disabled || this . _element . classList . contains ( CLASS _NAME _DISABLED ) || ! this . _menu . classList . contains ( CLASS _NAME _SHOW$1 ) ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-30 23:28:03 +02:00
2019-08-27 15:03:21 +02:00
var parent = Dropdown . getParentFromElement ( this . _element ) ;
2018-11-13 07:41:12 +01:00
var relatedTarget = {
relatedTarget : this . _element
} ;
2020-03-28 11:29:08 +01:00
var hideEvent = EventHandler . trigger ( parent , EVENT _HIDE$1 , relatedTarget ) ;
2017-09-30 23:28:03 +02:00
2019-03-01 17:31:34 +01:00
if ( hideEvent . defaultPrevented ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
if ( this . _popper ) {
this . _popper . destroy ( ) ;
}
2020-10-28 04:45:48 +01:00
this . _menu . classList . toggle ( CLASS _NAME _SHOW$1 ) ;
this . _element . classList . toggle ( CLASS _NAME _SHOW$1 ) ;
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( parent , EVENT _HIDDEN$1 , relatedTarget ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . dispose = function dispose ( ) {
2019-03-01 17:31:34 +01:00
Data . removeData ( this . _element , DATA _KEY$4 ) ;
EventHandler . off ( this . _element , EVENT _KEY$4 ) ;
2018-11-13 07:41:12 +01:00
this . _element = null ;
this . _menu = null ;
2017-09-30 23:28:03 +02:00
2019-08-27 15:03:21 +02:00
if ( this . _popper ) {
2018-11-13 07:41:12 +01:00
this . _popper . destroy ( ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _popper = null ;
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . update = function update ( ) {
this . _inNavbar = this . _detectNavbar ( ) ;
2017-09-30 23:28:03 +02:00
2019-08-27 15:03:21 +02:00
if ( this . _popper ) {
2018-11-13 07:41:12 +01:00
this . _popper . scheduleUpdate ( ) ;
}
2019-01-04 17:29:45 +01:00
} // Private
;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
_proto . _addEventListeners = function _addEventListeners ( ) {
var _this = this ;
2018-03-31 22:59:37 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _CLICK , function ( event ) {
2018-11-13 07:41:12 +01:00
event . preventDefault ( ) ;
event . stopPropagation ( ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_this . toggle ( ) ;
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getConfig = function _getConfig ( config ) {
2020-09-14 17:12:06 +02:00
config = _extends ( { } , this . constructor . Default , Manipulator . getDataAttributes ( this . _element ) , config ) ;
2019-03-01 17:31:34 +01:00
typeCheckConfig ( NAME$4 , config , this . constructor . DefaultType ) ;
2018-11-13 07:41:12 +01:00
return config ;
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getMenuElement = function _getMenuElement ( ) {
2020-03-28 11:29:08 +01:00
return SelectorEngine . next ( this . _element , SELECTOR _MENU ) [ 0 ] ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getPlacement = function _getPlacement ( ) {
2019-03-01 17:31:34 +01:00
var parentDropdown = this . _element . parentNode ;
2020-03-28 11:29:08 +01:00
var placement = PLACEMENT _BOTTOM ; // Handle dropup
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( parentDropdown . classList . contains ( CLASS _NAME _DROPUP ) ) {
2020-11-11 18:07:37 +01:00
placement = this . _menu . classList . contains ( CLASS _NAME _MENURIGHT ) ? PLACEMENT _TOPEND : PLACEMENT _TOP ;
2020-03-28 11:29:08 +01:00
} else if ( parentDropdown . classList . contains ( CLASS _NAME _DROPRIGHT ) ) {
placement = PLACEMENT _RIGHT ;
} else if ( parentDropdown . classList . contains ( CLASS _NAME _DROPLEFT ) ) {
placement = PLACEMENT _LEFT ;
} else if ( this . _menu . classList . contains ( CLASS _NAME _MENURIGHT ) ) {
placement = PLACEMENT _BOTTOMEND ;
2018-11-13 07:41:12 +01:00
}
2017-10-16 00:51:44 +02:00
2018-11-13 07:41:12 +01:00
return placement ;
} ;
2017-10-16 00:51:44 +02:00
2018-11-13 07:41:12 +01:00
_proto . _detectNavbar = function _detectNavbar ( ) {
2020-05-13 20:53:43 +02:00
return Boolean ( this . _element . closest ( "." + CLASS _NAME _NAVBAR ) ) ;
2018-11-13 07:41:12 +01:00
} ;
2018-03-31 22:59:37 +02:00
2019-02-11 20:15:34 +01:00
_proto . _getOffset = function _getOffset ( ) {
2018-11-13 07:41:12 +01:00
var _this2 = this ;
2018-03-31 22:59:37 +02:00
2019-02-11 20:15:34 +01:00
var offset = { } ;
2018-02-19 23:50:56 +01:00
2018-11-13 07:41:12 +01:00
if ( typeof this . _config . offset === 'function' ) {
2019-02-11 20:15:34 +01:00
offset . fn = function ( data ) {
2020-09-14 17:12:06 +02:00
data . offsets = _extends ( { } , data . offsets , _this2 . _config . offset ( data . offsets , _this2 . _element ) || { } ) ;
2018-11-13 07:41:12 +01:00
return data ;
} ;
} else {
2019-02-11 20:15:34 +01:00
offset . offset = this . _config . offset ;
2018-11-13 07:41:12 +01:00
}
2018-03-31 22:59:37 +02:00
2019-02-11 20:15:34 +01:00
return offset ;
} ;
_proto . _getPopperConfig = function _getPopperConfig ( ) {
2018-11-13 07:41:12 +01:00
var popperConfig = {
placement : this . _getPlacement ( ) ,
modifiers : {
2019-02-11 20:15:34 +01:00
offset : this . _getOffset ( ) ,
2018-11-13 07:41:12 +01:00
flip : {
enabled : this . _config . flip
} ,
preventOverflow : {
boundariesElement : this . _config . boundary
2018-03-31 22:59:37 +02:00
}
2019-10-08 08:39:10 +02:00
}
} ; // Disable Popper.js if we have a static display
2018-02-19 23:50:56 +01:00
2018-11-13 07:41:12 +01:00
if ( this . _config . display === 'static' ) {
popperConfig . modifiers . applyStyle = {
enabled : false
} ;
}
2017-09-06 06:05:12 +02:00
2020-09-14 17:12:06 +02:00
return _extends ( { } , popperConfig , this . _config . popperConfig ) ;
2019-01-04 17:29:45 +01:00
} // Static
;
2017-09-30 23:28:03 +02:00
2019-08-27 15:03:21 +02:00
Dropdown . dropdownInterface = function dropdownInterface ( element , config ) {
2019-03-01 17:31:34 +01:00
var data = Data . getData ( element , DATA _KEY$4 ) ;
2018-07-12 06:42:55 +02:00
2019-03-01 17:31:34 +01:00
var _config = typeof config === 'object' ? config : null ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( ! data ) {
data = new Dropdown ( element , _config ) ;
}
if ( typeof config === 'string' ) {
if ( typeof data [ config ] === 'undefined' ) {
2019-03-11 16:13:30 +01:00
throw new TypeError ( "No method named \"" + config + "\"" ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
data [ config ] ( ) ;
}
} ;
2017-09-30 23:28:03 +02:00
2019-08-27 15:03:21 +02:00
Dropdown . jQueryInterface = function jQueryInterface ( config ) {
2019-03-01 17:31:34 +01:00
return this . each ( function ( ) {
2019-08-27 15:03:21 +02:00
Dropdown . dropdownInterface ( this , config ) ;
2018-11-13 07:41:12 +01:00
} ) ;
} ;
2019-08-27 15:03:21 +02:00
Dropdown . clearMenus = function clearMenus ( event ) {
2020-05-13 20:53:43 +02:00
if ( event && ( event . button === RIGHT _MOUSE _BUTTON || event . type === 'keyup' && event . key !== TAB _KEY ) ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var toggles = SelectorEngine . find ( SELECTOR _DATA _TOGGLE$2 ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
for ( var i = 0 , len = toggles . length ; i < len ; i ++ ) {
2019-08-27 15:03:21 +02:00
var parent = Dropdown . getParentFromElement ( toggles [ i ] ) ;
2019-03-01 17:31:34 +01:00
var context = Data . getData ( toggles [ i ] , DATA _KEY$4 ) ;
2018-11-13 07:41:12 +01:00
var relatedTarget = {
relatedTarget : toggles [ i ]
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( event && event . type === 'click' ) {
relatedTarget . clickEvent = event ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! context ) {
continue ;
2017-09-06 06:05:12 +02:00
}
2018-11-13 07:41:12 +01:00
var dropdownMenu = context . _menu ;
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
if ( ! toggles [ i ] . classList . contains ( CLASS _NAME _SHOW$1 ) ) {
2018-11-13 07:41:12 +01:00
continue ;
2017-09-06 06:05:12 +02:00
}
2020-05-13 20:53:43 +02:00
if ( event && ( event . type === 'click' && /input|textarea/i . test ( event . target . tagName ) || event . type === 'keyup' && event . key === TAB _KEY ) && dropdownMenu . contains ( event . target ) ) {
2018-11-13 07:41:12 +01:00
continue ;
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var hideEvent = EventHandler . trigger ( parent , EVENT _HIDE$1 , relatedTarget ) ;
2017-09-30 23:28:03 +02:00
2019-03-01 17:31:34 +01:00
if ( hideEvent . defaultPrevented ) {
2018-11-13 07:41:12 +01:00
continue ;
} // If this is a touch-enabled device we remove the extra
// empty mouseover listeners we added for iOS support
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( 'ontouchstart' in document . documentElement ) {
2020-03-28 11:29:08 +01:00
var _ref2 ;
( _ref2 = [ ] ) . concat . apply ( _ref2 , document . body . children ) . forEach ( function ( elem ) {
2019-03-01 17:31:34 +01:00
return EventHandler . off ( elem , 'mouseover' , null , noop ( ) ) ;
} ) ;
2017-09-06 06:05:12 +02:00
}
2018-11-13 07:41:12 +01:00
toggles [ i ] . setAttribute ( 'aria-expanded' , 'false' ) ;
2019-08-27 15:03:21 +02:00
if ( context . _popper ) {
context . _popper . destroy ( ) ;
}
2020-03-28 11:29:08 +01:00
dropdownMenu . classList . remove ( CLASS _NAME _SHOW$1 ) ;
toggles [ i ] . classList . remove ( CLASS _NAME _SHOW$1 ) ;
EventHandler . trigger ( parent , EVENT _HIDDEN$1 , relatedTarget ) ;
2018-11-13 07:41:12 +01:00
}
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Dropdown . getParentFromElement = function getParentFromElement ( element ) {
return getElementFromSelector ( element ) || element . parentNode ;
2019-03-01 17:31:34 +01:00
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Dropdown . dataApiKeydownHandler = function dataApiKeydownHandler ( event ) {
2018-11-13 07:41:12 +01:00
// If not input/textarea:
// - And not a key in REGEXP_KEYDOWN => not a dropdown command
// If input/textarea:
// - If space key => not a dropdown command
// - If key is other than escape
// - If key is not up or down => not a dropdown command
// - If trigger inside the menu => not a dropdown command
2020-05-13 20:53:43 +02:00
if ( /input|textarea/i . test ( event . target . tagName ) ? event . key === SPACE _KEY || event . key !== ESCAPE _KEY && ( event . key !== ARROW _DOWN _KEY && event . key !== ARROW _UP _KEY || event . target . closest ( SELECTOR _MENU ) ) : ! REGEXP _KEYDOWN . test ( event . key ) ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
event . preventDefault ( ) ;
event . stopPropagation ( ) ;
2017-09-06 06:05:12 +02:00
2020-06-16 20:50:01 +02:00
if ( this . disabled || this . classList . contains ( CLASS _NAME _DISABLED ) ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-30 23:28:03 +02:00
2019-08-27 15:03:21 +02:00
var parent = Dropdown . getParentFromElement ( this ) ;
2020-03-28 11:29:08 +01:00
var isActive = this . classList . contains ( CLASS _NAME _SHOW$1 ) ;
2018-11-13 07:41:12 +01:00
2020-05-13 20:53:43 +02:00
if ( event . key === ESCAPE _KEY ) {
2020-03-28 11:29:08 +01:00
var button = this . matches ( SELECTOR _DATA _TOGGLE$2 ) ? this : SelectorEngine . prev ( this , SELECTOR _DATA _TOGGLE$2 ) [ 0 ] ;
button . focus ( ) ;
Dropdown . clearMenus ( ) ;
return ;
}
2017-09-06 06:05:12 +02:00
2020-05-13 20:53:43 +02:00
if ( ! isActive || event . key === SPACE _KEY ) {
2019-08-27 15:03:21 +02:00
Dropdown . clearMenus ( ) ;
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var items = SelectorEngine . find ( SELECTOR _VISIBLE _ITEMS , parent ) . filter ( isVisible ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( ! items . length ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2020-05-13 20:53:43 +02:00
var index = items . indexOf ( event . target ) ;
2017-09-06 06:05:12 +02:00
2020-05-13 20:53:43 +02:00
if ( event . key === ARROW _UP _KEY && index > 0 ) {
2018-11-13 07:41:12 +01:00
// Up
index -- ;
}
2017-09-06 06:05:12 +02:00
2020-05-13 20:53:43 +02:00
if ( event . key === ARROW _DOWN _KEY && index < items . length - 1 ) {
2018-11-13 07:41:12 +01:00
// Down
index ++ ;
2020-05-13 20:53:43 +02:00
} // index is -1 if the first keydown is an ArrowUp
2017-09-06 06:05:12 +02:00
2020-05-13 20:53:43 +02:00
index = index === - 1 ? 0 : index ;
2018-11-13 07:41:12 +01:00
items [ index ] . focus ( ) ;
2017-09-06 06:05:12 +02:00
} ;
2019-08-27 15:03:21 +02:00
Dropdown . getInstance = function getInstance ( element ) {
2019-03-01 17:31:34 +01:00
return Data . getData ( element , DATA _KEY$4 ) ;
} ;
2018-11-13 07:41:12 +01:00
_createClass ( Dropdown , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION$4 ;
}
} , {
key : "Default" ,
get : function get ( ) {
return Default$2 ;
}
} , {
key : "DefaultType" ,
get : function get ( ) {
return DefaultType$2 ;
}
} ] ) ;
2017-09-06 06:05:12 +02:00
return Dropdown ;
2018-11-13 07:41:12 +01:00
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2020-03-28 11:29:08 +01:00
EventHandler . on ( document , EVENT _KEYDOWN _DATA _API , SELECTOR _DATA _TOGGLE$2 , Dropdown . dataApiKeydownHandler ) ;
EventHandler . on ( document , EVENT _KEYDOWN _DATA _API , SELECTOR _MENU , Dropdown . dataApiKeydownHandler ) ;
EventHandler . on ( document , EVENT _CLICK _DATA _API$4 , Dropdown . clearMenus ) ;
EventHandler . on ( document , EVENT _KEYUP _DATA _API , Dropdown . clearMenus ) ;
EventHandler . on ( document , EVENT _CLICK _DATA _API$4 , SELECTOR _DATA _TOGGLE$2 , function ( event ) {
2018-11-13 07:41:12 +01:00
event . preventDefault ( ) ;
event . stopPropagation ( ) ;
2019-08-27 15:03:21 +02:00
Dropdown . dropdownInterface ( this , 'toggle' ) ;
2019-03-01 17:31:34 +01:00
} ) ;
2020-03-28 11:29:08 +01:00
EventHandler . on ( document , EVENT _CLICK _DATA _API$4 , SELECTOR _FORM _CHILD , function ( e ) {
2019-03-01 17:31:34 +01:00
return e . stopPropagation ( ) ;
2018-11-13 07:41:12 +01:00
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* add . Dropdown to jQuery only if jQuery is present
2018-11-13 07:41:12 +01:00
* /
2020-11-11 18:07:37 +01:00
onDOMContentLoaded ( function ( ) {
var $ = getjQuery ( ) ;
/* istanbul ignore if */
2019-07-24 08:13:50 +02:00
2020-11-11 18:07:37 +01:00
if ( $ ) {
var JQUERY _NO _CONFLICT = $ . fn [ NAME$4 ] ;
$ . fn [ NAME$4 ] = Dropdown . jQueryInterface ;
$ . fn [ NAME$4 ] . Constructor = Dropdown ;
2018-11-13 07:41:12 +01:00
2020-11-11 18:07:37 +01:00
$ . fn [ NAME$4 ] . noConflict = function ( ) {
$ . fn [ NAME$4 ] = JQUERY _NO _CONFLICT ;
return Dropdown . jQueryInterface ;
} ;
}
} ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME$5 = 'modal' ;
2020-11-11 18:07:37 +01:00
var VERSION$5 = '5.0.0-alpha3' ;
2018-11-13 07:41:12 +01:00
var DATA _KEY$5 = 'bs.modal' ;
var EVENT _KEY$5 = "." + DATA _KEY$5 ;
var DATA _API _KEY$5 = '.data-api' ;
2020-05-13 20:53:43 +02:00
var ESCAPE _KEY$1 = 'Escape' ;
2018-11-13 07:41:12 +01:00
var Default$3 = {
backdrop : true ,
keyboard : true ,
focus : true ,
show : true
} ;
var DefaultType$3 = {
backdrop : '(boolean|string)' ,
keyboard : 'boolean' ,
focus : 'boolean' ,
show : 'boolean'
} ;
2020-03-28 11:29:08 +01:00
var EVENT _HIDE$2 = "hide" + EVENT _KEY$5 ;
var EVENT _HIDE _PREVENTED = "hidePrevented" + EVENT _KEY$5 ;
var EVENT _HIDDEN$2 = "hidden" + EVENT _KEY$5 ;
var EVENT _SHOW$2 = "show" + EVENT _KEY$5 ;
var EVENT _SHOWN$2 = "shown" + EVENT _KEY$5 ;
var EVENT _FOCUSIN = "focusin" + EVENT _KEY$5 ;
var EVENT _RESIZE = "resize" + EVENT _KEY$5 ;
var EVENT _CLICK _DISMISS = "click.dismiss" + EVENT _KEY$5 ;
var EVENT _KEYDOWN _DISMISS = "keydown.dismiss" + EVENT _KEY$5 ;
var EVENT _MOUSEUP _DISMISS = "mouseup.dismiss" + EVENT _KEY$5 ;
var EVENT _MOUSEDOWN _DISMISS = "mousedown.dismiss" + EVENT _KEY$5 ;
var EVENT _CLICK _DATA _API$5 = "click" + EVENT _KEY$5 + DATA _API _KEY$5 ;
var CLASS _NAME _SCROLLBAR _MEASURER = 'modal-scrollbar-measure' ;
var CLASS _NAME _BACKDROP = 'modal-backdrop' ;
var CLASS _NAME _OPEN = 'modal-open' ;
var CLASS _NAME _FADE = 'fade' ;
var CLASS _NAME _SHOW$2 = 'show' ;
var CLASS _NAME _STATIC = 'modal-static' ;
var SELECTOR _DIALOG = '.modal-dialog' ;
var SELECTOR _MODAL _BODY = '.modal-body' ;
var SELECTOR _DATA _TOGGLE$3 = '[data-toggle="modal"]' ;
var SELECTOR _DATA _DISMISS = '[data-dismiss="modal"]' ;
var SELECTOR _FIXED _CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top' ;
var SELECTOR _STICKY _CONTENT = '.sticky-top' ;
2019-10-08 08:39:10 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var Modal = /*#__PURE__*/ function ( ) {
2018-11-13 07:41:12 +01:00
function Modal ( element , config ) {
this . _config = this . _getConfig ( config ) ;
this . _element = element ;
2020-03-28 11:29:08 +01:00
this . _dialog = SelectorEngine . findOne ( SELECTOR _DIALOG , element ) ;
2018-11-13 07:41:12 +01:00
this . _backdrop = null ;
this . _isShown = false ;
this . _isBodyOverflowing = false ;
this . _ignoreBackdropClick = false ;
this . _isTransitioning = false ;
this . _scrollbarWidth = 0 ;
2019-03-01 17:31:34 +01:00
Data . setData ( element , DATA _KEY$5 , this ) ;
2018-11-13 07:41:12 +01:00
} // Getters
var _proto = Modal . prototype ;
// Public
_proto . toggle = function toggle ( relatedTarget ) {
return this . _isShown ? this . hide ( ) : this . show ( relatedTarget ) ;
2017-09-06 06:05:12 +02:00
} ;
2018-11-13 07:41:12 +01:00
_proto . show = function show ( relatedTarget ) {
var _this = this ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _isShown || this . _isTransitioning ) {
return ;
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( this . _element . classList . contains ( CLASS _NAME _FADE ) ) {
2018-11-13 07:41:12 +01:00
this . _isTransitioning = true ;
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var showEvent = EventHandler . trigger ( this . _element , EVENT _SHOW$2 , {
2018-11-13 07:41:12 +01:00
relatedTarget : relatedTarget
} ) ;
2018-03-31 22:59:37 +02:00
2019-03-01 17:31:34 +01:00
if ( this . _isShown || showEvent . defaultPrevented ) {
2018-11-13 07:41:12 +01:00
return ;
}
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
this . _isShown = true ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
this . _checkScrollbar ( ) ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
this . _setScrollbar ( ) ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
this . _adjustDialog ( ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _setEscapeEvent ( ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _setResizeEvent ( ) ;
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _CLICK _DISMISS , SELECTOR _DATA _DISMISS , function ( event ) {
2018-11-13 07:41:12 +01:00
return _this . hide ( event ) ;
} ) ;
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _dialog , EVENT _MOUSEDOWN _DISMISS , function ( ) {
EventHandler . one ( _this . _element , EVENT _MOUSEUP _DISMISS , function ( event ) {
2019-03-01 17:31:34 +01:00
if ( event . target === _this . _element ) {
2018-11-13 07:41:12 +01:00
_this . _ignoreBackdropClick = true ;
}
} ) ;
} ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _showBackdrop ( function ( ) {
return _this . _showElement ( relatedTarget ) ;
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . hide = function hide ( event ) {
var _this2 = this ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( event ) {
event . preventDefault ( ) ;
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( ! this . _isShown || this . _isTransitioning ) {
return ;
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var hideEvent = EventHandler . trigger ( this . _element , EVENT _HIDE$2 ) ;
2017-09-06 06:05:12 +02:00
2019-07-24 08:13:50 +02:00
if ( hideEvent . defaultPrevented ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _isShown = false ;
2019-03-01 17:31:34 +01:00
2020-03-28 11:29:08 +01:00
var transition = this . _element . classList . contains ( CLASS _NAME _FADE ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( transition ) {
this . _isTransitioning = true ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _setEscapeEvent ( ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _setResizeEvent ( ) ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . off ( document , EVENT _FOCUSIN ) ;
2019-03-01 17:31:34 +01:00
2020-03-28 11:29:08 +01:00
this . _element . classList . remove ( CLASS _NAME _SHOW$2 ) ;
2019-03-01 17:31:34 +01:00
2020-03-28 11:29:08 +01:00
EventHandler . off ( this . _element , EVENT _CLICK _DISMISS ) ;
EventHandler . off ( this . _dialog , EVENT _MOUSEDOWN _DISMISS ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( transition ) {
2019-03-01 17:31:34 +01:00
var transitionDuration = getTransitionDurationFromElement ( this . _element ) ;
EventHandler . one ( this . _element , TRANSITION _END , function ( event ) {
2018-11-13 07:41:12 +01:00
return _this2 . _hideModal ( event ) ;
2019-03-01 17:31:34 +01:00
} ) ;
emulateTransitionEnd ( this . _element , transitionDuration ) ;
2018-11-13 07:41:12 +01:00
} else {
this . _hideModal ( ) ;
}
} ;
2017-10-16 00:51:44 +02:00
2018-11-13 07:41:12 +01:00
_proto . dispose = function dispose ( ) {
[ window , this . _element , this . _dialog ] . forEach ( function ( htmlElement ) {
2019-03-01 17:31:34 +01:00
return EventHandler . off ( htmlElement , EVENT _KEY$5 ) ;
2018-11-13 07:41:12 +01:00
} ) ;
/ * *
2020-03-28 11:29:08 +01:00
* ` document ` has 2 events ` EVENT_FOCUSIN ` and ` EVENT_CLICK_DATA_API `
2018-11-13 07:41:12 +01:00
* Do not move ` document ` in ` htmlElements ` array
2020-03-28 11:29:08 +01:00
* It will remove ` EVENT_CLICK_DATA_API ` event that should remain
2018-11-13 07:41:12 +01:00
* /
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . off ( document , EVENT _FOCUSIN ) ;
2019-03-01 17:31:34 +01:00
Data . removeData ( this . _element , DATA _KEY$5 ) ;
2018-11-13 07:41:12 +01:00
this . _config = null ;
this . _element = null ;
this . _dialog = null ;
this . _backdrop = null ;
this . _isShown = null ;
this . _isBodyOverflowing = null ;
this . _ignoreBackdropClick = null ;
this . _isTransitioning = null ;
this . _scrollbarWidth = null ;
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . handleUpdate = function handleUpdate ( ) {
this . _adjustDialog ( ) ;
2019-01-04 17:29:45 +01:00
} // Private
;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getConfig = function _getConfig ( config ) {
2020-09-14 17:12:06 +02:00
config = _extends ( { } , Default$3 , config ) ;
2019-03-01 17:31:34 +01:00
typeCheckConfig ( NAME$5 , config , DefaultType$3 ) ;
2018-11-13 07:41:12 +01:00
return config ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _showElement = function _showElement ( relatedTarget ) {
var _this3 = this ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var transition = this . _element . classList . contains ( CLASS _NAME _FADE ) ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var modalBody = SelectorEngine . findOne ( SELECTOR _MODAL _BODY , this . _dialog ) ;
2019-08-27 15:03:21 +02:00
2018-11-13 07:41:12 +01:00
if ( ! this . _element . parentNode || this . _element . parentNode . nodeType !== Node . ELEMENT _NODE ) {
// Don't move modal's DOM position
document . body . appendChild ( this . _element ) ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _element . style . display = 'block' ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _element . removeAttribute ( 'aria-hidden' ) ;
2017-09-06 06:05:12 +02:00
2018-12-16 00:13:22 +01:00
this . _element . setAttribute ( 'aria-modal' , true ) ;
2020-06-14 00:40:28 +02:00
this . _element . setAttribute ( 'role' , 'dialog' ) ;
2020-05-13 20:53:43 +02:00
this . _element . scrollTop = 0 ;
if ( modalBody ) {
2019-08-27 15:03:21 +02:00
modalBody . scrollTop = 0 ;
2019-02-11 20:15:34 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( transition ) {
2019-03-01 17:31:34 +01:00
reflow ( this . _element ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
this . _element . classList . add ( CLASS _NAME _SHOW$2 ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _config . focus ) {
this . _enforceFocus ( ) ;
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
var transitionComplete = function transitionComplete ( ) {
if ( _this3 . _config . focus ) {
_this3 . _element . focus ( ) ;
2018-03-31 22:59:37 +02:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_this3 . _isTransitioning = false ;
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( _this3 . _element , EVENT _SHOWN$2 , {
2019-03-01 17:31:34 +01:00
relatedTarget : relatedTarget
} ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( transition ) {
2019-03-01 17:31:34 +01:00
var transitionDuration = getTransitionDurationFromElement ( this . _dialog ) ;
EventHandler . one ( this . _dialog , TRANSITION _END , transitionComplete ) ;
emulateTransitionEnd ( this . _dialog , transitionDuration ) ;
2018-11-13 07:41:12 +01:00
} else {
transitionComplete ( ) ;
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _enforceFocus = function _enforceFocus ( ) {
var _this4 = this ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . off ( document , EVENT _FOCUSIN ) ; // guard against infinite focus loop
2019-03-01 17:31:34 +01:00
2020-03-28 11:29:08 +01:00
EventHandler . on ( document , EVENT _FOCUSIN , function ( event ) {
2019-03-01 17:31:34 +01:00
if ( document !== event . target && _this4 . _element !== event . target && ! _this4 . _element . contains ( event . target ) ) {
2018-11-13 07:41:12 +01:00
_this4 . _element . focus ( ) ;
2017-09-06 06:05:12 +02:00
}
2018-11-13 07:41:12 +01:00
} ) ;
} ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
_proto . _setEscapeEvent = function _setEscapeEvent ( ) {
var _this5 = this ;
2020-03-28 11:29:08 +01:00
if ( this . _isShown ) {
EventHandler . on ( this . _element , EVENT _KEYDOWN _DISMISS , function ( event ) {
2020-05-13 20:53:43 +02:00
if ( _this5 . _config . keyboard && event . key === ESCAPE _KEY$1 ) {
2020-03-28 11:29:08 +01:00
event . preventDefault ( ) ;
_this5 . hide ( ) ;
2020-05-13 20:53:43 +02:00
} else if ( ! _this5 . _config . keyboard && event . key === ESCAPE _KEY$1 ) {
2019-11-08 09:11:23 +01:00
_this5 . _triggerBackdropTransition ( ) ;
2018-03-31 22:59:37 +02:00
}
} ) ;
2019-07-24 08:13:50 +02:00
} else {
2020-03-28 11:29:08 +01:00
EventHandler . off ( this . _element , EVENT _KEYDOWN _DISMISS ) ;
2018-11-13 07:41:12 +01:00
}
} ;
_proto . _setResizeEvent = function _setResizeEvent ( ) {
var _this6 = this ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _isShown ) {
2020-03-28 11:29:08 +01:00
EventHandler . on ( window , EVENT _RESIZE , function ( ) {
2019-07-24 08:13:50 +02:00
return _this6 . _adjustDialog ( ) ;
2018-11-13 07:41:12 +01:00
} ) ;
} else {
2020-03-28 11:29:08 +01:00
EventHandler . off ( window , EVENT _RESIZE ) ;
2018-11-13 07:41:12 +01:00
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _hideModal = function _hideModal ( ) {
var _this7 = this ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _element . style . display = 'none' ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _element . setAttribute ( 'aria-hidden' , true ) ;
2017-09-06 06:05:12 +02:00
2018-12-16 00:13:22 +01:00
this . _element . removeAttribute ( 'aria-modal' ) ;
2020-06-14 00:40:28 +02:00
this . _element . removeAttribute ( 'role' ) ;
2018-11-13 07:41:12 +01:00
this . _isTransitioning = false ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
this . _showBackdrop ( function ( ) {
2020-03-28 11:29:08 +01:00
document . body . classList . remove ( CLASS _NAME _OPEN ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_this7 . _resetAdjustments ( ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_this7 . _resetScrollbar ( ) ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( _this7 . _element , EVENT _HIDDEN$2 ) ;
2018-11-13 07:41:12 +01:00
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _removeBackdrop = function _removeBackdrop ( ) {
2019-07-24 08:13:50 +02:00
this . _backdrop . parentNode . removeChild ( this . _backdrop ) ;
2019-03-01 17:31:34 +01:00
2019-07-24 08:13:50 +02:00
this . _backdrop = null ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _showBackdrop = function _showBackdrop ( callback ) {
var _this8 = this ;
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
var animate = this . _element . classList . contains ( CLASS _NAME _FADE ) ? CLASS _NAME _FADE : '' ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _isShown && this . _config . backdrop ) {
this . _backdrop = document . createElement ( 'div' ) ;
2020-03-28 11:29:08 +01:00
this . _backdrop . className = CLASS _NAME _BACKDROP ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( animate ) {
this . _backdrop . classList . add ( animate ) ;
2018-03-31 22:59:37 +02:00
}
2017-09-30 23:28:03 +02:00
2019-03-01 17:31:34 +01:00
document . body . appendChild ( this . _backdrop ) ;
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _CLICK _DISMISS , function ( event ) {
2018-11-13 07:41:12 +01:00
if ( _this8 . _ignoreBackdropClick ) {
_this8 . _ignoreBackdropClick = false ;
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( event . target !== event . currentTarget ) {
return ;
}
2017-09-06 06:05:12 +02:00
2019-11-08 09:11:23 +01:00
_this8 . _triggerBackdropTransition ( ) ;
2018-11-13 07:41:12 +01:00
} ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( animate ) {
2019-03-01 17:31:34 +01:00
reflow ( this . _backdrop ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
this . _backdrop . classList . add ( CLASS _NAME _SHOW$2 ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! animate ) {
callback ( ) ;
return ;
}
2017-09-30 23:28:03 +02:00
2019-03-01 17:31:34 +01:00
var backdropTransitionDuration = getTransitionDurationFromElement ( this . _backdrop ) ;
EventHandler . one ( this . _backdrop , TRANSITION _END , callback ) ;
emulateTransitionEnd ( this . _backdrop , backdropTransitionDuration ) ;
2018-11-13 07:41:12 +01:00
} else if ( ! this . _isShown && this . _backdrop ) {
2020-03-28 11:29:08 +01:00
this . _backdrop . classList . remove ( CLASS _NAME _SHOW$2 ) ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
var callbackRemove = function callbackRemove ( ) {
_this8 . _removeBackdrop ( ) ;
2017-09-30 23:28:03 +02:00
2019-07-24 08:13:50 +02:00
callback ( ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( this . _element . classList . contains ( CLASS _NAME _FADE ) ) {
2019-03-01 17:31:34 +01:00
var _backdropTransitionDuration = getTransitionDurationFromElement ( this . _backdrop ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
EventHandler . one ( this . _backdrop , TRANSITION _END , callbackRemove ) ;
emulateTransitionEnd ( this . _backdrop , _backdropTransitionDuration ) ;
2018-11-13 07:41:12 +01:00
} else {
callbackRemove ( ) ;
}
2019-07-24 08:13:50 +02:00
} else {
2018-11-13 07:41:12 +01:00
callback ( ) ;
}
2019-11-08 09:11:23 +01:00
} ;
_proto . _triggerBackdropTransition = function _triggerBackdropTransition ( ) {
var _this9 = this ;
if ( this . _config . backdrop === 'static' ) {
2020-03-28 11:29:08 +01:00
var hideEvent = EventHandler . trigger ( this . _element , EVENT _HIDE _PREVENTED ) ;
2019-11-08 09:11:23 +01:00
if ( hideEvent . defaultPrevented ) {
return ;
}
2020-09-14 17:12:06 +02:00
var isModalOverflowing = this . _element . scrollHeight > document . documentElement . clientHeight ;
if ( ! isModalOverflowing ) {
this . _element . style . overflowY = 'hidden' ;
}
2020-03-28 11:29:08 +01:00
this . _element . classList . add ( CLASS _NAME _STATIC ) ;
2019-11-08 09:11:23 +01:00
2020-09-14 17:12:06 +02:00
var modalTransitionDuration = getTransitionDurationFromElement ( this . _dialog ) ;
EventHandler . off ( this . _element , TRANSITION _END ) ;
2019-11-08 09:11:23 +01:00
EventHandler . one ( this . _element , TRANSITION _END , function ( ) {
2020-03-28 11:29:08 +01:00
_this9 . _element . classList . remove ( CLASS _NAME _STATIC ) ;
2020-09-14 17:12:06 +02:00
if ( ! isModalOverflowing ) {
EventHandler . one ( _this9 . _element , TRANSITION _END , function ( ) {
_this9 . _element . style . overflowY = '' ;
} ) ;
emulateTransitionEnd ( _this9 . _element , modalTransitionDuration ) ;
}
2019-11-08 09:11:23 +01:00
} ) ;
emulateTransitionEnd ( this . _element , modalTransitionDuration ) ;
this . _element . focus ( ) ;
} else {
this . hide ( ) ;
}
2019-01-04 17:29:45 +01:00
} // ----------------------------------------------------------------------
2018-11-13 07:41:12 +01:00
// the following methods are used to handle overflowing modals
// ----------------------------------------------------------------------
2019-01-04 17:29:45 +01:00
;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _adjustDialog = function _adjustDialog ( ) {
var isModalOverflowing = this . _element . scrollHeight > document . documentElement . clientHeight ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
if ( ! this . _isBodyOverflowing && isModalOverflowing ) {
this . _element . style . paddingLeft = this . _scrollbarWidth + "px" ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _isBodyOverflowing && ! isModalOverflowing ) {
this . _element . style . paddingRight = this . _scrollbarWidth + "px" ;
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _resetAdjustments = function _resetAdjustments ( ) {
this . _element . style . paddingLeft = '' ;
this . _element . style . paddingRight = '' ;
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _checkScrollbar = function _checkScrollbar ( ) {
var rect = document . body . getBoundingClientRect ( ) ;
2020-05-13 20:53:43 +02:00
this . _isBodyOverflowing = Math . round ( rect . left + rect . right ) < window . innerWidth ;
2018-11-13 07:41:12 +01:00
this . _scrollbarWidth = this . _getScrollbarWidth ( ) ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _setScrollbar = function _setScrollbar ( ) {
2019-11-08 09:11:23 +01:00
var _this10 = this ;
2018-11-13 07:41:12 +01:00
if ( this . _isBodyOverflowing ) {
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set
// while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
2019-03-01 17:31:34 +01:00
// Adjust fixed content padding
2020-03-28 11:29:08 +01:00
SelectorEngine . find ( SELECTOR _FIXED _CONTENT ) . forEach ( function ( element ) {
2018-11-13 07:41:12 +01:00
var actualPadding = element . style . paddingRight ;
2019-03-01 17:31:34 +01:00
var calculatedPadding = window . getComputedStyle ( element ) [ 'padding-right' ] ;
Manipulator . setDataAttribute ( element , 'padding-right' , actualPadding ) ;
2019-11-08 09:11:23 +01:00
element . style . paddingRight = parseFloat ( calculatedPadding ) + _this10 . _scrollbarWidth + "px" ;
2018-11-13 07:41:12 +01:00
} ) ; // Adjust sticky content margin
2020-03-28 11:29:08 +01:00
SelectorEngine . find ( SELECTOR _STICKY _CONTENT ) . forEach ( function ( element ) {
2018-11-13 07:41:12 +01:00
var actualMargin = element . style . marginRight ;
2019-03-01 17:31:34 +01:00
var calculatedMargin = window . getComputedStyle ( element ) [ 'margin-right' ] ;
Manipulator . setDataAttribute ( element , 'margin-right' , actualMargin ) ;
2019-11-08 09:11:23 +01:00
element . style . marginRight = parseFloat ( calculatedMargin ) - _this10 . _scrollbarWidth + "px" ;
2018-11-13 07:41:12 +01:00
} ) ; // Adjust body padding
var actualPadding = document . body . style . paddingRight ;
2019-03-01 17:31:34 +01:00
var calculatedPadding = window . getComputedStyle ( document . body ) [ 'padding-right' ] ;
Manipulator . setDataAttribute ( document . body , 'padding-right' , actualPadding ) ;
document . body . style . paddingRight = parseFloat ( calculatedPadding ) + this . _scrollbarWidth + "px" ;
2018-11-13 07:41:12 +01:00
}
2018-11-24 17:22:59 +01:00
2020-03-28 11:29:08 +01:00
document . body . classList . add ( CLASS _NAME _OPEN ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _resetScrollbar = function _resetScrollbar ( ) {
// Restore fixed content padding
2020-03-28 11:29:08 +01:00
SelectorEngine . find ( SELECTOR _FIXED _CONTENT ) . forEach ( function ( element ) {
2019-03-01 17:31:34 +01:00
var padding = Manipulator . getDataAttribute ( element , 'padding-right' ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( typeof padding !== 'undefined' ) {
Manipulator . removeDataAttribute ( element , 'padding-right' ) ;
element . style . paddingRight = padding ;
}
} ) ; // Restore sticky content and navbar-toggler margin
2020-03-28 11:29:08 +01:00
SelectorEngine . find ( "" + SELECTOR _STICKY _CONTENT ) . forEach ( function ( element ) {
2019-03-01 17:31:34 +01:00
var margin = Manipulator . getDataAttribute ( element , 'margin-right' ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( typeof margin !== 'undefined' ) {
2019-03-01 17:31:34 +01:00
Manipulator . removeDataAttribute ( element , 'margin-right' ) ;
element . style . marginRight = margin ;
2018-03-31 22:59:37 +02:00
}
2018-11-13 07:41:12 +01:00
} ) ; // Restore body padding
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
var padding = Manipulator . getDataAttribute ( document . body , 'padding-right' ) ;
2019-03-11 16:13:30 +01:00
if ( typeof padding === 'undefined' ) {
document . body . style . paddingRight = '' ;
} else {
2019-03-01 17:31:34 +01:00
Manipulator . removeDataAttribute ( document . body , 'padding-right' ) ;
document . body . style . paddingRight = padding ;
}
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getScrollbarWidth = function _getScrollbarWidth ( ) {
// thx d.walsh
var scrollDiv = document . createElement ( 'div' ) ;
2020-03-28 11:29:08 +01:00
scrollDiv . className = CLASS _NAME _SCROLLBAR _MEASURER ;
2018-11-13 07:41:12 +01:00
document . body . appendChild ( scrollDiv ) ;
var scrollbarWidth = scrollDiv . getBoundingClientRect ( ) . width - scrollDiv . clientWidth ;
document . body . removeChild ( scrollDiv ) ;
return scrollbarWidth ;
2019-01-04 17:29:45 +01:00
} // Static
;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Modal . jQueryInterface = function jQueryInterface ( config , relatedTarget ) {
2018-11-13 07:41:12 +01:00
return this . each ( function ( ) {
2019-03-01 17:31:34 +01:00
var data = Data . getData ( this , DATA _KEY$5 ) ;
2017-09-06 06:05:12 +02:00
2020-09-14 17:12:06 +02:00
var _config = _extends ( { } , Default$3 , Manipulator . getDataAttributes ( this ) , typeof config === 'object' && config ? config : { } ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! data ) {
data = new Modal ( this , _config ) ;
}
2017-09-30 23:28:03 +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 + "\"" ) ;
2018-03-31 22:59:37 +02:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
data [ config ] ( relatedTarget ) ;
} else if ( _config . show ) {
data . show ( relatedTarget ) ;
}
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Modal . getInstance = function getInstance ( element ) {
2019-03-01 17:31:34 +01:00
return Data . getData ( element , DATA _KEY$5 ) ;
} ;
2018-11-13 07:41:12 +01:00
_createClass ( Modal , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION$5 ;
}
} , {
key : "Default" ,
get : function get ( ) {
return Default$3 ;
}
} ] ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
return Modal ;
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-06 06:05:12 +02:00
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . on ( document , EVENT _CLICK _DATA _API$5 , SELECTOR _DATA _TOGGLE$3 , function ( event ) {
2019-11-08 09:11:23 +01:00
var _this11 = this ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
var target = getElementFromSelector ( this ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( this . tagName === 'A' || this . tagName === 'AREA' ) {
event . preventDefault ( ) ;
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . one ( target , EVENT _SHOW$2 , function ( showEvent ) {
2019-03-01 17:31:34 +01:00
if ( showEvent . defaultPrevented ) {
// only register focus restorer if modal will actually get shown
2018-11-13 07:41:12 +01:00
return ;
2017-09-06 06:05:12 +02:00
}
2020-03-28 11:29:08 +01:00
EventHandler . one ( target , EVENT _HIDDEN$2 , function ( ) {
2019-11-08 09:11:23 +01:00
if ( isVisible ( _this11 ) ) {
_this11 . focus ( ) ;
2017-09-06 06:05:12 +02:00
}
2018-03-31 22:59:37 +02:00
} ) ;
} ) ;
2019-03-01 17:31:34 +01:00
var data = Data . getData ( target , DATA _KEY$5 ) ;
if ( ! data ) {
2020-09-14 17:12:06 +02:00
var config = _extends ( { } , Manipulator . getDataAttributes ( target ) , Manipulator . getDataAttributes ( this ) ) ;
2019-07-24 08:13:50 +02:00
2019-03-01 17:31:34 +01:00
data = new Modal ( target , config ) ;
}
2017-09-30 23:28:03 +02:00
2019-03-01 17:31:34 +01:00
data . show ( this ) ;
2018-11-13 07:41:12 +01:00
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* add . Modal to jQuery only if jQuery is present
2018-11-13 07:41:12 +01:00
* /
2017-09-06 06:05:12 +02:00
2020-11-11 18:07:37 +01:00
onDOMContentLoaded ( function ( ) {
var $ = getjQuery ( ) ;
/* istanbul ignore if */
2019-07-24 08:13:50 +02:00
2020-11-11 18:07:37 +01:00
if ( $ ) {
var JQUERY _NO _CONFLICT = $ . fn [ NAME$5 ] ;
$ . fn [ NAME$5 ] = Modal . jQueryInterface ;
$ . fn [ NAME$5 ] . Constructor = Modal ;
2017-09-06 06:05:12 +02:00
2020-11-11 18:07:37 +01:00
$ . fn [ NAME$5 ] . noConflict = function ( ) {
$ . fn [ NAME$5 ] = JQUERY _NO _CONFLICT ;
return Modal . jQueryInterface ;
} ;
}
} ) ;
2017-09-06 06:05:12 +02:00
2019-02-13 17:01:40 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* Bootstrap ( v5 . 0.0 - alpha3 ) : util / sanitizer . js
2020-06-16 20:50:01 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
2019-02-13 17:01:40 +01:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var uriAttrs = [ 'background' , 'cite' , 'href' , 'itemtype' , 'longdesc' , 'poster' , 'src' , 'xlink:href' ] ;
var ARIA _ATTRIBUTE _PATTERN = /^aria-[\w-]*$/i ;
2019-03-01 17:31:34 +01:00
/ * *
* A pattern that recognizes a commonly useful subset of URLs that are safe .
*
* Shoutout to Angular 7 https : //github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
* /
2020-03-28 11:29:08 +01:00
var SAFE _URL _PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi ;
2019-03-01 17:31:34 +01:00
/ * *
* A pattern that matches safe data URLs . Only matches image , video and audio types .
*
* Shoutout to Angular 7 https : //github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
* /
2020-03-28 11:29:08 +01:00
var DATA _URL _PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i ;
2019-03-01 17:31:34 +01:00
var allowedAttribute = function allowedAttribute ( attr , allowedAttributeList ) {
var attrName = attr . nodeName . toLowerCase ( ) ;
if ( allowedAttributeList . indexOf ( attrName ) !== - 1 ) {
if ( uriAttrs . indexOf ( attrName ) !== - 1 ) {
2020-06-14 00:40:28 +02:00
return Boolean ( attr . nodeValue . match ( SAFE _URL _PATTERN ) || attr . nodeValue . match ( DATA _URL _PATTERN ) ) ;
2019-03-01 17:31:34 +01:00
}
return true ;
}
var regExp = allowedAttributeList . filter ( function ( attrRegex ) {
return attrRegex instanceof RegExp ;
} ) ; // Check if a regular expression validates the attribute.
2020-03-28 11:29:08 +01:00
for ( var i = 0 , len = regExp . length ; i < len ; i ++ ) {
2020-06-14 00:40:28 +02:00
if ( attrName . match ( regExp [ i ] ) ) {
2019-03-01 17:31:34 +01:00
return true ;
}
}
return false ;
} ;
2020-09-14 17:12:06 +02:00
var DefaultAllowlist = {
2019-02-13 17:01:40 +01:00
// Global attributes allowed on any supplied element below.
'*' : [ 'class' , 'dir' , 'id' , 'lang' , 'role' , ARIA _ATTRIBUTE _PATTERN ] ,
a : [ 'target' , 'href' , 'title' , 'rel' ] ,
area : [ ] ,
b : [ ] ,
br : [ ] ,
col : [ ] ,
code : [ ] ,
div : [ ] ,
em : [ ] ,
hr : [ ] ,
h1 : [ ] ,
h2 : [ ] ,
h3 : [ ] ,
h4 : [ ] ,
h5 : [ ] ,
h6 : [ ] ,
i : [ ] ,
2020-03-28 11:29:08 +01:00
img : [ 'src' , 'srcset' , 'alt' , 'title' , 'width' , 'height' ] ,
2019-02-13 17:01:40 +01:00
li : [ ] ,
ol : [ ] ,
p : [ ] ,
pre : [ ] ,
s : [ ] ,
small : [ ] ,
span : [ ] ,
sub : [ ] ,
sup : [ ] ,
strong : [ ] ,
u : [ ] ,
ul : [ ]
} ;
2020-09-14 17:12:06 +02:00
function sanitizeHtml ( unsafeHtml , allowList , sanitizeFn ) {
2020-03-28 11:29:08 +01:00
var _ref ;
2019-03-01 17:31:34 +01:00
if ( ! unsafeHtml . length ) {
2019-02-13 17:01:40 +01:00
return unsafeHtml ;
}
if ( sanitizeFn && typeof sanitizeFn === 'function' ) {
return sanitizeFn ( unsafeHtml ) ;
}
var domParser = new window . DOMParser ( ) ;
var createdDocument = domParser . parseFromString ( unsafeHtml , 'text/html' ) ;
2020-09-14 17:12:06 +02:00
var allowlistKeys = Object . keys ( allowList ) ;
2020-03-28 11:29:08 +01:00
var elements = ( _ref = [ ] ) . concat . apply ( _ref , createdDocument . body . querySelectorAll ( '*' ) ) ;
2019-02-13 17:01:40 +01:00
var _loop = function _loop ( i , len ) {
2020-03-28 11:29:08 +01:00
var _ref2 ;
2019-02-13 17:01:40 +01:00
var el = elements [ i ] ;
var elName = el . nodeName . toLowerCase ( ) ;
2020-09-14 17:12:06 +02:00
if ( allowlistKeys . indexOf ( elName ) === - 1 ) {
2019-02-13 17:01:40 +01:00
el . parentNode . removeChild ( el ) ;
return "continue" ;
}
2020-03-28 11:29:08 +01:00
var attributeList = ( _ref2 = [ ] ) . concat . apply ( _ref2 , el . attributes ) ;
2020-09-14 17:12:06 +02:00
var allowedAttributes = [ ] . concat ( allowList [ '*' ] || [ ] , allowList [ elName ] || [ ] ) ;
2019-02-13 17:01:40 +01:00
attributeList . forEach ( function ( attr ) {
2020-09-14 17:12:06 +02:00
if ( ! allowedAttribute ( attr , allowedAttributes ) ) {
2019-02-13 17:01:40 +01:00
el . removeAttribute ( attr . nodeName ) ;
}
} ) ;
} ;
for ( var i = 0 , len = elements . length ; i < len ; i ++ ) {
2019-07-24 08:13:50 +02:00
var _ret = _loop ( i ) ;
2019-02-13 17:01:40 +01:00
if ( _ret === "continue" ) continue ;
}
return createdDocument . body . innerHTML ;
}
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME$6 = 'tooltip' ;
2020-11-11 18:07:37 +01:00
var VERSION$6 = '5.0.0-alpha3' ;
2018-11-13 07:41:12 +01:00
var DATA _KEY$6 = 'bs.tooltip' ;
var EVENT _KEY$6 = "." + DATA _KEY$6 ;
var CLASS _PREFIX = 'bs-tooltip' ;
var BSCLS _PREFIX _REGEX = new RegExp ( "(^|\\s)" + CLASS _PREFIX + "\\S+" , 'g' ) ;
2020-09-14 17:12:06 +02:00
var DISALLOWED _ATTRIBUTES = [ 'sanitize' , 'allowList' , 'sanitizeFn' ] ;
2018-11-13 07:41:12 +01:00
var DefaultType$4 = {
animation : 'boolean' ,
template : 'string' ,
title : '(string|element|function)' ,
trigger : 'string' ,
delay : '(number|object)' ,
html : 'boolean' ,
selector : '(string|boolean)' ,
placement : '(string|function)' ,
2019-02-11 20:15:34 +01:00
offset : '(number|string|function)' ,
2018-11-13 07:41:12 +01:00
container : '(string|element|boolean)' ,
fallbackPlacement : '(string|array)' ,
2019-02-13 17:01:40 +01:00
boundary : '(string|element)' ,
sanitize : 'boolean' ,
sanitizeFn : '(null|function)' ,
2020-09-14 17:12:06 +02:00
allowList : 'object' ,
2019-08-27 15:03:21 +02:00
popperConfig : '(null|object)'
2018-11-13 07:41:12 +01:00
} ;
2020-03-28 11:29:08 +01:00
var AttachmentMap = {
2018-11-13 07:41:12 +01:00
AUTO : 'auto' ,
TOP : 'top' ,
RIGHT : 'right' ,
BOTTOM : 'bottom' ,
LEFT : 'left'
} ;
var Default$4 = {
animation : true ,
2019-03-01 17:31:34 +01:00
template : '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div></div>' ,
2018-11-13 07:41:12 +01:00
trigger : 'hover focus' ,
title : '' ,
delay : 0 ,
html : false ,
selector : false ,
placement : 'top' ,
offset : 0 ,
container : false ,
fallbackPlacement : 'flip' ,
2019-02-13 17:01:40 +01:00
boundary : 'scrollParent' ,
sanitize : true ,
sanitizeFn : null ,
2020-09-14 17:12:06 +02:00
allowList : DefaultAllowlist ,
2019-08-27 15:03:21 +02:00
popperConfig : null
2018-11-13 07:41:12 +01:00
} ;
2020-03-28 11:29:08 +01:00
var Event$1 = {
2018-11-13 07:41:12 +01:00
HIDE : "hide" + EVENT _KEY$6 ,
HIDDEN : "hidden" + EVENT _KEY$6 ,
SHOW : "show" + EVENT _KEY$6 ,
SHOWN : "shown" + EVENT _KEY$6 ,
INSERTED : "inserted" + EVENT _KEY$6 ,
CLICK : "click" + EVENT _KEY$6 ,
FOCUSIN : "focusin" + EVENT _KEY$6 ,
FOCUSOUT : "focusout" + EVENT _KEY$6 ,
MOUSEENTER : "mouseenter" + EVENT _KEY$6 ,
MOUSELEAVE : "mouseleave" + EVENT _KEY$6
} ;
2020-03-28 11:29:08 +01:00
var CLASS _NAME _FADE$1 = 'fade' ;
var CLASS _NAME _MODAL = 'modal' ;
var CLASS _NAME _SHOW$3 = 'show' ;
var HOVER _STATE _SHOW = 'show' ;
var HOVER _STATE _OUT = 'out' ;
var SELECTOR _TOOLTIP _INNER = '.tooltip-inner' ;
var TRIGGER _HOVER = 'hover' ;
var TRIGGER _FOCUS = 'focus' ;
var TRIGGER _CLICK = 'click' ;
var TRIGGER _MANUAL = 'manual' ;
2019-10-08 08:39:10 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-11-13 07:41:12 +01:00
2020-03-28 11:29:08 +01:00
var Tooltip = /*#__PURE__*/ function ( ) {
2018-11-13 07:41:12 +01:00
function Tooltip ( element , config ) {
if ( typeof Popper === 'undefined' ) {
2019-03-01 17:31:34 +01:00
throw new TypeError ( 'Bootstrap\'s tooltips require Popper.js (https://popper.js.org)' ) ;
2018-11-13 07:41:12 +01:00
} // private
2017-10-30 00:19:14 +01:00
2018-11-13 07:41:12 +01:00
this . _isEnabled = true ;
this . _timeout = 0 ;
this . _hoverState = '' ;
this . _activeTrigger = { } ;
this . _popper = null ; // Protected
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . element = element ;
this . config = this . _getConfig ( config ) ;
this . tip = null ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _setListeners ( ) ;
2019-03-01 17:31:34 +01:00
Data . setData ( element , this . constructor . DATA _KEY , this ) ;
2018-11-13 07:41:12 +01:00
} // Getters
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var _proto = Tooltip . prototype ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
// Public
_proto . enable = function enable ( ) {
this . _isEnabled = true ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . disable = function disable ( ) {
this . _isEnabled = false ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . toggleEnabled = function toggleEnabled ( ) {
this . _isEnabled = ! this . _isEnabled ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . toggle = function toggle ( event ) {
if ( ! this . _isEnabled ) {
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( event ) {
var dataKey = this . constructor . DATA _KEY ;
2020-09-14 17:12:06 +02:00
var context = Data . getData ( event . delegateTarget , dataKey ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! context ) {
2020-09-14 17:12:06 +02:00
context = new this . constructor ( event . delegateTarget , this . _getDelegateConfig ( ) ) ;
Data . setData ( event . delegateTarget , dataKey , context ) ;
2017-09-06 06:05:12 +02:00
}
2018-11-13 07:41:12 +01:00
context . _activeTrigger . click = ! context . _activeTrigger . click ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
if ( context . _isWithActiveTrigger ( ) ) {
context . _enter ( null , context ) ;
2017-09-06 06:05:12 +02:00
} else {
2018-11-13 07:41:12 +01:00
context . _leave ( null , context ) ;
}
} else {
2020-03-28 11:29:08 +01:00
if ( this . getTipElement ( ) . classList . contains ( CLASS _NAME _SHOW$3 ) ) {
2018-11-13 07:41:12 +01:00
this . _leave ( null , this ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
return ;
2018-03-31 22:59:37 +02:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _enter ( null , this ) ;
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . dispose = function dispose ( ) {
clearTimeout ( this . _timeout ) ;
2019-03-01 17:31:34 +01:00
Data . removeData ( this . element , this . constructor . DATA _KEY ) ;
EventHandler . off ( this . element , this . constructor . EVENT _KEY ) ;
2020-05-13 20:53:43 +02:00
EventHandler . off ( this . element . closest ( "." + CLASS _NAME _MODAL ) , 'hide.bs.modal' , this . _hideModalHandler ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( this . tip ) {
2019-03-01 17:31:34 +01:00
this . tip . parentNode . removeChild ( this . tip ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
this . _isEnabled = null ;
this . _timeout = null ;
this . _hoverState = null ;
this . _activeTrigger = null ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
if ( this . _popper ) {
2018-11-13 07:41:12 +01:00
this . _popper . destroy ( ) ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _popper = null ;
this . element = null ;
this . config = null ;
this . tip = null ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . show = function show ( ) {
var _this = this ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( this . element . style . display === 'none' ) {
2018-11-13 07:41:12 +01:00
throw new Error ( 'Please use show on visible elements' ) ;
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( this . isWithContent ( ) && this . _isEnabled ) {
2019-03-01 17:31:34 +01:00
var showEvent = EventHandler . trigger ( this . element , this . constructor . Event . SHOW ) ;
var shadowRoot = findShadowRoot ( this . element ) ;
2019-03-11 16:13:30 +01:00
var isInTheDom = shadowRoot === null ? this . element . ownerDocument . documentElement . contains ( this . element ) : shadowRoot . contains ( this . element ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( showEvent . defaultPrevented || ! isInTheDom ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var tip = this . getTipElement ( ) ;
2019-03-01 17:31:34 +01:00
var tipId = getUID ( this . constructor . NAME ) ;
2018-11-13 07:41:12 +01:00
tip . setAttribute ( 'id' , tipId ) ;
this . element . setAttribute ( 'aria-describedby' , tipId ) ;
this . setContent ( ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( this . config . animation ) {
2020-03-28 11:29:08 +01:00
tip . classList . add ( CLASS _NAME _FADE$1 ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var placement = typeof this . config . placement === 'function' ? this . config . placement . call ( this , tip , this . element ) : this . config . placement ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var attachment = this . _getAttachment ( placement ) ;
2017-09-06 06:05:12 +02:00
2019-07-24 08:13:50 +02:00
this . _addAttachmentClass ( attachment ) ;
2018-12-16 00:13:22 +01:00
var container = this . _getContainer ( ) ;
2019-03-01 17:31:34 +01:00
Data . setData ( tip , this . constructor . DATA _KEY , this ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( ! this . element . ownerDocument . documentElement . contains ( this . tip ) ) {
container . appendChild ( tip ) ;
2018-11-13 07:41:12 +01:00
}
2019-03-01 17:31:34 +01:00
EventHandler . trigger ( this . element , this . constructor . Event . INSERTED ) ;
2019-08-27 15:03:21 +02:00
this . _popper = new Popper ( this . element , tip , this . _getPopperConfig ( attachment ) ) ;
2020-03-28 11:29:08 +01:00
tip . classList . add ( CLASS _NAME _SHOW$3 ) ; // If this is a touch-enabled device we add extra
2018-11-13 07:41:12 +01:00
// empty mouseover listeners to the body's immediate children;
// only needed because of broken event delegation on iOS
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( 'ontouchstart' in document . documentElement ) {
2020-03-28 11:29:08 +01:00
var _ref ;
( _ref = [ ] ) . concat . apply ( _ref , document . body . children ) . forEach ( function ( element ) {
2019-03-01 17:31:34 +01:00
EventHandler . on ( element , 'mouseover' , noop ( ) ) ;
} ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var complete = function complete ( ) {
if ( _this . config . animation ) {
_this . _fixTransition ( ) ;
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
var prevHoverState = _this . _hoverState ;
_this . _hoverState = null ;
2019-03-01 17:31:34 +01:00
EventHandler . trigger ( _this . element , _this . constructor . Event . SHOWN ) ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( prevHoverState === HOVER _STATE _OUT ) {
2018-11-13 07:41:12 +01:00
_this . _leave ( null , _this ) ;
2017-09-06 06:05:12 +02:00
}
2018-11-13 07:41:12 +01:00
} ;
2020-03-28 11:29:08 +01:00
if ( this . tip . classList . contains ( CLASS _NAME _FADE$1 ) ) {
2019-03-01 17:31:34 +01:00
var transitionDuration = getTransitionDurationFromElement ( this . tip ) ;
EventHandler . one ( this . tip , TRANSITION _END , complete ) ;
emulateTransitionEnd ( this . tip , transitionDuration ) ;
2018-11-13 07:41:12 +01:00
} else {
complete ( ) ;
2017-09-06 06:05:12 +02:00
}
2018-11-13 07:41:12 +01:00
}
} ;
2017-09-06 06:05:12 +02:00
2019-07-24 08:13:50 +02:00
_proto . hide = function hide ( ) {
2018-11-13 07:41:12 +01:00
var _this2 = this ;
2017-09-06 06:05:12 +02:00
2020-09-29 17:33:00 +02:00
if ( ! this . _popper ) {
return ;
}
2018-11-13 07:41:12 +01:00
var tip = this . getTipElement ( ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
var complete = function complete ( ) {
2020-03-28 11:29:08 +01:00
if ( _this2 . _hoverState !== HOVER _STATE _SHOW && tip . parentNode ) {
2018-11-13 07:41:12 +01:00
tip . parentNode . removeChild ( tip ) ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_this2 . _cleanTipClass ( ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_this2 . element . removeAttribute ( 'aria-describedby' ) ;
2017-09-30 23:28:03 +02:00
2019-03-01 17:31:34 +01:00
EventHandler . trigger ( _this2 . element , _this2 . constructor . Event . HIDDEN ) ;
2017-09-30 23:28:03 +02:00
2019-07-24 08:13:50 +02:00
_this2 . _popper . destroy ( ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
var hideEvent = EventHandler . trigger ( this . element , this . constructor . Event . HIDE ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( hideEvent . defaultPrevented ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
tip . classList . remove ( CLASS _NAME _SHOW$3 ) ; // If this is a touch-enabled device we remove the extra
2018-11-13 07:41:12 +01:00
// empty mouseover listeners we added for iOS support
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( 'ontouchstart' in document . documentElement ) {
2020-03-28 11:29:08 +01:00
var _ref2 ;
( _ref2 = [ ] ) . concat . apply ( _ref2 , document . body . children ) . forEach ( function ( element ) {
2019-03-01 17:31:34 +01:00
return EventHandler . off ( element , 'mouseover' , noop ) ;
} ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
this . _activeTrigger [ TRIGGER _CLICK ] = false ;
this . _activeTrigger [ TRIGGER _FOCUS ] = false ;
this . _activeTrigger [ TRIGGER _HOVER ] = false ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( this . tip . classList . contains ( CLASS _NAME _FADE$1 ) ) {
2019-03-01 17:31:34 +01:00
var transitionDuration = getTransitionDurationFromElement ( tip ) ;
EventHandler . one ( tip , TRANSITION _END , complete ) ;
emulateTransitionEnd ( tip , transitionDuration ) ;
2018-11-13 07:41:12 +01:00
} else {
complete ( ) ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
this . _hoverState = '' ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . update = function update ( ) {
if ( this . _popper !== null ) {
this . _popper . scheduleUpdate ( ) ;
}
2019-01-04 17:29:45 +01:00
} // Protected
;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . isWithContent = function isWithContent ( ) {
return Boolean ( this . getTitle ( ) ) ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . getTipElement = function getTipElement ( ) {
2019-03-01 17:31:34 +01:00
if ( this . tip ) {
return this . tip ;
}
var element = document . createElement ( 'div' ) ;
element . innerHTML = this . config . template ;
this . tip = element . children [ 0 ] ;
2018-11-13 07:41:12 +01:00
return this . tip ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . setContent = function setContent ( ) {
var tip = this . getTipElement ( ) ;
2020-03-28 11:29:08 +01:00
this . setElementContent ( SelectorEngine . findOne ( SELECTOR _TOOLTIP _INNER , tip ) , this . getTitle ( ) ) ;
2020-05-13 20:53:43 +02:00
tip . classList . remove ( CLASS _NAME _FADE$1 , CLASS _NAME _SHOW$3 ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
_proto . setElementContent = function setElementContent ( element , content ) {
if ( element === null ) {
return ;
}
2019-07-24 08:13:50 +02:00
if ( typeof content === 'object' && isElement ( content ) ) {
2019-03-01 17:31:34 +01:00
if ( content . jquery ) {
content = content [ 0 ] ;
} // content is a DOM node or a jQuery
2019-02-13 17:01:40 +01:00
if ( this . config . html ) {
2019-03-01 17:31:34 +01:00
if ( content . parentNode !== element ) {
element . innerHTML = '' ;
element . appendChild ( content ) ;
2017-09-06 06:05:12 +02:00
}
} else {
2020-05-13 20:53:43 +02:00
element . textContent = content . textContent ;
2017-09-06 06:05:12 +02:00
}
2019-02-13 17:01:40 +01:00
return ;
}
if ( this . config . html ) {
if ( this . config . sanitize ) {
2020-09-14 17:12:06 +02:00
content = sanitizeHtml ( content , this . config . allowList , this . config . sanitizeFn ) ;
2019-02-13 17:01:40 +01:00
}
2019-03-01 17:31:34 +01:00
element . innerHTML = content ;
2018-11-13 07:41:12 +01:00
} else {
2020-05-13 20:53:43 +02:00
element . textContent = content ;
2018-11-13 07:41:12 +01:00
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . getTitle = function getTitle ( ) {
var title = this . element . getAttribute ( 'data-original-title' ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! title ) {
title = typeof this . config . title === 'function' ? this . config . title . call ( this . element ) : this . config . title ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
return title ;
2019-01-04 17:29:45 +01:00
} // Private
;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
_proto . _getPopperConfig = function _getPopperConfig ( attachment ) {
var _this3 = this ;
var defaultBsConfig = {
placement : attachment ,
modifiers : {
offset : this . _getOffset ( ) ,
flip : {
behavior : this . config . fallbackPlacement
} ,
arrow : {
element : "." + this . constructor . NAME + "-arrow"
} ,
preventOverflow : {
boundariesElement : this . config . boundary
}
} ,
onCreate : function onCreate ( data ) {
if ( data . originalPlacement !== data . placement ) {
_this3 . _handlePopperPlacementChange ( data ) ;
}
} ,
onUpdate : function onUpdate ( data ) {
return _this3 . _handlePopperPlacementChange ( data ) ;
}
} ;
2020-09-14 17:12:06 +02:00
return _extends ( { } , defaultBsConfig , this . config . popperConfig ) ;
2019-08-27 15:03:21 +02:00
} ;
2019-07-24 08:13:50 +02:00
_proto . _addAttachmentClass = function _addAttachmentClass ( attachment ) {
this . getTipElement ( ) . classList . add ( CLASS _PREFIX + "-" + attachment ) ;
} ;
2019-02-11 20:15:34 +01:00
_proto . _getOffset = function _getOffset ( ) {
2019-08-27 15:03:21 +02:00
var _this4 = this ;
2019-02-11 20:15:34 +01:00
var offset = { } ;
if ( typeof this . config . offset === 'function' ) {
offset . fn = function ( data ) {
2020-09-14 17:12:06 +02:00
data . offsets = _extends ( { } , data . offsets , _this4 . config . offset ( data . offsets , _this4 . element ) || { } ) ;
2019-02-11 20:15:34 +01:00
return data ;
} ;
} else {
offset . offset = this . config . offset ;
}
return offset ;
} ;
2018-12-16 00:13:22 +01:00
_proto . _getContainer = function _getContainer ( ) {
if ( this . config . container === false ) {
return document . body ;
}
2019-03-01 17:31:34 +01:00
if ( isElement ( this . config . container ) ) {
return this . config . container ;
2018-12-16 00:13:22 +01:00
}
2019-03-01 17:31:34 +01:00
return SelectorEngine . findOne ( this . config . container ) ;
2018-12-16 00:13:22 +01:00
} ;
2018-11-13 07:41:12 +01:00
_proto . _getAttachment = function _getAttachment ( placement ) {
2020-03-28 11:29:08 +01:00
return AttachmentMap [ placement . toUpperCase ( ) ] ;
2018-11-13 07:41:12 +01:00
} ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
_proto . _setListeners = function _setListeners ( ) {
2019-08-27 15:03:21 +02:00
var _this5 = this ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var triggers = this . config . trigger . split ( ' ' ) ;
triggers . forEach ( function ( trigger ) {
if ( trigger === 'click' ) {
2019-08-27 15:03:21 +02:00
EventHandler . on ( _this5 . element , _this5 . constructor . Event . CLICK , _this5 . config . selector , function ( event ) {
return _this5 . toggle ( event ) ;
2017-09-06 06:05:12 +02:00
} ) ;
2020-03-28 11:29:08 +01:00
} else if ( trigger !== TRIGGER _MANUAL ) {
var eventIn = trigger === TRIGGER _HOVER ? _this5 . constructor . Event . MOUSEENTER : _this5 . constructor . Event . FOCUSIN ;
var eventOut = trigger === TRIGGER _HOVER ? _this5 . constructor . Event . MOUSELEAVE : _this5 . constructor . Event . FOCUSOUT ;
2019-08-27 15:03:21 +02:00
EventHandler . on ( _this5 . element , eventIn , _this5 . config . selector , function ( event ) {
return _this5 . _enter ( event ) ;
2019-03-01 17:31:34 +01:00
} ) ;
2019-08-27 15:03:21 +02:00
EventHandler . on ( _this5 . element , eventOut , _this5 . config . selector , function ( event ) {
return _this5 . _leave ( event ) ;
2017-09-06 06:05:12 +02:00
} ) ;
}
2018-11-13 07:41:12 +01:00
} ) ;
2019-07-12 23:56:26 +02:00
this . _hideModalHandler = function ( ) {
2019-08-27 15:03:21 +02:00
if ( _this5 . element ) {
_this5 . hide ( ) ;
2018-11-13 07:41:12 +01:00
}
2019-07-12 23:56:26 +02:00
} ;
2020-05-13 20:53:43 +02:00
EventHandler . on ( this . element . closest ( "." + CLASS _NAME _MODAL ) , 'hide.bs.modal' , this . _hideModalHandler ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( this . config . selector ) {
2020-09-14 17:12:06 +02:00
this . config = _extends ( { } , this . config , {
2018-11-13 07:41:12 +01:00
trigger : 'manual' ,
selector : ''
} ) ;
} else {
this . _fixTitle ( ) ;
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _fixTitle = function _fixTitle ( ) {
var titleType = typeof this . element . getAttribute ( 'data-original-title' ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( this . element . getAttribute ( 'title' ) || titleType !== 'string' ) {
this . element . setAttribute ( 'data-original-title' , this . element . getAttribute ( 'title' ) || '' ) ;
this . element . setAttribute ( 'title' , '' ) ;
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _enter = function _enter ( event , context ) {
var dataKey = this . constructor . DATA _KEY ;
2020-09-14 17:12:06 +02:00
context = context || Data . getData ( event . delegateTarget , dataKey ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! context ) {
2020-09-14 17:12:06 +02:00
context = new this . constructor ( event . delegateTarget , this . _getDelegateConfig ( ) ) ;
Data . setData ( event . delegateTarget , dataKey , context ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( event ) {
2020-03-28 11:29:08 +01:00
context . _activeTrigger [ event . type === 'focusin' ? TRIGGER _FOCUS : TRIGGER _HOVER ] = true ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( context . getTipElement ( ) . classList . contains ( CLASS _NAME _SHOW$3 ) || context . _hoverState === HOVER _STATE _SHOW ) {
context . _hoverState = HOVER _STATE _SHOW ;
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
clearTimeout ( context . _timeout ) ;
2020-03-28 11:29:08 +01:00
context . _hoverState = HOVER _STATE _SHOW ;
2018-11-13 07:41:12 +01:00
if ( ! context . config . delay || ! context . config . delay . show ) {
context . show ( ) ;
return ;
}
context . _timeout = setTimeout ( function ( ) {
2020-03-28 11:29:08 +01:00
if ( context . _hoverState === HOVER _STATE _SHOW ) {
2017-09-06 06:05:12 +02:00
context . show ( ) ;
}
2018-11-13 07:41:12 +01:00
} , context . config . delay . show ) ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _leave = function _leave ( event , context ) {
var dataKey = this . constructor . DATA _KEY ;
2020-09-14 17:12:06 +02:00
context = context || Data . getData ( event . delegateTarget , dataKey ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! context ) {
2020-09-14 17:12:06 +02:00
context = new this . constructor ( event . delegateTarget , this . _getDelegateConfig ( ) ) ;
Data . setData ( event . delegateTarget , dataKey , context ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( event ) {
2020-03-28 11:29:08 +01:00
context . _activeTrigger [ event . type === 'focusout' ? TRIGGER _FOCUS : TRIGGER _HOVER ] = false ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( context . _isWithActiveTrigger ( ) ) {
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
clearTimeout ( context . _timeout ) ;
2020-03-28 11:29:08 +01:00
context . _hoverState = HOVER _STATE _OUT ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! context . config . delay || ! context . config . delay . hide ) {
context . hide ( ) ;
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
context . _timeout = setTimeout ( function ( ) {
2020-03-28 11:29:08 +01:00
if ( context . _hoverState === HOVER _STATE _OUT ) {
2017-09-06 06:05:12 +02:00
context . hide ( ) ;
}
2018-11-13 07:41:12 +01:00
} , context . config . delay . hide ) ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _isWithActiveTrigger = function _isWithActiveTrigger ( ) {
for ( var trigger in this . _activeTrigger ) {
if ( this . _activeTrigger [ trigger ] ) {
return true ;
2017-09-06 06:05:12 +02:00
}
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
return false ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getConfig = function _getConfig ( config ) {
2019-03-01 17:31:34 +01:00
var dataAttributes = Manipulator . getDataAttributes ( this . element ) ;
2019-02-13 17:01:40 +01:00
Object . keys ( dataAttributes ) . forEach ( function ( dataAttr ) {
if ( DISALLOWED _ATTRIBUTES . indexOf ( dataAttr ) !== - 1 ) {
delete dataAttributes [ dataAttr ] ;
}
} ) ;
2019-03-01 17:31:34 +01:00
if ( config && typeof config . container === 'object' && config . container . jquery ) {
config . container = config . container [ 0 ] ;
}
2020-09-14 17:12:06 +02:00
config = _extends ( { } , this . constructor . Default , dataAttributes , typeof config === 'object' && config ? config : { } ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( typeof config . delay === 'number' ) {
config . delay = {
show : config . delay ,
hide : config . delay
} ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( typeof config . title === 'number' ) {
config . title = config . title . toString ( ) ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( typeof config . content === 'number' ) {
config . content = config . content . toString ( ) ;
}
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
typeCheckConfig ( NAME$6 , config , this . constructor . DefaultType ) ;
2019-02-13 17:01:40 +01:00
if ( config . sanitize ) {
2020-09-14 17:12:06 +02:00
config . template = sanitizeHtml ( config . template , config . allowList , config . sanitizeFn ) ;
2019-02-13 17:01:40 +01:00
}
2018-11-13 07:41:12 +01:00
return config ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getDelegateConfig = function _getDelegateConfig ( ) {
var config = { } ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( this . config ) {
for ( var key in this . config ) {
if ( this . constructor . Default [ key ] !== this . config [ key ] ) {
config [ key ] = this . config [ key ] ;
2017-09-06 06:05:12 +02:00
}
}
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
return config ;
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _cleanTipClass = function _cleanTipClass ( ) {
2019-03-01 17:31:34 +01:00
var tip = this . getTipElement ( ) ;
var tabClass = tip . getAttribute ( 'class' ) . match ( BSCLS _PREFIX _REGEX ) ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( tabClass !== null && tabClass . length > 0 ) {
2019-03-01 17:31:34 +01:00
tabClass . map ( function ( token ) {
return token . trim ( ) ;
} ) . forEach ( function ( tClass ) {
return tip . classList . remove ( tClass ) ;
} ) ;
2018-11-13 07:41:12 +01:00
}
} ;
2018-07-12 06:42:55 +02:00
2018-11-13 07:41:12 +01:00
_proto . _handlePopperPlacementChange = function _handlePopperPlacementChange ( popperData ) {
2020-09-14 17:12:06 +02:00
this . tip = popperData . instance . popper ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
this . _cleanTipClass ( ) ;
2017-09-06 06:05:12 +02:00
2019-07-24 08:13:50 +02:00
this . _addAttachmentClass ( this . _getAttachment ( popperData . placement ) ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _fixTransition = function _fixTransition ( ) {
var tip = this . getTipElement ( ) ;
var initConfigAnimation = this . config . animation ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
if ( tip . getAttribute ( 'x-placement' ) !== null ) {
return ;
}
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
tip . classList . remove ( CLASS _NAME _FADE$1 ) ;
2018-11-13 07:41:12 +01:00
this . config . animation = false ;
this . hide ( ) ;
this . show ( ) ;
this . config . animation = initConfigAnimation ;
2019-01-04 17:29:45 +01:00
} // Static
;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Tooltip . jQueryInterface = function jQueryInterface ( config ) {
2018-11-13 07:41:12 +01:00
return this . each ( function ( ) {
2019-03-01 17:31:34 +01:00
var data = Data . getData ( this , DATA _KEY$6 ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
var _config = typeof config === 'object' && config ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! data && /dispose|hide/ . test ( config ) ) {
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! data ) {
data = new Tooltip ( this , _config ) ;
}
2017-09-06 06:05:12 +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 ] ( ) ;
2018-03-31 22:59:37 +02:00
}
2018-11-13 07:41:12 +01:00
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Tooltip . getInstance = function getInstance ( element ) {
2019-03-01 17:31:34 +01:00
return Data . getData ( element , DATA _KEY$6 ) ;
} ;
2018-11-13 07:41:12 +01:00
_createClass ( Tooltip , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION$6 ;
}
} , {
key : "Default" ,
get : function get ( ) {
return Default$4 ;
}
} , {
key : "NAME" ,
get : function get ( ) {
return NAME$6 ;
}
} , {
key : "DATA_KEY" ,
get : function get ( ) {
return DATA _KEY$6 ;
}
} , {
key : "Event" ,
get : function get ( ) {
2020-03-28 11:29:08 +01:00
return Event$1 ;
2018-11-13 07:41:12 +01:00
}
} , {
key : "EVENT_KEY" ,
get : function get ( ) {
return EVENT _KEY$6 ;
}
} , {
key : "DefaultType" ,
get : function get ( ) {
return DefaultType$4 ;
}
} ] ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
return Tooltip ;
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* add . Tooltip to jQuery only if jQuery is present
2018-11-13 07:41:12 +01:00
* /
2017-09-30 23:28:03 +02:00
2019-07-24 08:13:50 +02:00
2020-11-11 18:07:37 +01:00
onDOMContentLoaded ( function ( ) {
var $ = getjQuery ( ) ;
/* istanbul ignore if */
2017-09-06 06:05:12 +02:00
2020-11-11 18:07:37 +01:00
if ( $ ) {
var JQUERY _NO _CONFLICT = $ . fn [ NAME$6 ] ;
$ . fn [ NAME$6 ] = Tooltip . jQueryInterface ;
$ . fn [ NAME$6 ] . Constructor = Tooltip ;
$ . fn [ NAME$6 ] . noConflict = function ( ) {
$ . fn [ NAME$6 ] = JQUERY _NO _CONFLICT ;
return Tooltip . jQueryInterface ;
} ;
}
} ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME$7 = 'popover' ;
2020-11-11 18:07:37 +01:00
var VERSION$7 = '5.0.0-alpha3' ;
2018-11-13 07:41:12 +01:00
var DATA _KEY$7 = 'bs.popover' ;
var EVENT _KEY$7 = "." + DATA _KEY$7 ;
var CLASS _PREFIX$1 = 'bs-popover' ;
var BSCLS _PREFIX _REGEX$1 = new RegExp ( "(^|\\s)" + CLASS _PREFIX$1 + "\\S+" , 'g' ) ;
2020-09-14 17:12:06 +02:00
var Default$5 = _extends ( { } , Tooltip . Default , {
2018-11-13 07:41:12 +01:00
placement : 'right' ,
trigger : 'click' ,
content : '' ,
2019-03-01 17:31:34 +01:00
template : '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
2018-11-13 07:41:12 +01:00
} ) ;
2020-09-14 17:12:06 +02:00
var DefaultType$5 = _extends ( { } , Tooltip . DefaultType , {
2018-11-13 07:41:12 +01:00
content : '(string|element|function)'
} ) ;
2020-03-28 11:29:08 +01:00
var Event$2 = {
2018-11-13 07:41:12 +01:00
HIDE : "hide" + EVENT _KEY$7 ,
HIDDEN : "hidden" + EVENT _KEY$7 ,
SHOW : "show" + EVENT _KEY$7 ,
SHOWN : "shown" + EVENT _KEY$7 ,
INSERTED : "inserted" + EVENT _KEY$7 ,
CLICK : "click" + EVENT _KEY$7 ,
FOCUSIN : "focusin" + EVENT _KEY$7 ,
FOCUSOUT : "focusout" + EVENT _KEY$7 ,
MOUSEENTER : "mouseenter" + EVENT _KEY$7 ,
MOUSELEAVE : "mouseleave" + EVENT _KEY$7
} ;
2020-03-28 11:29:08 +01:00
var CLASS _NAME _FADE$2 = 'fade' ;
var CLASS _NAME _SHOW$4 = 'show' ;
var SELECTOR _TITLE = '.popover-header' ;
var SELECTOR _CONTENT = '.popover-body' ;
2019-10-08 08:39:10 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var Popover = /*#__PURE__*/ function ( _Tooltip ) {
2018-11-13 07:41:12 +01:00
_inheritsLoose ( Popover , _Tooltip ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
function Popover ( ) {
return _Tooltip . apply ( this , arguments ) || this ;
}
2017-11-08 05:45:26 +01:00
2018-11-13 07:41:12 +01:00
var _proto = Popover . prototype ;
2017-11-08 05:45:26 +01:00
2018-11-13 07:41:12 +01:00
// Overrides
_proto . isWithContent = function isWithContent ( ) {
return this . getTitle ( ) || this . _getContent ( ) ;
} ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
_proto . setContent = function setContent ( ) {
2019-03-01 17:31:34 +01:00
var tip = this . getTipElement ( ) ; // we use append for html objects to maintain js events
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
this . setElementContent ( SelectorEngine . findOne ( SELECTOR _TITLE , tip ) , this . getTitle ( ) ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var content = this . _getContent ( ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( typeof content === 'function' ) {
content = content . call ( this . element ) ;
}
2018-03-31 22:59:37 +02:00
2020-03-28 11:29:08 +01:00
this . setElementContent ( SelectorEngine . findOne ( SELECTOR _CONTENT , tip ) , content ) ;
2020-05-13 20:53:43 +02:00
tip . classList . remove ( CLASS _NAME _FADE$2 , CLASS _NAME _SHOW$4 ) ;
2020-09-14 17:12:06 +02:00
} // Private
;
2019-08-27 15:03:21 +02:00
_proto . _addAttachmentClass = function _addAttachmentClass ( attachment ) {
this . getTipElement ( ) . classList . add ( CLASS _PREFIX$1 + "-" + attachment ) ;
2020-09-14 17:12:06 +02:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getContent = function _getContent ( ) {
return this . element . getAttribute ( 'data-content' ) || this . config . content ;
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _cleanTipClass = function _cleanTipClass ( ) {
2019-03-01 17:31:34 +01:00
var tip = this . getTipElement ( ) ;
var tabClass = tip . getAttribute ( 'class' ) . match ( BSCLS _PREFIX _REGEX$1 ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( tabClass !== null && tabClass . length > 0 ) {
2019-03-01 17:31:34 +01:00
tabClass . map ( function ( token ) {
return token . trim ( ) ;
} ) . forEach ( function ( tClass ) {
return tip . classList . remove ( tClass ) ;
} ) ;
2018-11-13 07:41:12 +01:00
}
2019-01-04 17:29:45 +01:00
} // Static
;
2018-03-31 22:59:37 +02:00
2019-08-27 15:03:21 +02:00
Popover . jQueryInterface = function jQueryInterface ( config ) {
2018-11-13 07:41:12 +01:00
return this . each ( function ( ) {
2019-03-01 17:31:34 +01:00
var data = Data . getData ( this , DATA _KEY$7 ) ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
var _config = typeof config === 'object' ? config : null ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
if ( ! data && /dispose|hide/ . test ( config ) ) {
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! data ) {
data = new Popover ( this , _config ) ;
2019-03-01 17:31:34 +01:00
Data . setData ( this , DATA _KEY$7 , data ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +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 ] ( ) ;
2018-03-31 22:59:37 +02:00
}
2018-11-13 07:41:12 +01:00
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Popover . getInstance = function getInstance ( element ) {
2019-03-01 17:31:34 +01:00
return Data . getData ( element , DATA _KEY$7 ) ;
} ;
2018-11-13 07:41:12 +01:00
_createClass ( Popover , null , [ {
key : "VERSION" ,
// Getters
get : function get ( ) {
return VERSION$7 ;
}
} , {
key : "Default" ,
get : function get ( ) {
return Default$5 ;
}
} , {
key : "NAME" ,
get : function get ( ) {
return NAME$7 ;
}
} , {
key : "DATA_KEY" ,
get : function get ( ) {
return DATA _KEY$7 ;
}
} , {
key : "Event" ,
get : function get ( ) {
2020-03-28 11:29:08 +01:00
return Event$2 ;
2018-11-13 07:41:12 +01:00
}
} , {
key : "EVENT_KEY" ,
get : function get ( ) {
return EVENT _KEY$7 ;
}
} , {
key : "DefaultType" ,
get : function get ( ) {
return DefaultType$5 ;
}
} ] ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
return Popover ;
} ( Tooltip ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* add . Popover to jQuery only if jQuery is present
2018-11-13 07:41:12 +01:00
* /
2017-09-30 23:28:03 +02:00
2019-07-24 08:13:50 +02:00
2020-11-11 18:07:37 +01:00
onDOMContentLoaded ( function ( ) {
var $ = getjQuery ( ) ;
/* istanbul ignore if */
2017-09-06 06:05:12 +02:00
2020-11-11 18:07:37 +01:00
if ( $ ) {
var JQUERY _NO _CONFLICT = $ . fn [ NAME$7 ] ;
$ . fn [ NAME$7 ] = Popover . jQueryInterface ;
$ . fn [ NAME$7 ] . Constructor = Popover ;
$ . fn [ NAME$7 ] . noConflict = function ( ) {
$ . fn [ NAME$7 ] = JQUERY _NO _CONFLICT ;
return Popover . jQueryInterface ;
} ;
}
} ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME$8 = 'scrollspy' ;
2020-11-11 18:07:37 +01:00
var VERSION$8 = '5.0.0-alpha3' ;
2018-11-13 07:41:12 +01:00
var DATA _KEY$8 = 'bs.scrollspy' ;
var EVENT _KEY$8 = "." + DATA _KEY$8 ;
var DATA _API _KEY$6 = '.data-api' ;
var Default$6 = {
offset : 10 ,
method : 'auto' ,
target : ''
} ;
var DefaultType$6 = {
offset : 'number' ,
method : 'string' ,
target : '(string|element)'
} ;
2020-03-28 11:29:08 +01:00
var EVENT _ACTIVATE = "activate" + EVENT _KEY$8 ;
var EVENT _SCROLL = "scroll" + EVENT _KEY$8 ;
var EVENT _LOAD _DATA _API$1 = "load" + EVENT _KEY$8 + DATA _API _KEY$6 ;
var CLASS _NAME _DROPDOWN _ITEM = 'dropdown-item' ;
var CLASS _NAME _ACTIVE$2 = 'active' ;
var SELECTOR _DATA _SPY = '[data-spy="scroll"]' ;
var SELECTOR _NAV _LIST _GROUP = '.nav, .list-group' ;
var SELECTOR _NAV _LINKS = '.nav-link' ;
var SELECTOR _NAV _ITEMS = '.nav-item' ;
var SELECTOR _LIST _ITEMS = '.list-group-item' ;
var SELECTOR _DROPDOWN = '.dropdown' ;
var SELECTOR _DROPDOWN _TOGGLE = '.dropdown-toggle' ;
var METHOD _OFFSET = 'offset' ;
var METHOD _POSITION = 'position' ;
2019-10-08 08:39:10 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-11-13 07:41:12 +01:00
2020-03-28 11:29:08 +01:00
var ScrollSpy = /*#__PURE__*/ function ( ) {
2018-11-13 07:41:12 +01:00
function ScrollSpy ( element , config ) {
var _this = this ;
this . _element = element ;
this . _scrollElement = element . tagName === 'BODY' ? window : element ;
this . _config = this . _getConfig ( config ) ;
2020-09-14 17:12:06 +02:00
this . _selector = this . _config . target + " " + SELECTOR _NAV _LINKS + ", " + this . _config . target + " " + SELECTOR _LIST _ITEMS + ", " + this . _config . target + " ." + CLASS _NAME _DROPDOWN _ITEM ;
2018-11-13 07:41:12 +01:00
this . _offsets = [ ] ;
this . _targets = [ ] ;
this . _activeTarget = null ;
this . _scrollHeight = 0 ;
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _scrollElement , EVENT _SCROLL , function ( event ) {
2018-11-13 07:41:12 +01:00
return _this . _process ( event ) ;
} ) ;
this . refresh ( ) ;
this . _process ( ) ;
2019-03-01 17:31:34 +01:00
Data . setData ( element , DATA _KEY$8 , this ) ;
2018-11-13 07:41:12 +01:00
} // Getters
var _proto = ScrollSpy . prototype ;
// Public
_proto . refresh = function refresh ( ) {
var _this2 = this ;
2020-03-28 11:29:08 +01:00
var autoMethod = this . _scrollElement === this . _scrollElement . window ? METHOD _OFFSET : METHOD _POSITION ;
2018-11-13 07:41:12 +01:00
var offsetMethod = this . _config . method === 'auto' ? autoMethod : this . _config . method ;
2020-03-28 11:29:08 +01:00
var offsetBase = offsetMethod === METHOD _POSITION ? this . _getScrollTop ( ) : 0 ;
2018-11-13 07:41:12 +01:00
this . _offsets = [ ] ;
this . _targets = [ ] ;
this . _scrollHeight = this . _getScrollHeight ( ) ;
2020-03-28 11:29:08 +01:00
var targets = SelectorEngine . find ( this . _selector ) ;
2018-11-13 07:41:12 +01:00
targets . map ( function ( element ) {
2019-03-01 17:31:34 +01:00
var targetSelector = getSelectorFromElement ( element ) ;
2020-09-14 17:12:06 +02:00
var target = targetSelector ? SelectorEngine . findOne ( targetSelector ) : null ;
2018-11-13 07:41:12 +01:00
if ( target ) {
var targetBCR = target . getBoundingClientRect ( ) ;
if ( targetBCR . width || targetBCR . height ) {
2019-03-01 17:31:34 +01:00
return [ Manipulator [ offsetMethod ] ( target ) . top + offsetBase , targetSelector ] ;
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 ] ) ;
_this2 . _targets . push ( item [ 1 ] ) ;
} ) ;
2018-03-31 22:59:37 +02:00
} ;
2018-11-13 07:41:12 +01:00
_proto . dispose = function dispose ( ) {
2019-03-01 17:31:34 +01:00
Data . removeData ( this . _element , DATA _KEY$8 ) ;
EventHandler . off ( this . _scrollElement , EVENT _KEY$8 ) ;
2018-11-13 07:41:12 +01:00
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 ) {
2020-09-14 17:12:06 +02:00
config = _extends ( { } , Default$6 , typeof config === 'object' && config ? config : { } ) ;
2018-11-13 07:41:12 +01:00
2020-05-13 20:53:43 +02:00
if ( typeof config . target !== 'string' && isElement ( config . target ) ) {
2019-03-01 17:31:34 +01:00
var id = config . target . id ;
2018-11-13 07:41:12 +01:00
if ( ! id ) {
2019-03-01 17:31:34 +01:00
id = getUID ( NAME$8 ) ;
config . target . id = id ;
2018-11-13 07:41:12 +01:00
}
config . target = "#" + id ;
}
2019-03-01 17:31:34 +01:00
typeCheckConfig ( NAME$8 , config , DefaultType$6 ) ;
2018-11-13 07:41:12 +01:00
return config ;
2018-03-31 22:59:37 +02:00
} ;
2018-11-13 07:41:12 +01:00
_proto . _getScrollTop = function _getScrollTop ( ) {
return this . _scrollElement === window ? this . _scrollElement . pageYOffset : this . _scrollElement . scrollTop ;
2018-03-31 22:59:37 +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 ) ;
2018-03-31 22:59:37 +02:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getOffsetHeight = function _getOffsetHeight ( ) {
return this . _scrollElement === window ? window . innerHeight : this . _scrollElement . getBoundingClientRect ( ) . height ;
2018-03-31 22:59:37 +02:00
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _process = function _process ( ) {
var scrollTop = this . _getScrollTop ( ) + this . _config . offset ;
2018-03-31 22:59:37 +02:00
2018-11-13 07:41:12 +01:00
var scrollHeight = this . _getScrollHeight ( ) ;
var maxScroll = this . _config . offset + scrollHeight - this . _getOffsetHeight ( ) ;
if ( this . _scrollHeight !== scrollHeight ) {
2018-03-31 22:59:37 +02:00
this . refresh ( ) ;
2018-11-13 07:41:12 +01:00
}
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 ] ;
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 ;
}
2020-05-13 20:53:43 +02:00
for ( var i = this . _offsets . length ; i -- ; ) {
2018-11-13 07:41:12 +01:00
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 ( ) ;
2017-09-06 06:05:12 +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
2019-03-01 17:31:34 +01:00
var link = SelectorEngine . findOne ( queries . join ( ',' ) ) ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( link . classList . contains ( CLASS _NAME _DROPDOWN _ITEM ) ) {
2020-05-13 20:53:43 +02:00
SelectorEngine . findOne ( SELECTOR _DROPDOWN _TOGGLE , link . closest ( SELECTOR _DROPDOWN ) ) . classList . add ( CLASS _NAME _ACTIVE$2 ) ;
2020-03-28 11:29:08 +01:00
link . classList . add ( CLASS _NAME _ACTIVE$2 ) ;
2018-11-13 07:41:12 +01:00
} else {
// Set triggered link as active
2020-03-28 11:29:08 +01:00
link . classList . add ( CLASS _NAME _ACTIVE$2 ) ;
SelectorEngine . parents ( link , SELECTOR _NAV _LIST _GROUP ) . forEach ( function ( listGroup ) {
2019-03-01 17:31:34 +01:00
// Set triggered links parents as active
// With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
2020-03-28 11:29:08 +01:00
SelectorEngine . prev ( listGroup , SELECTOR _NAV _LINKS + ", " + SELECTOR _LIST _ITEMS ) . forEach ( function ( item ) {
return item . classList . add ( CLASS _NAME _ACTIVE$2 ) ;
2019-03-01 17:31:34 +01:00
} ) ; // Handle special case when .nav-link is inside .nav-item
2020-03-28 11:29:08 +01:00
SelectorEngine . prev ( listGroup , SELECTOR _NAV _ITEMS ) . forEach ( function ( navItem ) {
SelectorEngine . children ( navItem , SELECTOR _NAV _LINKS ) . forEach ( function ( item ) {
return item . classList . add ( CLASS _NAME _ACTIVE$2 ) ;
2019-03-01 17:31:34 +01:00
} ) ;
} ) ;
} ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( this . _scrollElement , EVENT _ACTIVATE , {
2018-11-13 07:41:12 +01:00
relatedTarget : target
} ) ;
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _clear = function _clear ( ) {
2020-03-28 11:29:08 +01:00
SelectorEngine . find ( this . _selector ) . filter ( function ( node ) {
return node . classList . contains ( CLASS _NAME _ACTIVE$2 ) ;
2018-11-24 17:22:59 +01:00
} ) . forEach ( function ( node ) {
2020-03-28 11:29:08 +01:00
return node . classList . remove ( CLASS _NAME _ACTIVE$2 ) ;
2018-11-24 17:22:59 +01:00
} ) ;
2019-01-04 17:29:45 +01:00
} // Static
;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
ScrollSpy . jQueryInterface = function jQueryInterface ( config ) {
2018-11-13 07:41:12 +01:00
return this . each ( function ( ) {
2019-03-01 17:31:34 +01:00
var data = Data . getData ( this , DATA _KEY$8 ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var _config = typeof config === 'object' && config ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( ! data ) {
data = new ScrollSpy ( this , _config ) ;
}
2017-09-06 06:05:12 +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 + "\"" ) ;
2018-03-31 22:59:37 +02:00
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
data [ config ] ( ) ;
2017-09-06 06:05:12 +02:00
}
2018-11-13 07:41:12 +01:00
} ) ;
} ;
2017-09-30 23:28:03 +02:00
2019-08-27 15:03:21 +02:00
ScrollSpy . getInstance = function getInstance ( element ) {
2019-03-01 17:31:34 +01:00
return Data . getData ( element , DATA _KEY$8 ) ;
} ;
2018-11-13 07:41:12 +01:00
_createClass ( ScrollSpy , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION$8 ;
}
} , {
key : "Default" ,
get : function get ( ) {
return Default$6 ;
}
} ] ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
return ScrollSpy ;
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . on ( window , EVENT _LOAD _DATA _API$1 , function ( ) {
SelectorEngine . find ( SELECTOR _DATA _SPY ) . forEach ( function ( spy ) {
2019-03-01 17:31:34 +01:00
return new ScrollSpy ( spy , Manipulator . getDataAttributes ( spy ) ) ;
} ) ;
2018-11-13 07:41:12 +01:00
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* add . ScrollSpy to jQuery only if jQuery is present
2018-11-13 07:41:12 +01:00
* /
2017-09-30 23:28:03 +02:00
2020-11-11 18:07:37 +01:00
onDOMContentLoaded ( function ( ) {
var $ = getjQuery ( ) ;
/* istanbul ignore if */
2019-07-24 08:13:50 +02:00
2020-11-11 18:07:37 +01:00
if ( $ ) {
var JQUERY _NO _CONFLICT = $ . fn [ NAME$8 ] ;
$ . fn [ NAME$8 ] = ScrollSpy . jQueryInterface ;
$ . fn [ NAME$8 ] . Constructor = ScrollSpy ;
2017-09-06 06:05:12 +02:00
2020-11-11 18:07:37 +01:00
$ . fn [ NAME$8 ] . noConflict = function ( ) {
$ . fn [ NAME$8 ] = JQUERY _NO _CONFLICT ;
return ScrollSpy . jQueryInterface ;
} ;
}
} ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
var NAME$9 = 'tab' ;
2020-11-11 18:07:37 +01:00
var VERSION$9 = '5.0.0-alpha3' ;
2018-11-13 07:41:12 +01:00
var DATA _KEY$9 = 'bs.tab' ;
var EVENT _KEY$9 = "." + DATA _KEY$9 ;
var DATA _API _KEY$7 = '.data-api' ;
2020-03-28 11:29:08 +01:00
var EVENT _HIDE$3 = "hide" + EVENT _KEY$9 ;
var EVENT _HIDDEN$3 = "hidden" + EVENT _KEY$9 ;
var EVENT _SHOW$3 = "show" + EVENT _KEY$9 ;
var EVENT _SHOWN$3 = "shown" + EVENT _KEY$9 ;
var EVENT _CLICK _DATA _API$6 = "click" + EVENT _KEY$9 + DATA _API _KEY$7 ;
var CLASS _NAME _DROPDOWN _MENU = 'dropdown-menu' ;
var CLASS _NAME _ACTIVE$3 = 'active' ;
2020-06-16 20:50:01 +02:00
var CLASS _NAME _DISABLED$1 = 'disabled' ;
2020-03-28 11:29:08 +01:00
var CLASS _NAME _FADE$3 = 'fade' ;
var CLASS _NAME _SHOW$5 = 'show' ;
var SELECTOR _DROPDOWN$1 = '.dropdown' ;
var SELECTOR _NAV _LIST _GROUP$1 = '.nav, .list-group' ;
2020-06-16 20:50:01 +02:00
var SELECTOR _ACTIVE$1 = '.active' ;
2020-03-28 11:29:08 +01:00
var SELECTOR _ACTIVE _UL = ':scope > li > .active' ;
var SELECTOR _DATA _TOGGLE$4 = '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]' ;
var SELECTOR _DROPDOWN _TOGGLE$1 = '.dropdown-toggle' ;
var SELECTOR _DROPDOWN _ACTIVE _CHILD = ':scope > .dropdown-menu .active' ;
2019-10-08 08:39:10 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
var Tab = /*#__PURE__*/ function ( ) {
2018-11-13 07:41:12 +01:00
function Tab ( element ) {
this . _element = element ;
2019-03-01 17:31:34 +01:00
Data . setData ( this . _element , DATA _KEY$9 , this ) ;
2018-11-13 07:41:12 +01:00
} // Getters
2017-09-06 06:05:12 +02:00
2018-06-22 07:55:23 +02:00
2018-11-13 07:41:12 +01:00
var _proto = Tab . prototype ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
// Public
_proto . show = function show ( ) {
var _this = this ;
2017-09-06 06:05:12 +02:00
2020-06-16 20:50:01 +02:00
if ( this . _element . parentNode && this . _element . parentNode . nodeType === Node . ELEMENT _NODE && this . _element . classList . contains ( CLASS _NAME _ACTIVE$3 ) || this . _element . classList . contains ( CLASS _NAME _DISABLED$1 ) ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var previous ;
2019-08-27 15:03:21 +02:00
var target = getElementFromSelector ( this . _element ) ;
2020-05-13 20:53:43 +02:00
var listElement = this . _element . closest ( SELECTOR _NAV _LIST _GROUP$1 ) ;
2018-11-13 07:41:12 +01:00
if ( listElement ) {
2020-06-16 20:50:01 +02:00
var itemSelector = listElement . nodeName === 'UL' || listElement . nodeName === 'OL' ? SELECTOR _ACTIVE _UL : SELECTOR _ACTIVE$1 ;
2020-03-28 11:29:08 +01:00
previous = SelectorEngine . find ( itemSelector , listElement ) ;
2018-11-13 07:41:12 +01:00
previous = previous [ previous . length - 1 ] ;
}
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
var hideEvent = null ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( previous ) {
2020-03-28 11:29:08 +01:00
hideEvent = EventHandler . trigger ( previous , EVENT _HIDE$3 , {
2019-03-01 17:31:34 +01:00
relatedTarget : this . _element
} ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
var showEvent = EventHandler . trigger ( this . _element , EVENT _SHOW$3 , {
2019-03-01 17:31:34 +01:00
relatedTarget : previous
} ) ;
2017-09-06 06:05:12 +02:00
2019-03-01 17:31:34 +01:00
if ( showEvent . defaultPrevented || hideEvent !== null && hideEvent . defaultPrevented ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
this . _activate ( this . _element , listElement ) ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
var complete = function complete ( ) {
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( previous , EVENT _HIDDEN$3 , {
2018-11-13 07:41:12 +01:00
relatedTarget : _this . _element
} ) ;
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( _this . _element , EVENT _SHOWN$3 , {
2018-11-13 07:41:12 +01:00
relatedTarget : previous
2018-03-31 22:59:37 +02:00
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( target ) {
this . _activate ( target , target . parentNode , complete ) ;
} else {
complete ( ) ;
}
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . dispose = function dispose ( ) {
2019-03-01 17:31:34 +01:00
Data . removeData ( this . _element , DATA _KEY$9 ) ;
2018-11-13 07:41:12 +01:00
this . _element = null ;
2019-01-04 17:29:45 +01:00
} // Private
;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _activate = function _activate ( element , container , callback ) {
var _this2 = this ;
2017-09-06 06:05:12 +02:00
2020-06-16 20:50:01 +02:00
var activeElements = container && ( container . nodeName === 'UL' || container . nodeName === 'OL' ) ? SelectorEngine . find ( SELECTOR _ACTIVE _UL , container ) : SelectorEngine . children ( container , SELECTOR _ACTIVE$1 ) ;
2018-11-13 07:41:12 +01:00
var active = activeElements [ 0 ] ;
2020-03-28 11:29:08 +01:00
var isTransitioning = callback && active && active . classList . contains ( CLASS _NAME _FADE$3 ) ;
2018-11-13 07:41:12 +01:00
var complete = function complete ( ) {
return _this2 . _transitionComplete ( element , active , callback ) ;
2018-03-31 22:59:37 +02:00
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( active && isTransitioning ) {
2019-03-01 17:31:34 +01:00
var transitionDuration = getTransitionDurationFromElement ( active ) ;
2020-03-28 11:29:08 +01:00
active . classList . remove ( CLASS _NAME _SHOW$5 ) ;
2019-03-01 17:31:34 +01:00
EventHandler . one ( active , TRANSITION _END , complete ) ;
emulateTransitionEnd ( active , transitionDuration ) ;
2018-11-13 07:41:12 +01:00
} else {
complete ( ) ;
}
} ;
_proto . _transitionComplete = function _transitionComplete ( element , active , callback ) {
if ( active ) {
2020-03-28 11:29:08 +01:00
active . classList . remove ( CLASS _NAME _ACTIVE$3 ) ;
var dropdownChild = SelectorEngine . findOne ( SELECTOR _DROPDOWN _ACTIVE _CHILD , active . parentNode ) ;
2018-11-13 07:41:12 +01:00
if ( dropdownChild ) {
2020-03-28 11:29:08 +01:00
dropdownChild . classList . remove ( CLASS _NAME _ACTIVE$3 ) ;
2017-09-06 06:05:12 +02:00
}
2018-11-13 07:41:12 +01:00
if ( active . getAttribute ( 'role' ) === 'tab' ) {
active . setAttribute ( 'aria-selected' , false ) ;
2018-03-31 22:59:37 +02:00
}
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
element . classList . add ( CLASS _NAME _ACTIVE$3 ) ;
2018-11-13 07:41:12 +01:00
if ( element . getAttribute ( 'role' ) === 'tab' ) {
element . setAttribute ( 'aria-selected' , true ) ;
}
2017-09-30 23:28:03 +02:00
2019-03-01 17:31:34 +01:00
reflow ( element ) ;
2019-02-11 20:15:34 +01:00
2020-03-28 11:29:08 +01:00
if ( element . classList . contains ( CLASS _NAME _FADE$3 ) ) {
element . classList . add ( CLASS _NAME _SHOW$5 ) ;
2019-02-11 20:15:34 +01:00
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( element . parentNode && element . parentNode . classList . contains ( CLASS _NAME _DROPDOWN _MENU ) ) {
2020-05-13 20:53:43 +02:00
var dropdownElement = element . closest ( SELECTOR _DROPDOWN$1 ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( dropdownElement ) {
2020-03-28 11:29:08 +01:00
SelectorEngine . find ( SELECTOR _DROPDOWN _TOGGLE$1 ) . forEach ( function ( dropdown ) {
return dropdown . classList . add ( CLASS _NAME _ACTIVE$3 ) ;
2019-03-01 17:31:34 +01:00
} ) ;
2018-11-13 07:41:12 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
element . setAttribute ( 'aria-expanded' , true ) ;
2018-03-31 22:59:37 +02:00
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( callback ) {
callback ( ) ;
}
2019-01-04 17:29:45 +01:00
} // Static
;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Tab . jQueryInterface = function jQueryInterface ( config ) {
2018-11-13 07:41:12 +01:00
return this . each ( function ( ) {
2019-03-01 17:31:34 +01:00
var data = Data . getData ( this , DATA _KEY$9 ) || new Tab ( this ) ;
2018-11-13 07:41:12 +01:00
if ( typeof config === 'string' ) {
if ( typeof data [ config ] === 'undefined' ) {
throw new TypeError ( "No method named \"" + config + "\"" ) ;
}
data [ config ] ( ) ;
}
} ) ;
2018-03-31 22:59:37 +02:00
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Tab . getInstance = function getInstance ( element ) {
2019-03-01 17:31:34 +01:00
return Data . getData ( element , DATA _KEY$9 ) ;
} ;
2018-11-13 07:41:12 +01:00
_createClass ( Tab , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION$9 ;
}
} ] ) ;
return Tab ;
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2020-03-28 11:29:08 +01:00
EventHandler . on ( document , EVENT _CLICK _DATA _API$6 , SELECTOR _DATA _TOGGLE$4 , function ( event ) {
2018-11-13 07:41:12 +01:00
event . preventDefault ( ) ;
2019-03-01 17:31:34 +01:00
var data = Data . getData ( this , DATA _KEY$9 ) || new Tab ( this ) ;
data . show ( ) ;
2018-11-13 07:41:12 +01:00
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* add . Tab to jQuery only if jQuery is present
2018-11-13 07:41:12 +01:00
* /
2020-11-11 18:07:37 +01:00
onDOMContentLoaded ( function ( ) {
var $ = getjQuery ( ) ;
/* istanbul ignore if */
2019-07-24 08:13:50 +02:00
2020-11-11 18:07:37 +01:00
if ( $ ) {
var JQUERY _NO _CONFLICT = $ . fn [ NAME$9 ] ;
$ . fn [ NAME$9 ] = Tab . jQueryInterface ;
$ . fn [ NAME$9 ] . Constructor = Tab ;
2018-11-13 07:41:12 +01:00
2020-11-11 18:07:37 +01:00
$ . fn [ NAME$9 ] . noConflict = function ( ) {
$ . fn [ NAME$9 ] = JQUERY _NO _CONFLICT ;
return Tab . jQueryInterface ;
} ;
}
} ) ;
2017-09-06 06:05:12 +02:00
/ * *
2018-11-24 17:22:59 +01:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2017-09-06 06:05:12 +02:00
* /
2018-03-31 22:59:37 +02:00
2018-11-24 17:22:59 +01:00
var NAME$a = 'toast' ;
2020-11-11 18:07:37 +01:00
var VERSION$a = '5.0.0-alpha3' ;
2018-11-24 17:22:59 +01:00
var DATA _KEY$a = 'bs.toast' ;
var EVENT _KEY$a = "." + DATA _KEY$a ;
2020-03-28 11:29:08 +01:00
var EVENT _CLICK _DISMISS$1 = "click.dismiss" + EVENT _KEY$a ;
var EVENT _HIDE$4 = "hide" + EVENT _KEY$a ;
var EVENT _HIDDEN$4 = "hidden" + EVENT _KEY$a ;
var EVENT _SHOW$4 = "show" + EVENT _KEY$a ;
var EVENT _SHOWN$4 = "shown" + EVENT _KEY$a ;
var CLASS _NAME _FADE$4 = 'fade' ;
var CLASS _NAME _HIDE = 'hide' ;
var CLASS _NAME _SHOW$6 = 'show' ;
var CLASS _NAME _SHOWING = 'showing' ;
2018-11-24 17:22:59 +01:00
var DefaultType$7 = {
animation : 'boolean' ,
autohide : 'boolean' ,
delay : 'number'
} ;
var Default$7 = {
animation : true ,
autohide : true ,
2020-09-14 17:12:06 +02:00
delay : 5000
2018-11-24 17:22:59 +01:00
} ;
2020-03-28 11:29:08 +01:00
var SELECTOR _DATA _DISMISS$1 = '[data-dismiss="toast"]' ;
2019-10-08 08:39:10 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var Toast = /*#__PURE__*/ function ( ) {
2018-11-24 17:22:59 +01:00
function Toast ( element , config ) {
this . _element = element ;
this . _config = this . _getConfig ( config ) ;
this . _timeout = null ;
2017-09-06 06:05:12 +02:00
2018-11-24 17:22:59 +01:00
this . _setListeners ( ) ;
2019-03-01 17:31:34 +01:00
Data . setData ( element , DATA _KEY$a , this ) ;
2018-11-24 17:22:59 +01:00
} // Getters
2017-09-06 06:05:12 +02:00
2018-11-24 17:22:59 +01:00
var _proto = Toast . prototype ;
2017-09-06 06:05:12 +02:00
2018-11-24 17:22:59 +01:00
// Public
_proto . show = function show ( ) {
var _this = this ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var showEvent = EventHandler . trigger ( this . _element , EVENT _SHOW$4 ) ;
2019-07-12 23:56:26 +02:00
if ( showEvent . defaultPrevented ) {
return ;
}
2017-09-06 06:05:12 +02:00
2020-09-14 17:12:06 +02:00
this . _clearTimeout ( ) ;
2018-11-24 17:22:59 +01:00
if ( this . _config . animation ) {
2020-03-28 11:29:08 +01:00
this . _element . classList . add ( CLASS _NAME _FADE$4 ) ;
2018-11-24 17:22:59 +01:00
}
2017-09-06 06:05:12 +02:00
2018-11-24 17:22:59 +01:00
var complete = function complete ( ) {
2020-03-28 11:29:08 +01:00
_this . _element . classList . remove ( CLASS _NAME _SHOWING ) ;
2018-12-16 00:13:22 +01:00
2020-03-28 11:29:08 +01:00
_this . _element . classList . add ( CLASS _NAME _SHOW$6 ) ;
2018-12-16 00:13:22 +01:00
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( _this . _element , EVENT _SHOWN$4 ) ;
2017-09-06 06:05:12 +02:00
2018-11-24 17:22:59 +01:00
if ( _this . _config . autohide ) {
2019-04-18 13:47:52 +02:00
_this . _timeout = setTimeout ( function ( ) {
_this . hide ( ) ;
} , _this . _config . delay ) ;
2018-03-31 22:59:37 +02:00
}
2018-11-13 07:41:12 +01:00
} ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
this . _element . classList . remove ( CLASS _NAME _HIDE ) ;
2018-12-16 00:13:22 +01:00
2019-07-24 08:13:50 +02:00
reflow ( this . _element ) ;
2020-03-28 11:29:08 +01:00
this . _element . classList . add ( CLASS _NAME _SHOWING ) ;
2017-09-06 06:05:12 +02:00
2018-11-24 17:22:59 +01:00
if ( this . _config . animation ) {
2019-03-01 17:31:34 +01:00
var transitionDuration = getTransitionDurationFromElement ( this . _element ) ;
EventHandler . one ( this . _element , TRANSITION _END , complete ) ;
emulateTransitionEnd ( this . _element , transitionDuration ) ;
2018-11-24 17:22:59 +01:00
} else {
complete ( ) ;
}
} ;
2017-09-06 06:05:12 +02:00
2019-04-18 13:47:52 +02:00
_proto . hide = function hide ( ) {
2018-11-24 17:22:59 +01:00
var _this2 = this ;
2018-03-31 22:59:37 +02:00
2020-03-28 11:29:08 +01:00
if ( ! this . _element . classList . contains ( CLASS _NAME _SHOW$6 ) ) {
2018-11-24 17:22:59 +01:00
return ;
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
var hideEvent = EventHandler . trigger ( this . _element , EVENT _HIDE$4 ) ;
2019-07-12 23:56:26 +02:00
if ( hideEvent . defaultPrevented ) {
return ;
}
2018-11-13 07:41:12 +01:00
2019-04-18 13:47:52 +02:00
var complete = function complete ( ) {
2020-03-28 11:29:08 +01:00
_this2 . _element . classList . add ( CLASS _NAME _HIDE ) ;
2019-04-18 13:47:52 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( _this2 . _element , EVENT _HIDDEN$4 ) ;
2019-04-18 13:47:52 +02:00
} ;
2020-03-28 11:29:08 +01:00
this . _element . classList . remove ( CLASS _NAME _SHOW$6 ) ;
2019-04-18 13:47:52 +02:00
if ( this . _config . animation ) {
var transitionDuration = getTransitionDurationFromElement ( this . _element ) ;
EventHandler . one ( this . _element , TRANSITION _END , complete ) ;
emulateTransitionEnd ( this . _element , transitionDuration ) ;
2018-11-24 17:22:59 +01:00
} else {
2019-04-18 13:47:52 +02:00
complete ( ) ;
2018-11-24 17:22:59 +01:00
}
} ;
2018-11-13 07:41:12 +01:00
2018-11-24 17:22:59 +01:00
_proto . dispose = function dispose ( ) {
2020-09-14 17:12:06 +02:00
this . _clearTimeout ( ) ;
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
if ( this . _element . classList . contains ( CLASS _NAME _SHOW$6 ) ) {
this . _element . classList . remove ( CLASS _NAME _SHOW$6 ) ;
2018-11-24 17:22:59 +01:00
}
2017-09-06 06:05:12 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . off ( this . _element , EVENT _CLICK _DISMISS$1 ) ;
2019-03-01 17:31:34 +01:00
Data . removeData ( this . _element , DATA _KEY$a ) ;
2018-11-24 17:22:59 +01:00
this . _element = null ;
this . _config = null ;
2019-01-04 17:29:45 +01:00
} // Private
;
2017-09-06 06:05:12 +02:00
2018-11-24 17:22:59 +01:00
_proto . _getConfig = function _getConfig ( config ) {
2020-09-14 17:12:06 +02:00
config = _extends ( { } , Default$7 , Manipulator . getDataAttributes ( this . _element ) , typeof config === 'object' && config ? config : { } ) ;
2019-03-01 17:31:34 +01:00
typeCheckConfig ( NAME$a , config , this . constructor . DefaultType ) ;
2018-11-24 17:22:59 +01:00
return config ;
} ;
_proto . _setListeners = function _setListeners ( ) {
var _this3 = this ;
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _CLICK _DISMISS$1 , SELECTOR _DATA _DISMISS$1 , function ( ) {
2019-04-18 13:47:52 +02:00
return _this3 . hide ( ) ;
2018-11-24 17:22:59 +01:00
} ) ;
2020-09-14 17:12:06 +02:00
} ;
_proto . _clearTimeout = function _clearTimeout ( ) {
clearTimeout ( this . _timeout ) ;
this . _timeout = null ;
2019-01-04 17:29:45 +01:00
} // Static
;
2018-11-13 07:41:12 +01:00
2019-08-27 15:03:21 +02:00
Toast . jQueryInterface = function jQueryInterface ( config ) {
2018-11-24 17:22:59 +01:00
return this . each ( function ( ) {
2019-03-01 17:31:34 +01:00
var data = Data . getData ( this , DATA _KEY$a ) ;
2017-09-06 06:05:12 +02:00
2018-11-24 17:22:59 +01:00
var _config = typeof config === 'object' && config ;
2017-09-06 06:05:12 +02:00
2018-11-24 17:22:59 +01:00
if ( ! data ) {
data = new Toast ( this , _config ) ;
}
2017-09-06 06:05:12 +02:00
2018-11-24 17:22:59 +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-24 17:22:59 +01:00
data [ config ] ( this ) ;
2018-11-13 07:41:12 +01:00
}
2018-11-24 17:22:59 +01:00
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2019-08-27 15:03:21 +02:00
Toast . getInstance = function getInstance ( element ) {
2019-03-01 17:31:34 +01:00
return Data . getData ( element , DATA _KEY$a ) ;
} ;
2018-11-24 17:22:59 +01:00
_createClass ( Toast , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION$a ;
}
} , {
key : "DefaultType" ,
get : function get ( ) {
return DefaultType$7 ;
}
2019-02-11 20:15:34 +01:00
} , {
key : "Default" ,
get : function get ( ) {
return Default$7 ;
}
2018-11-24 17:22:59 +01:00
} ] ) ;
2017-09-06 06:05:12 +02:00
2018-11-24 17:22:59 +01:00
return Toast ;
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* add . Toast to jQuery only if jQuery is present
2018-11-24 17:22:59 +01:00
* /
2018-11-13 07:41:12 +01:00
2019-07-24 08:13:50 +02:00
2020-11-11 18:07:37 +01:00
onDOMContentLoaded ( function ( ) {
var $ = getjQuery ( ) ;
/* istanbul ignore if */
2017-09-30 23:28:03 +02:00
2020-11-11 18:07:37 +01:00
if ( $ ) {
var JQUERY _NO _CONFLICT = $ . fn [ NAME$a ] ;
$ . fn [ NAME$a ] = Toast . jQueryInterface ;
$ . fn [ NAME$a ] . Constructor = Toast ;
$ . fn [ NAME$a ] . noConflict = function ( ) {
$ . fn [ NAME$a ] = JQUERY _NO _CONFLICT ;
return Toast . jQueryInterface ;
} ;
}
} ) ;
2017-09-06 06:05:12 +02:00
2018-03-31 22:59:37 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01:00
* Bootstrap ( v5 . 0.0 - alpha3 ) : index . umd . js
2020-06-16 20:50:01 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
2018-03-31 22:59:37 +02:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-03-11 16:13:30 +01:00
var index _umd = {
Alert : Alert ,
Button : Button ,
Carousel : Carousel ,
Collapse : Collapse ,
Dropdown : Dropdown ,
Modal : Modal ,
Popover : Popover ,
ScrollSpy : ScrollSpy ,
Tab : Tab ,
Toast : Toast ,
Tooltip : Tooltip
} ;
2017-09-06 06:05:12 +02:00
2019-03-11 16:13:30 +01:00
return index _umd ;
2017-09-06 06:05:12 +02:00
2019-11-08 09:11:23 +01:00
} ) ) ) ;
2017-10-19 09:17:08 +02:00
//# sourceMappingURL=bootstrap.bundle.js.map