source: ProjectBuilder/devel/pb-server/js/bootstrap.bundle.js@ 2639

Last change on this file since 2639 was 2639, checked in by Bruno Cornec, 4 years ago

more pb-server content, still not ready for anything !

File size: 222.6 KB
Line 
1/*!
2 * Bootstrap v4.4.1 (https://getbootstrap.com/)
3 * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5 */
6(function (global, factory) {
7 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :
8 typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :
9 (global = global || self, factory(global.bootstrap = {}, global.jQuery));
10}(this, (function (exports, $) { 'use strict';
11
12 $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
13
14 function _defineProperties(target, props) {
15 for (var i = 0; i < props.length; i++) {
16 var descriptor = props[i];
17 descriptor.enumerable = descriptor.enumerable || false;
18 descriptor.configurable = true;
19 if ("value" in descriptor) descriptor.writable = true;
20 Object.defineProperty(target, descriptor.key, descriptor);
21 }
22 }
23
24 function _createClass(Constructor, protoProps, staticProps) {
25 if (protoProps) _defineProperties(Constructor.prototype, protoProps);
26 if (staticProps) _defineProperties(Constructor, staticProps);
27 return Constructor;
28 }
29
30 function _defineProperty(obj, key, value) {
31 if (key in obj) {
32 Object.defineProperty(obj, key, {
33 value: value,
34 enumerable: true,
35 configurable: true,
36 writable: true
37 });
38 } else {
39 obj[key] = value;
40 }
41
42 return obj;
43 }
44
45 function ownKeys(object, enumerableOnly) {
46 var keys = Object.keys(object);
47
48 if (Object.getOwnPropertySymbols) {
49 var symbols = Object.getOwnPropertySymbols(object);
50 if (enumerableOnly) symbols = symbols.filter(function (sym) {
51 return Object.getOwnPropertyDescriptor(object, sym).enumerable;
52 });
53 keys.push.apply(keys, symbols);
54 }
55
56 return keys;
57 }
58
59 function _objectSpread2(target) {
60 for (var i = 1; i < arguments.length; i++) {
61 var source = arguments[i] != null ? arguments[i] : {};
62
63 if (i % 2) {
64 ownKeys(Object(source), true).forEach(function (key) {
65 _defineProperty(target, key, source[key]);
66 });
67 } else if (Object.getOwnPropertyDescriptors) {
68 Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
69 } else {
70 ownKeys(Object(source)).forEach(function (key) {
71 Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
72 });
73 }
74 }
75
76 return target;
77 }
78
79 function _inheritsLoose(subClass, superClass) {
80 subClass.prototype = Object.create(superClass.prototype);
81 subClass.prototype.constructor = subClass;
82 subClass.__proto__ = superClass;
83 }
84
85 /**
86 * --------------------------------------------------------------------------
87 * Bootstrap (v4.4.1): util.js
88 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
89 * --------------------------------------------------------------------------
90 */
91 /**
92 * ------------------------------------------------------------------------
93 * Private TransitionEnd Helpers
94 * ------------------------------------------------------------------------
95 */
96
97 var TRANSITION_END = 'transitionend';
98 var MAX_UID = 1000000;
99 var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
100
101 function toType(obj) {
102 return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
103 }
104
105 function getSpecialTransitionEndEvent() {
106 return {
107 bindType: TRANSITION_END,
108 delegateType: TRANSITION_END,
109 handle: function handle(event) {
110 if ($(event.target).is(this)) {
111 return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
112 }
113
114 return undefined; // eslint-disable-line no-undefined
115 }
116 };
117 }
118
119 function transitionEndEmulator(duration) {
120 var _this = this;
121
122 var called = false;
123 $(this).one(Util.TRANSITION_END, function () {
124 called = true;
125 });
126 setTimeout(function () {
127 if (!called) {
128 Util.triggerTransitionEnd(_this);
129 }
130 }, duration);
131 return this;
132 }
133
134 function setTransitionEndSupport() {
135 $.fn.emulateTransitionEnd = transitionEndEmulator;
136 $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
137 }
138 /**
139 * --------------------------------------------------------------------------
140 * Public Util Api
141 * --------------------------------------------------------------------------
142 */
143
144
145 var Util = {
146 TRANSITION_END: 'bsTransitionEnd',
147 getUID: function getUID(prefix) {
148 do {
149 // eslint-disable-next-line no-bitwise
150 prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
151 } while (document.getElementById(prefix));
152
153 return prefix;
154 },
155 getSelectorFromElement: function getSelectorFromElement(element) {
156 var selector = element.getAttribute('data-target');
157
158 if (!selector || selector === '#') {
159 var hrefAttr = element.getAttribute('href');
160 selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';
161 }
162
163 try {
164 return document.querySelector(selector) ? selector : null;
165 } catch (err) {
166 return null;
167 }
168 },
169 getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {
170 if (!element) {
171 return 0;
172 } // Get transition-duration of the element
173
174
175 var transitionDuration = $(element).css('transition-duration');
176 var transitionDelay = $(element).css('transition-delay');
177 var floatTransitionDuration = parseFloat(transitionDuration);
178 var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
179
180 if (!floatTransitionDuration && !floatTransitionDelay) {
181 return 0;
182 } // If multiple durations are defined, take the first
183
184
185 transitionDuration = transitionDuration.split(',')[0];
186 transitionDelay = transitionDelay.split(',')[0];
187 return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
188 },
189 reflow: function reflow(element) {
190 return element.offsetHeight;
191 },
192 triggerTransitionEnd: function triggerTransitionEnd(element) {
193 $(element).trigger(TRANSITION_END);
194 },
195 // TODO: Remove in v5
196 supportsTransitionEnd: function supportsTransitionEnd() {
197 return Boolean(TRANSITION_END);
198 },
199 isElement: function isElement(obj) {
200 return (obj[0] || obj).nodeType;
201 },
202 typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
203 for (var property in configTypes) {
204 if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
205 var expectedTypes = configTypes[property];
206 var value = config[property];
207 var valueType = value && Util.isElement(value) ? 'element' : toType(value);
208
209 if (!new RegExp(expectedTypes).test(valueType)) {
210 throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
211 }
212 }
213 }
214 },
215 findShadowRoot: function findShadowRoot(element) {
216 if (!document.documentElement.attachShadow) {
217 return null;
218 } // Can find the shadow root otherwise it'll return the document
219
220
221 if (typeof element.getRootNode === 'function') {
222 var root = element.getRootNode();
223 return root instanceof ShadowRoot ? root : null;
224 }
225
226 if (element instanceof ShadowRoot) {
227 return element;
228 } // when we don't find a shadow root
229
230
231 if (!element.parentNode) {
232 return null;
233 }
234
235 return Util.findShadowRoot(element.parentNode);
236 },
237 jQueryDetection: function jQueryDetection() {
238 if (typeof $ === 'undefined') {
239 throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
240 }
241
242 var version = $.fn.jquery.split(' ')[0].split('.');
243 var minMajor = 1;
244 var ltMajor = 2;
245 var minMinor = 9;
246 var minPatch = 1;
247 var maxMajor = 4;
248
249 if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
250 throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
251 }
252 }
253 };
254 Util.jQueryDetection();
255 setTransitionEndSupport();
256
257 /**
258 * ------------------------------------------------------------------------
259 * Constants
260 * ------------------------------------------------------------------------
261 */
262
263 var NAME = 'alert';
264 var VERSION = '4.4.1';
265 var DATA_KEY = 'bs.alert';
266 var EVENT_KEY = "." + DATA_KEY;
267 var DATA_API_KEY = '.data-api';
268 var JQUERY_NO_CONFLICT = $.fn[NAME];
269 var Selector = {
270 DISMISS: '[data-dismiss="alert"]'
271 };
272 var Event = {
273 CLOSE: "close" + EVENT_KEY,
274 CLOSED: "closed" + EVENT_KEY,
275 CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
276 };
277 var ClassName = {
278 ALERT: 'alert',
279 FADE: 'fade',
280 SHOW: 'show'
281 };
282 /**
283 * ------------------------------------------------------------------------
284 * Class Definition
285 * ------------------------------------------------------------------------
286 */
287
288 var Alert =
289 /*#__PURE__*/
290 function () {
291 function Alert(element) {
292 this._element = element;
293 } // Getters
294
295
296 var _proto = Alert.prototype;
297
298 // Public
299 _proto.close = function close(element) {
300 var rootElement = this._element;
301
302 if (element) {
303 rootElement = this._getRootElement(element);
304 }
305
306 var customEvent = this._triggerCloseEvent(rootElement);
307
308 if (customEvent.isDefaultPrevented()) {
309 return;
310 }
311
312 this._removeElement(rootElement);
313 };
314
315 _proto.dispose = function dispose() {
316 $.removeData(this._element, DATA_KEY);
317 this._element = null;
318 } // Private
319 ;
320
321 _proto._getRootElement = function _getRootElement(element) {
322 var selector = Util.getSelectorFromElement(element);
323 var parent = false;
324
325 if (selector) {
326 parent = document.querySelector(selector);
327 }
328
329 if (!parent) {
330 parent = $(element).closest("." + ClassName.ALERT)[0];
331 }
332
333 return parent;
334 };
335
336 _proto._triggerCloseEvent = function _triggerCloseEvent(element) {
337 var closeEvent = $.Event(Event.CLOSE);
338 $(element).trigger(closeEvent);
339 return closeEvent;
340 };
341
342 _proto._removeElement = function _removeElement(element) {
343 var _this = this;
344
345 $(element).removeClass(ClassName.SHOW);
346
347 if (!$(element).hasClass(ClassName.FADE)) {
348 this._destroyElement(element);
349
350 return;
351 }
352
353 var transitionDuration = Util.getTransitionDurationFromElement(element);
354 $(element).one(Util.TRANSITION_END, function (event) {
355 return _this._destroyElement(element, event);
356 }).emulateTransitionEnd(transitionDuration);
357 };
358
359 _proto._destroyElement = function _destroyElement(element) {
360 $(element).detach().trigger(Event.CLOSED).remove();
361 } // Static
362 ;
363
364 Alert._jQueryInterface = function _jQueryInterface(config) {
365 return this.each(function () {
366 var $element = $(this);
367 var data = $element.data(DATA_KEY);
368
369 if (!data) {
370 data = new Alert(this);
371 $element.data(DATA_KEY, data);
372 }
373
374 if (config === 'close') {
375 data[config](this);
376 }
377 });
378 };
379
380 Alert._handleDismiss = function _handleDismiss(alertInstance) {
381 return function (event) {
382 if (event) {
383 event.preventDefault();
384 }
385
386 alertInstance.close(this);
387 };
388 };
389
390 _createClass(Alert, null, [{
391 key: "VERSION",
392 get: function get() {
393 return VERSION;
394 }
395 }]);
396
397 return Alert;
398 }();
399 /**
400 * ------------------------------------------------------------------------
401 * Data Api implementation
402 * ------------------------------------------------------------------------
403 */
404
405
406 $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
407 /**
408 * ------------------------------------------------------------------------
409 * jQuery
410 * ------------------------------------------------------------------------
411 */
412
413 $.fn[NAME] = Alert._jQueryInterface;
414 $.fn[NAME].Constructor = Alert;
415
416 $.fn[NAME].noConflict = function () {
417 $.fn[NAME] = JQUERY_NO_CONFLICT;
418 return Alert._jQueryInterface;
419 };
420
421 /**
422 * ------------------------------------------------------------------------
423 * Constants
424 * ------------------------------------------------------------------------
425 */
426
427 var NAME$1 = 'button';
428 var VERSION$1 = '4.4.1';
429 var DATA_KEY$1 = 'bs.button';
430 var EVENT_KEY$1 = "." + DATA_KEY$1;
431 var DATA_API_KEY$1 = '.data-api';
432 var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1];
433 var ClassName$1 = {
434 ACTIVE: 'active',
435 BUTTON: 'btn',
436 FOCUS: 'focus'
437 };
438 var Selector$1 = {
439 DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
440 DATA_TOGGLES: '[data-toggle="buttons"]',
441 DATA_TOGGLE: '[data-toggle="button"]',
442 DATA_TOGGLES_BUTTONS: '[data-toggle="buttons"] .btn',
443 INPUT: 'input:not([type="hidden"])',
444 ACTIVE: '.active',
445 BUTTON: '.btn'
446 };
447 var Event$1 = {
448 CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1,
449 FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1),
450 LOAD_DATA_API: "load" + EVENT_KEY$1 + DATA_API_KEY$1
451 };
452 /**
453 * ------------------------------------------------------------------------
454 * Class Definition
455 * ------------------------------------------------------------------------
456 */
457
458 var Button =
459 /*#__PURE__*/
460 function () {
461 function Button(element) {
462 this._element = element;
463 } // Getters
464
465
466 var _proto = Button.prototype;
467
468 // Public
469 _proto.toggle = function toggle() {
470 var triggerChangeEvent = true;
471 var addAriaPressed = true;
472 var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLES)[0];
473
474 if (rootElement) {
475 var input = this._element.querySelector(Selector$1.INPUT);
476
477 if (input) {
478 if (input.type === 'radio') {
479 if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) {
480 triggerChangeEvent = false;
481 } else {
482 var activeElement = rootElement.querySelector(Selector$1.ACTIVE);
483
484 if (activeElement) {
485 $(activeElement).removeClass(ClassName$1.ACTIVE);
486 }
487 }
488 } else if (input.type === 'checkbox') {
489 if (this._element.tagName === 'LABEL' && input.checked === this._element.classList.contains(ClassName$1.ACTIVE)) {
490 triggerChangeEvent = false;
491 }
492 } else {
493 // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input
494 triggerChangeEvent = false;
495 }
496
497 if (triggerChangeEvent) {
498 input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);
499 $(input).trigger('change');
500 }
501
502 input.focus();
503 addAriaPressed = false;
504 }
505 }
506
507 if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
508 if (addAriaPressed) {
509 this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));
510 }
511
512 if (triggerChangeEvent) {
513 $(this._element).toggleClass(ClassName$1.ACTIVE);
514 }
515 }
516 };
517
518 _proto.dispose = function dispose() {
519 $.removeData(this._element, DATA_KEY$1);
520 this._element = null;
521 } // Static
522 ;
523
524 Button._jQueryInterface = function _jQueryInterface(config) {
525 return this.each(function () {
526 var data = $(this).data(DATA_KEY$1);
527
528 if (!data) {
529 data = new Button(this);
530 $(this).data(DATA_KEY$1, data);
531 }
532
533 if (config === 'toggle') {
534 data[config]();
535 }
536 });
537 };
538
539 _createClass(Button, null, [{
540 key: "VERSION",
541 get: function get() {
542 return VERSION$1;
543 }
544 }]);
545
546 return Button;
547 }();
548 /**
549 * ------------------------------------------------------------------------
550 * Data Api implementation
551 * ------------------------------------------------------------------------
552 */
553
554
555 $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
556 var button = event.target;
557
558 if (!$(button).hasClass(ClassName$1.BUTTON)) {
559 button = $(button).closest(Selector$1.BUTTON)[0];
560 }
561
562 if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {
563 event.preventDefault(); // work around Firefox bug #1540995
564 } else {
565 var inputBtn = button.querySelector(Selector$1.INPUT);
566
567 if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {
568 event.preventDefault(); // work around Firefox bug #1540995
569
570 return;
571 }
572
573 Button._jQueryInterface.call($(button), 'toggle');
574 }
575 }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
576 var button = $(event.target).closest(Selector$1.BUTTON)[0];
577 $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
578 });
579 $(window).on(Event$1.LOAD_DATA_API, function () {
580 // ensure correct active class is set to match the controls' actual values/states
581 // find all checkboxes/readio buttons inside data-toggle groups
582 var buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLES_BUTTONS));
583
584 for (var i = 0, len = buttons.length; i < len; i++) {
585 var button = buttons[i];
586 var input = button.querySelector(Selector$1.INPUT);
587
588 if (input.checked || input.hasAttribute('checked')) {
589 button.classList.add(ClassName$1.ACTIVE);
590 } else {
591 button.classList.remove(ClassName$1.ACTIVE);
592 }
593 } // find all button toggles
594
595
596 buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLE));
597
598 for (var _i = 0, _len = buttons.length; _i < _len; _i++) {
599 var _button = buttons[_i];
600
601 if (_button.getAttribute('aria-pressed') === 'true') {
602 _button.classList.add(ClassName$1.ACTIVE);
603 } else {
604 _button.classList.remove(ClassName$1.ACTIVE);
605 }
606 }
607 });
608 /**
609 * ------------------------------------------------------------------------
610 * jQuery
611 * ------------------------------------------------------------------------
612 */
613
614 $.fn[NAME$1] = Button._jQueryInterface;
615 $.fn[NAME$1].Constructor = Button;
616
617 $.fn[NAME$1].noConflict = function () {
618 $.fn[NAME$1] = JQUERY_NO_CONFLICT$1;
619 return Button._jQueryInterface;
620 };
621
622 /**
623 * ------------------------------------------------------------------------
624 * Constants
625 * ------------------------------------------------------------------------
626 */
627
628 var NAME$2 = 'carousel';
629 var VERSION$2 = '4.4.1';
630 var DATA_KEY$2 = 'bs.carousel';
631 var EVENT_KEY$2 = "." + DATA_KEY$2;
632 var DATA_API_KEY$2 = '.data-api';
633 var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2];
634 var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key
635
636 var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key
637
638 var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
639
640 var SWIPE_THRESHOLD = 40;
641 var Default = {
642 interval: 5000,
643 keyboard: true,
644 slide: false,
645 pause: 'hover',
646 wrap: true,
647 touch: true
648 };
649 var DefaultType = {
650 interval: '(number|boolean)',
651 keyboard: 'boolean',
652 slide: '(boolean|string)',
653 pause: '(string|boolean)',
654 wrap: 'boolean',
655 touch: 'boolean'
656 };
657 var Direction = {
658 NEXT: 'next',
659 PREV: 'prev',
660 LEFT: 'left',
661 RIGHT: 'right'
662 };
663 var Event$2 = {
664 SLIDE: "slide" + EVENT_KEY$2,
665 SLID: "slid" + EVENT_KEY$2,
666 KEYDOWN: "keydown" + EVENT_KEY$2,
667 MOUSEENTER: "mouseenter" + EVENT_KEY$2,
668 MOUSELEAVE: "mouseleave" + EVENT_KEY$2,
669 TOUCHSTART: "touchstart" + EVENT_KEY$2,
670 TOUCHMOVE: "touchmove" + EVENT_KEY$2,
671 TOUCHEND: "touchend" + EVENT_KEY$2,
672 POINTERDOWN: "pointerdown" + EVENT_KEY$2,
673 POINTERUP: "pointerup" + EVENT_KEY$2,
674 DRAG_START: "dragstart" + EVENT_KEY$2,
675 LOAD_DATA_API: "load" + EVENT_KEY$2 + DATA_API_KEY$2,
676 CLICK_DATA_API: "click" + EVENT_KEY$2 + DATA_API_KEY$2
677 };
678 var ClassName$2 = {
679 CAROUSEL: 'carousel',
680 ACTIVE: 'active',
681 SLIDE: 'slide',
682 RIGHT: 'carousel-item-right',
683 LEFT: 'carousel-item-left',
684 NEXT: 'carousel-item-next',
685 PREV: 'carousel-item-prev',
686 ITEM: 'carousel-item',
687 POINTER_EVENT: 'pointer-event'
688 };
689 var Selector$2 = {
690 ACTIVE: '.active',
691 ACTIVE_ITEM: '.active.carousel-item',
692 ITEM: '.carousel-item',
693 ITEM_IMG: '.carousel-item img',
694 NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
695 INDICATORS: '.carousel-indicators',
696 DATA_SLIDE: '[data-slide], [data-slide-to]',
697 DATA_RIDE: '[data-ride="carousel"]'
698 };
699 var PointerType = {
700 TOUCH: 'touch',
701 PEN: 'pen'
702 };
703 /**
704 * ------------------------------------------------------------------------
705 * Class Definition
706 * ------------------------------------------------------------------------
707 */
708
709 var Carousel =
710 /*#__PURE__*/
711 function () {
712 function Carousel(element, config) {
713 this._items = null;
714 this._interval = null;
715 this._activeElement = null;
716 this._isPaused = false;
717 this._isSliding = false;
718 this.touchTimeout = null;
719 this.touchStartX = 0;
720 this.touchDeltaX = 0;
721 this._config = this._getConfig(config);
722 this._element = element;
723 this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS);
724 this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
725 this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);
726
727 this._addEventListeners();
728 } // Getters
729
730
731 var _proto = Carousel.prototype;
732
733 // Public
734 _proto.next = function next() {
735 if (!this._isSliding) {
736 this._slide(Direction.NEXT);
737 }
738 };
739
740 _proto.nextWhenVisible = function nextWhenVisible() {
741 // Don't call next when the page isn't visible
742 // or the carousel or its parent isn't visible
743 if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {
744 this.next();
745 }
746 };
747
748 _proto.prev = function prev() {
749 if (!this._isSliding) {
750 this._slide(Direction.PREV);
751 }
752 };
753
754 _proto.pause = function pause(event) {
755 if (!event) {
756 this._isPaused = true;
757 }
758
759 if (this._element.querySelector(Selector$2.NEXT_PREV)) {
760 Util.triggerTransitionEnd(this._element);
761 this.cycle(true);
762 }
763
764 clearInterval(this._interval);
765 this._interval = null;
766 };
767
768 _proto.cycle = function cycle(event) {
769 if (!event) {
770 this._isPaused = false;
771 }
772
773 if (this._interval) {
774 clearInterval(this._interval);
775 this._interval = null;
776 }
777
778 if (this._config.interval && !this._isPaused) {
779 this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
780 }
781 };
782
783 _proto.to = function to(index) {
784 var _this = this;
785
786 this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);
787
788 var activeIndex = this._getItemIndex(this._activeElement);
789
790 if (index > this._items.length - 1 || index < 0) {
791 return;
792 }
793
794 if (this._isSliding) {
795 $(this._element).one(Event$2.SLID, function () {
796 return _this.to(index);
797 });
798 return;
799 }
800
801 if (activeIndex === index) {
802 this.pause();
803 this.cycle();
804 return;
805 }
806
807 var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;
808
809 this._slide(direction, this._items[index]);
810 };
811
812 _proto.dispose = function dispose() {
813 $(this._element).off(EVENT_KEY$2);
814 $.removeData(this._element, DATA_KEY$2);
815 this._items = null;
816 this._config = null;
817 this._element = null;
818 this._interval = null;
819 this._isPaused = null;
820 this._isSliding = null;
821 this._activeElement = null;
822 this._indicatorsElement = null;
823 } // Private
824 ;
825
826 _proto._getConfig = function _getConfig(config) {
827 config = _objectSpread2({}, Default, {}, config);
828 Util.typeCheckConfig(NAME$2, config, DefaultType);
829 return config;
830 };
831
832 _proto._handleSwipe = function _handleSwipe() {
833 var absDeltax = Math.abs(this.touchDeltaX);
834
835 if (absDeltax <= SWIPE_THRESHOLD) {
836 return;
837 }
838
839 var direction = absDeltax / this.touchDeltaX;
840 this.touchDeltaX = 0; // swipe left
841
842 if (direction > 0) {
843 this.prev();
844 } // swipe right
845
846
847 if (direction < 0) {
848 this.next();
849 }
850 };
851
852 _proto._addEventListeners = function _addEventListeners() {
853 var _this2 = this;
854
855 if (this._config.keyboard) {
856 $(this._element).on(Event$2.KEYDOWN, function (event) {
857 return _this2._keydown(event);
858 });
859 }
860
861 if (this._config.pause === 'hover') {
862 $(this._element).on(Event$2.MOUSEENTER, function (event) {
863 return _this2.pause(event);
864 }).on(Event$2.MOUSELEAVE, function (event) {
865 return _this2.cycle(event);
866 });
867 }
868
869 if (this._config.touch) {
870 this._addTouchEventListeners();
871 }
872 };
873
874 _proto._addTouchEventListeners = function _addTouchEventListeners() {
875 var _this3 = this;
876
877 if (!this._touchSupported) {
878 return;
879 }
880
881 var start = function start(event) {
882 if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
883 _this3.touchStartX = event.originalEvent.clientX;
884 } else if (!_this3._pointerEvent) {
885 _this3.touchStartX = event.originalEvent.touches[0].clientX;
886 }
887 };
888
889 var move = function move(event) {
890 // ensure swiping with one touch and not pinching
891 if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {
892 _this3.touchDeltaX = 0;
893 } else {
894 _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;
895 }
896 };
897
898 var end = function end(event) {
899 if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
900 _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;
901 }
902
903 _this3._handleSwipe();
904
905 if (_this3._config.pause === 'hover') {
906 // If it's a touch-enabled device, mouseenter/leave are fired as
907 // part of the mouse compatibility events on first tap - the carousel
908 // would stop cycling until user tapped out of it;
909 // here, we listen for touchend, explicitly pause the carousel
910 // (as if it's the second time we tap on it, mouseenter compat event
911 // is NOT fired) and after a timeout (to allow for mouse compatibility
912 // events to fire) we explicitly restart cycling
913 _this3.pause();
914
915 if (_this3.touchTimeout) {
916 clearTimeout(_this3.touchTimeout);
917 }
918
919 _this3.touchTimeout = setTimeout(function (event) {
920 return _this3.cycle(event);
921 }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);
922 }
923 };
924
925 $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) {
926 return e.preventDefault();
927 });
928
929 if (this._pointerEvent) {
930 $(this._element).on(Event$2.POINTERDOWN, function (event) {
931 return start(event);
932 });
933 $(this._element).on(Event$2.POINTERUP, function (event) {
934 return end(event);
935 });
936
937 this._element.classList.add(ClassName$2.POINTER_EVENT);
938 } else {
939 $(this._element).on(Event$2.TOUCHSTART, function (event) {
940 return start(event);
941 });
942 $(this._element).on(Event$2.TOUCHMOVE, function (event) {
943 return move(event);
944 });
945 $(this._element).on(Event$2.TOUCHEND, function (event) {
946 return end(event);
947 });
948 }
949 };
950
951 _proto._keydown = function _keydown(event) {
952 if (/input|textarea/i.test(event.target.tagName)) {
953 return;
954 }
955
956 switch (event.which) {
957 case ARROW_LEFT_KEYCODE:
958 event.preventDefault();
959 this.prev();
960 break;
961
962 case ARROW_RIGHT_KEYCODE:
963 event.preventDefault();
964 this.next();
965 break;
966 }
967 };
968
969 _proto._getItemIndex = function _getItemIndex(element) {
970 this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : [];
971 return this._items.indexOf(element);
972 };
973
974 _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {
975 var isNextDirection = direction === Direction.NEXT;
976 var isPrevDirection = direction === Direction.PREV;
977
978 var activeIndex = this._getItemIndex(activeElement);
979
980 var lastItemIndex = this._items.length - 1;
981 var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
982
983 if (isGoingToWrap && !this._config.wrap) {
984 return activeElement;
985 }
986
987 var delta = direction === Direction.PREV ? -1 : 1;
988 var itemIndex = (activeIndex + delta) % this._items.length;
989 return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
990 };
991
992 _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
993 var targetIndex = this._getItemIndex(relatedTarget);
994
995 var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM));
996
997 var slideEvent = $.Event(Event$2.SLIDE, {
998 relatedTarget: relatedTarget,
999 direction: eventDirectionName,
1000 from: fromIndex,
1001 to: targetIndex
1002 });
1003 $(this._element).trigger(slideEvent);
1004 return slideEvent;
1005 };
1006
1007 _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
1008 if (this._indicatorsElement) {
1009 var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE));
1010 $(indicators).removeClass(ClassName$2.ACTIVE);
1011
1012 var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
1013
1014 if (nextIndicator) {
1015 $(nextIndicator).addClass(ClassName$2.ACTIVE);
1016 }
1017 }
1018 };
1019
1020 _proto._slide = function _slide(direction, element) {
1021 var _this4 = this;
1022
1023 var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);
1024
1025 var activeElementIndex = this._getItemIndex(activeElement);
1026
1027 var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
1028
1029 var nextElementIndex = this._getItemIndex(nextElement);
1030
1031 var isCycling = Boolean(this._interval);
1032 var directionalClassName;
1033 var orderClassName;
1034 var eventDirectionName;
1035
1036 if (direction === Direction.NEXT) {
1037 directionalClassName = ClassName$2.LEFT;
1038 orderClassName = ClassName$2.NEXT;
1039 eventDirectionName = Direction.LEFT;
1040 } else {
1041 directionalClassName = ClassName$2.RIGHT;
1042 orderClassName = ClassName$2.PREV;
1043 eventDirectionName = Direction.RIGHT;
1044 }
1045
1046 if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) {
1047 this._isSliding = false;
1048 return;
1049 }
1050
1051 var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
1052
1053 if (slideEvent.isDefaultPrevented()) {
1054 return;
1055 }
1056
1057 if (!activeElement || !nextElement) {
1058 // Some weirdness is happening, so we bail
1059 return;
1060 }
1061
1062 this._isSliding = true;
1063
1064 if (isCycling) {
1065 this.pause();
1066 }
1067
1068 this._setActiveIndicatorElement(nextElement);
1069
1070 var slidEvent = $.Event(Event$2.SLID, {
1071 relatedTarget: nextElement,
1072 direction: eventDirectionName,
1073 from: activeElementIndex,
1074 to: nextElementIndex
1075 });
1076
1077 if ($(this._element).hasClass(ClassName$2.SLIDE)) {
1078 $(nextElement).addClass(orderClassName);
1079 Util.reflow(nextElement);
1080 $(activeElement).addClass(directionalClassName);
1081 $(nextElement).addClass(directionalClassName);
1082 var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);
1083
1084 if (nextElementInterval) {
1085 this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
1086 this._config.interval = nextElementInterval;
1087 } else {
1088 this._config.interval = this._config.defaultInterval || this._config.interval;
1089 }
1090
1091 var transitionDuration = Util.getTransitionDurationFromElement(activeElement);
1092 $(activeElement).one(Util.TRANSITION_END, function () {
1093 $(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName$2.ACTIVE);
1094 $(activeElement).removeClass(ClassName$2.ACTIVE + " " + orderClassName + " " + directionalClassName);
1095 _this4._isSliding = false;
1096 setTimeout(function () {
1097 return $(_this4._element).trigger(slidEvent);
1098 }, 0);
1099 }).emulateTransitionEnd(transitionDuration);
1100 } else {
1101 $(activeElement).removeClass(ClassName$2.ACTIVE);
1102 $(nextElement).addClass(ClassName$2.ACTIVE);
1103 this._isSliding = false;
1104 $(this._element).trigger(slidEvent);
1105 }
1106
1107 if (isCycling) {
1108 this.cycle();
1109 }
1110 } // Static
1111 ;
1112
1113 Carousel._jQueryInterface = function _jQueryInterface(config) {
1114 return this.each(function () {
1115 var data = $(this).data(DATA_KEY$2);
1116
1117 var _config = _objectSpread2({}, Default, {}, $(this).data());
1118
1119 if (typeof config === 'object') {
1120 _config = _objectSpread2({}, _config, {}, config);
1121 }
1122
1123 var action = typeof config === 'string' ? config : _config.slide;
1124
1125 if (!data) {
1126 data = new Carousel(this, _config);
1127 $(this).data(DATA_KEY$2, data);
1128 }
1129
1130 if (typeof config === 'number') {
1131 data.to(config);
1132 } else if (typeof action === 'string') {
1133 if (typeof data[action] === 'undefined') {
1134 throw new TypeError("No method named \"" + action + "\"");
1135 }
1136
1137 data[action]();
1138 } else if (_config.interval && _config.ride) {
1139 data.pause();
1140 data.cycle();
1141 }
1142 });
1143 };
1144
1145 Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {
1146 var selector = Util.getSelectorFromElement(this);
1147
1148 if (!selector) {
1149 return;
1150 }
1151
1152 var target = $(selector)[0];
1153
1154 if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) {
1155 return;
1156 }
1157
1158 var config = _objectSpread2({}, $(target).data(), {}, $(this).data());
1159
1160 var slideIndex = this.getAttribute('data-slide-to');
1161
1162 if (slideIndex) {
1163 config.interval = false;
1164 }
1165
1166 Carousel._jQueryInterface.call($(target), config);
1167
1168 if (slideIndex) {
1169 $(target).data(DATA_KEY$2).to(slideIndex);
1170 }
1171
1172 event.preventDefault();
1173 };
1174
1175 _createClass(Carousel, null, [{
1176 key: "VERSION",
1177 get: function get() {
1178 return VERSION$2;
1179 }
1180 }, {
1181 key: "Default",
1182 get: function get() {
1183 return Default;
1184 }
1185 }]);
1186
1187 return Carousel;
1188 }();
1189 /**
1190 * ------------------------------------------------------------------------
1191 * Data Api implementation
1192 * ------------------------------------------------------------------------
1193 */
1194
1195
1196 $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler);
1197 $(window).on(Event$2.LOAD_DATA_API, function () {
1198 var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE));
1199
1200 for (var i = 0, len = carousels.length; i < len; i++) {
1201 var $carousel = $(carousels[i]);
1202
1203 Carousel._jQueryInterface.call($carousel, $carousel.data());
1204 }
1205 });
1206 /**
1207 * ------------------------------------------------------------------------
1208 * jQuery
1209 * ------------------------------------------------------------------------
1210 */
1211
1212 $.fn[NAME$2] = Carousel._jQueryInterface;
1213 $.fn[NAME$2].Constructor = Carousel;
1214
1215 $.fn[NAME$2].noConflict = function () {
1216 $.fn[NAME$2] = JQUERY_NO_CONFLICT$2;
1217 return Carousel._jQueryInterface;
1218 };
1219
1220 /**
1221 * ------------------------------------------------------------------------
1222 * Constants
1223 * ------------------------------------------------------------------------
1224 */
1225
1226 var NAME$3 = 'collapse';
1227 var VERSION$3 = '4.4.1';
1228 var DATA_KEY$3 = 'bs.collapse';
1229 var EVENT_KEY$3 = "." + DATA_KEY$3;
1230 var DATA_API_KEY$3 = '.data-api';
1231 var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3];
1232 var Default$1 = {
1233 toggle: true,
1234 parent: ''
1235 };
1236 var DefaultType$1 = {
1237 toggle: 'boolean',
1238 parent: '(string|element)'
1239 };
1240 var Event$3 = {
1241 SHOW: "show" + EVENT_KEY$3,
1242 SHOWN: "shown" + EVENT_KEY$3,
1243 HIDE: "hide" + EVENT_KEY$3,
1244 HIDDEN: "hidden" + EVENT_KEY$3,
1245 CLICK_DATA_API: "click" + EVENT_KEY$3 + DATA_API_KEY$3
1246 };
1247 var ClassName$3 = {
1248 SHOW: 'show',
1249 COLLAPSE: 'collapse',
1250 COLLAPSING: 'collapsing',
1251 COLLAPSED: 'collapsed'
1252 };
1253 var Dimension = {
1254 WIDTH: 'width',
1255 HEIGHT: 'height'
1256 };
1257 var Selector$3 = {
1258 ACTIVES: '.show, .collapsing',
1259 DATA_TOGGLE: '[data-toggle="collapse"]'
1260 };
1261 /**
1262 * ------------------------------------------------------------------------
1263 * Class Definition
1264 * ------------------------------------------------------------------------
1265 */
1266
1267 var Collapse =
1268 /*#__PURE__*/
1269 function () {
1270 function Collapse(element, config) {
1271 this._isTransitioning = false;
1272 this._element = element;
1273 this._config = this._getConfig(config);
1274 this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
1275 var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE));
1276
1277 for (var i = 0, len = toggleList.length; i < len; i++) {
1278 var elem = toggleList[i];
1279 var selector = Util.getSelectorFromElement(elem);
1280 var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
1281 return foundElem === element;
1282 });
1283
1284 if (selector !== null && filterElement.length > 0) {
1285 this._selector = selector;
1286
1287 this._triggerArray.push(elem);
1288 }
1289 }
1290
1291 this._parent = this._config.parent ? this._getParent() : null;
1292
1293 if (!this._config.parent) {
1294 this._addAriaAndCollapsedClass(this._element, this._triggerArray);
1295 }
1296
1297 if (this._config.toggle) {
1298 this.toggle();
1299 }
1300 } // Getters
1301
1302
1303 var _proto = Collapse.prototype;
1304
1305 // Public
1306 _proto.toggle = function toggle() {
1307 if ($(this._element).hasClass(ClassName$3.SHOW)) {
1308 this.hide();
1309 } else {
1310 this.show();
1311 }
1312 };
1313
1314 _proto.show = function show() {
1315 var _this = this;
1316
1317 if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) {
1318 return;
1319 }
1320
1321 var actives;
1322 var activesData;
1323
1324 if (this._parent) {
1325 actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) {
1326 if (typeof _this._config.parent === 'string') {
1327 return elem.getAttribute('data-parent') === _this._config.parent;
1328 }
1329
1330 return elem.classList.contains(ClassName$3.COLLAPSE);
1331 });
1332
1333 if (actives.length === 0) {
1334 actives = null;
1335 }
1336 }
1337
1338 if (actives) {
1339 activesData = $(actives).not(this._selector).data(DATA_KEY$3);
1340
1341 if (activesData && activesData._isTransitioning) {
1342 return;
1343 }
1344 }
1345
1346 var startEvent = $.Event(Event$3.SHOW);
1347 $(this._element).trigger(startEvent);
1348
1349 if (startEvent.isDefaultPrevented()) {
1350 return;
1351 }
1352
1353 if (actives) {
1354 Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');
1355
1356 if (!activesData) {
1357 $(actives).data(DATA_KEY$3, null);
1358 }
1359 }
1360
1361 var dimension = this._getDimension();
1362
1363 $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING);
1364 this._element.style[dimension] = 0;
1365
1366 if (this._triggerArray.length) {
1367 $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true);
1368 }
1369
1370 this.setTransitioning(true);
1371
1372 var complete = function complete() {
1373 $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW);
1374 _this._element.style[dimension] = '';
1375
1376 _this.setTransitioning(false);
1377
1378 $(_this._element).trigger(Event$3.SHOWN);
1379 };
1380
1381 var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
1382 var scrollSize = "scroll" + capitalizedDimension;
1383 var transitionDuration = Util.getTransitionDurationFromElement(this._element);
1384 $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
1385 this._element.style[dimension] = this._element[scrollSize] + "px";
1386 };
1387
1388 _proto.hide = function hide() {
1389 var _this2 = this;
1390
1391 if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) {
1392 return;
1393 }
1394
1395 var startEvent = $.Event(Event$3.HIDE);
1396 $(this._element).trigger(startEvent);
1397
1398 if (startEvent.isDefaultPrevented()) {
1399 return;
1400 }
1401
1402 var dimension = this._getDimension();
1403
1404 this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
1405 Util.reflow(this._element);
1406 $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW);
1407 var triggerArrayLength = this._triggerArray.length;
1408
1409 if (triggerArrayLength > 0) {
1410 for (var i = 0; i < triggerArrayLength; i++) {
1411 var trigger = this._triggerArray[i];
1412 var selector = Util.getSelectorFromElement(trigger);
1413
1414 if (selector !== null) {
1415 var $elem = $([].slice.call(document.querySelectorAll(selector)));
1416
1417 if (!$elem.hasClass(ClassName$3.SHOW)) {
1418 $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false);
1419 }
1420 }
1421 }
1422 }
1423
1424 this.setTransitioning(true);
1425
1426 var complete = function complete() {
1427 _this2.setTransitioning(false);
1428
1429 $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN);
1430 };
1431
1432 this._element.style[dimension] = '';
1433 var transitionDuration = Util.getTransitionDurationFromElement(this._element);
1434 $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
1435 };
1436
1437 _proto.setTransitioning = function setTransitioning(isTransitioning) {
1438 this._isTransitioning = isTransitioning;
1439 };
1440
1441 _proto.dispose = function dispose() {
1442 $.removeData(this._element, DATA_KEY$3);
1443 this._config = null;
1444 this._parent = null;
1445 this._element = null;
1446 this._triggerArray = null;
1447 this._isTransitioning = null;
1448 } // Private
1449 ;
1450
1451 _proto._getConfig = function _getConfig(config) {
1452 config = _objectSpread2({}, Default$1, {}, config);
1453 config.toggle = Boolean(config.toggle); // Coerce string values
1454
1455 Util.typeCheckConfig(NAME$3, config, DefaultType$1);
1456 return config;
1457 };
1458
1459 _proto._getDimension = function _getDimension() {
1460 var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
1461 return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
1462 };
1463
1464 _proto._getParent = function _getParent() {
1465 var _this3 = this;
1466
1467 var parent;
1468
1469 if (Util.isElement(this._config.parent)) {
1470 parent = this._config.parent; // It's a jQuery object
1471
1472 if (typeof this._config.parent.jquery !== 'undefined') {
1473 parent = this._config.parent[0];
1474 }
1475 } else {
1476 parent = document.querySelector(this._config.parent);
1477 }
1478
1479 var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
1480 var children = [].slice.call(parent.querySelectorAll(selector));
1481 $(children).each(function (i, element) {
1482 _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
1483 });
1484 return parent;
1485 };
1486
1487 _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
1488 var isOpen = $(element).hasClass(ClassName$3.SHOW);
1489
1490 if (triggerArray.length) {
1491 $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
1492 }
1493 } // Static
1494 ;
1495
1496 Collapse._getTargetFromElement = function _getTargetFromElement(element) {
1497 var selector = Util.getSelectorFromElement(element);
1498 return selector ? document.querySelector(selector) : null;
1499 };
1500
1501 Collapse._jQueryInterface = function _jQueryInterface(config) {
1502 return this.each(function () {
1503 var $this = $(this);
1504 var data = $this.data(DATA_KEY$3);
1505
1506 var _config = _objectSpread2({}, Default$1, {}, $this.data(), {}, typeof config === 'object' && config ? config : {});
1507
1508 if (!data && _config.toggle && /show|hide/.test(config)) {
1509 _config.toggle = false;
1510 }
1511
1512 if (!data) {
1513 data = new Collapse(this, _config);
1514 $this.data(DATA_KEY$3, data);
1515 }
1516
1517 if (typeof config === 'string') {
1518 if (typeof data[config] === 'undefined') {
1519 throw new TypeError("No method named \"" + config + "\"");
1520 }
1521
1522 data[config]();
1523 }
1524 });
1525 };
1526
1527 _createClass(Collapse, null, [{
1528 key: "VERSION",
1529 get: function get() {
1530 return VERSION$3;
1531 }
1532 }, {
1533 key: "Default",
1534 get: function get() {
1535 return Default$1;
1536 }
1537 }]);
1538
1539 return Collapse;
1540 }();
1541 /**
1542 * ------------------------------------------------------------------------
1543 * Data Api implementation
1544 * ------------------------------------------------------------------------
1545 */
1546
1547
1548 $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) {
1549 // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
1550 if (event.currentTarget.tagName === 'A') {
1551 event.preventDefault();
1552 }
1553
1554 var $trigger = $(this);
1555 var selector = Util.getSelectorFromElement(this);
1556 var selectors = [].slice.call(document.querySelectorAll(selector));
1557 $(selectors).each(function () {
1558 var $target = $(this);
1559 var data = $target.data(DATA_KEY$3);
1560 var config = data ? 'toggle' : $trigger.data();
1561
1562 Collapse._jQueryInterface.call($target, config);
1563 });
1564 });
1565 /**
1566 * ------------------------------------------------------------------------
1567 * jQuery
1568 * ------------------------------------------------------------------------
1569 */
1570
1571 $.fn[NAME$3] = Collapse._jQueryInterface;
1572 $.fn[NAME$3].Constructor = Collapse;
1573
1574 $.fn[NAME$3].noConflict = function () {
1575 $.fn[NAME$3] = JQUERY_NO_CONFLICT$3;
1576 return Collapse._jQueryInterface;
1577 };
1578
1579 /**!
1580 * @fileOverview Kickass library to create and place poppers near their reference elements.
1581 * @version 1.16.0
1582 * @license
1583 * Copyright (c) 2016 Federico Zivolo and contributors
1584 *
1585 * Permission is hereby granted, free of charge, to any person obtaining a copy
1586 * of this software and associated documentation files (the "Software"), to deal
1587 * in the Software without restriction, including without limitation the rights
1588 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1589 * copies of the Software, and to permit persons to whom the Software is
1590 * furnished to do so, subject to the following conditions:
1591 *
1592 * The above copyright notice and this permission notice shall be included in all
1593 * copies or substantial portions of the Software.
1594 *
1595 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1596 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1597 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1598 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1599 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1600 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1601 * SOFTWARE.
1602 */
1603 var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';
1604
1605 var timeoutDuration = function () {
1606 var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];
1607 for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {
1608 if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {
1609 return 1;
1610 }
1611 }
1612 return 0;
1613 }();
1614
1615 function microtaskDebounce(fn) {
1616 var called = false;
1617 return function () {
1618 if (called) {
1619 return;
1620 }
1621 called = true;
1622 window.Promise.resolve().then(function () {
1623 called = false;
1624 fn();
1625 });
1626 };
1627 }
1628
1629 function taskDebounce(fn) {
1630 var scheduled = false;
1631 return function () {
1632 if (!scheduled) {
1633 scheduled = true;
1634 setTimeout(function () {
1635 scheduled = false;
1636 fn();
1637 }, timeoutDuration);
1638 }
1639 };
1640 }
1641
1642 var supportsMicroTasks = isBrowser && window.Promise;
1643
1644 /**
1645 * Create a debounced version of a method, that's asynchronously deferred
1646 * but called in the minimum time possible.
1647 *
1648 * @method
1649 * @memberof Popper.Utils
1650 * @argument {Function} fn
1651 * @returns {Function}
1652 */
1653 var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;
1654
1655 /**
1656 * Check if the given variable is a function
1657 * @method
1658 * @memberof Popper.Utils
1659 * @argument {Any} functionToCheck - variable to check
1660 * @returns {Boolean} answer to: is a function?
1661 */
1662 function isFunction(functionToCheck) {
1663 var getType = {};
1664 return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
1665 }
1666
1667 /**
1668 * Get CSS computed property of the given element
1669 * @method
1670 * @memberof Popper.Utils
1671 * @argument {Eement} element
1672 * @argument {String} property
1673 */
1674 function getStyleComputedProperty(element, property) {
1675 if (element.nodeType !== 1) {
1676 return [];
1677 }
1678 // NOTE: 1 DOM access here
1679 var window = element.ownerDocument.defaultView;
1680 var css = window.getComputedStyle(element, null);
1681 return property ? css[property] : css;
1682 }
1683
1684 /**
1685 * Returns the parentNode or the host of the element
1686 * @method
1687 * @memberof Popper.Utils
1688 * @argument {Element} element
1689 * @returns {Element} parent
1690 */
1691 function getParentNode(element) {
1692 if (element.nodeName === 'HTML') {
1693 return element;
1694 }
1695 return element.parentNode || element.host;
1696 }
1697
1698 /**
1699 * Returns the scrolling parent of the given element
1700 * @method
1701 * @memberof Popper.Utils
1702 * @argument {Element} element
1703 * @returns {Element} scroll parent
1704 */
1705 function getScrollParent(element) {
1706 // Return body, `getScroll` will take care to get the correct `scrollTop` from it
1707 if (!element) {
1708 return document.body;
1709 }
1710
1711 switch (element.nodeName) {
1712 case 'HTML':
1713 case 'BODY':
1714 return element.ownerDocument.body;
1715 case '#document':
1716 return element.body;
1717 }
1718
1719 // Firefox want us to check `-x` and `-y` variations as well
1720
1721 var _getStyleComputedProp = getStyleComputedProperty(element),
1722 overflow = _getStyleComputedProp.overflow,
1723 overflowX = _getStyleComputedProp.overflowX,
1724 overflowY = _getStyleComputedProp.overflowY;
1725
1726 if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
1727 return element;
1728 }
1729
1730 return getScrollParent(getParentNode(element));
1731 }
1732
1733 /**
1734 * Returns the reference node of the reference object, or the reference object itself.
1735 * @method
1736 * @memberof Popper.Utils
1737 * @param {Element|Object} reference - the reference element (the popper will be relative to this)
1738 * @returns {Element} parent
1739 */
1740 function getReferenceNode(reference) {
1741 return reference && reference.referenceNode ? reference.referenceNode : reference;
1742 }
1743
1744 var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);
1745 var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);
1746
1747 /**
1748 * Determines if the browser is Internet Explorer
1749 * @method
1750 * @memberof Popper.Utils
1751 * @param {Number} version to check
1752 * @returns {Boolean} isIE
1753 */
1754 function isIE(version) {
1755 if (version === 11) {
1756 return isIE11;
1757 }
1758 if (version === 10) {
1759 return isIE10;
1760 }
1761 return isIE11 || isIE10;
1762 }
1763
1764 /**
1765 * Returns the offset parent of the given element
1766 * @method
1767 * @memberof Popper.Utils
1768 * @argument {Element} element
1769 * @returns {Element} offset parent
1770 */
1771 function getOffsetParent(element) {
1772 if (!element) {
1773 return document.documentElement;
1774 }
1775
1776 var noOffsetParent = isIE(10) ? document.body : null;
1777
1778 // NOTE: 1 DOM access here
1779 var offsetParent = element.offsetParent || null;
1780 // Skip hidden elements which don't have an offsetParent
1781 while (offsetParent === noOffsetParent && element.nextElementSibling) {
1782 offsetParent = (element = element.nextElementSibling).offsetParent;
1783 }
1784
1785 var nodeName = offsetParent && offsetParent.nodeName;
1786
1787 if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {
1788 return element ? element.ownerDocument.documentElement : document.documentElement;
1789 }
1790
1791 // .offsetParent will return the closest TH, TD or TABLE in case
1792 // no offsetParent is present, I hate this job...
1793 if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {
1794 return getOffsetParent(offsetParent);
1795 }
1796
1797 return offsetParent;
1798 }
1799
1800 function isOffsetContainer(element) {
1801 var nodeName = element.nodeName;
1802
1803 if (nodeName === 'BODY') {
1804 return false;
1805 }
1806 return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;
1807 }
1808
1809 /**
1810 * Finds the root node (document, shadowDOM root) of the given element
1811 * @method
1812 * @memberof Popper.Utils
1813 * @argument {Element} node
1814 * @returns {Element} root node
1815 */
1816 function getRoot(node) {
1817 if (node.parentNode !== null) {
1818 return getRoot(node.parentNode);
1819 }
1820
1821 return node;
1822 }
1823
1824 /**
1825 * Finds the offset parent common to the two provided nodes
1826 * @method
1827 * @memberof Popper.Utils
1828 * @argument {Element} element1
1829 * @argument {Element} element2
1830 * @returns {Element} common offset parent
1831 */
1832 function findCommonOffsetParent(element1, element2) {
1833 // This check is needed to avoid errors in case one of the elements isn't defined for any reason
1834 if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {
1835 return document.documentElement;
1836 }
1837
1838 // Here we make sure to give as "start" the element that comes first in the DOM
1839 var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;
1840 var start = order ? element1 : element2;
1841 var end = order ? element2 : element1;
1842
1843 // Get common ancestor container
1844 var range = document.createRange();
1845 range.setStart(start, 0);
1846 range.setEnd(end, 0);
1847 var commonAncestorContainer = range.commonAncestorContainer;
1848
1849 // Both nodes are inside #document
1850
1851 if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {
1852 if (isOffsetContainer(commonAncestorContainer)) {
1853 return commonAncestorContainer;
1854 }
1855
1856 return getOffsetParent(commonAncestorContainer);
1857 }
1858
1859 // one of the nodes is inside shadowDOM, find which one
1860 var element1root = getRoot(element1);
1861 if (element1root.host) {
1862 return findCommonOffsetParent(element1root.host, element2);
1863 } else {
1864 return findCommonOffsetParent(element1, getRoot(element2).host);
1865 }
1866 }
1867
1868 /**
1869 * Gets the scroll value of the given element in the given side (top and left)
1870 * @method
1871 * @memberof Popper.Utils
1872 * @argument {Element} element
1873 * @argument {String} side `top` or `left`
1874 * @returns {number} amount of scrolled pixels
1875 */
1876 function getScroll(element) {
1877 var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';
1878
1879 var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';
1880 var nodeName = element.nodeName;
1881
1882 if (nodeName === 'BODY' || nodeName === 'HTML') {
1883 var html = element.ownerDocument.documentElement;
1884 var scrollingElement = element.ownerDocument.scrollingElement || html;
1885 return scrollingElement[upperSide];
1886 }
1887
1888 return element[upperSide];
1889 }
1890
1891 /*
1892 * Sum or subtract the element scroll values (left and top) from a given rect object
1893 * @method
1894 * @memberof Popper.Utils
1895 * @param {Object} rect - Rect object you want to change
1896 * @param {HTMLElement} element - The element from the function reads the scroll values
1897 * @param {Boolean} subtract - set to true if you want to subtract the scroll values
1898 * @return {Object} rect - The modifier rect object
1899 */
1900 function includeScroll(rect, element) {
1901 var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1902
1903 var scrollTop = getScroll(element, 'top');
1904 var scrollLeft = getScroll(element, 'left');
1905 var modifier = subtract ? -1 : 1;
1906 rect.top += scrollTop * modifier;
1907 rect.bottom += scrollTop * modifier;
1908 rect.left += scrollLeft * modifier;
1909 rect.right += scrollLeft * modifier;
1910 return rect;
1911 }
1912
1913 /*
1914 * Helper to detect borders of a given element
1915 * @method
1916 * @memberof Popper.Utils
1917 * @param {CSSStyleDeclaration} styles
1918 * Result of `getStyleComputedProperty` on the given element
1919 * @param {String} axis - `x` or `y`
1920 * @return {number} borders - The borders size of the given axis
1921 */
1922
1923 function getBordersSize(styles, axis) {
1924 var sideA = axis === 'x' ? 'Left' : 'Top';
1925 var sideB = sideA === 'Left' ? 'Right' : 'Bottom';
1926
1927 return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);
1928 }
1929
1930 function getSize(axis, body, html, computedStyle) {
1931 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);
1932 }
1933
1934 function getWindowSizes(document) {
1935 var body = document.body;
1936 var html = document.documentElement;
1937 var computedStyle = isIE(10) && getComputedStyle(html);
1938
1939 return {
1940 height: getSize('Height', body, html, computedStyle),
1941 width: getSize('Width', body, html, computedStyle)
1942 };
1943 }
1944
1945 var classCallCheck = function (instance, Constructor) {
1946 if (!(instance instanceof Constructor)) {
1947 throw new TypeError("Cannot call a class as a function");
1948 }
1949 };
1950
1951 var createClass = function () {
1952 function defineProperties(target, props) {
1953 for (var i = 0; i < props.length; i++) {
1954 var descriptor = props[i];
1955 descriptor.enumerable = descriptor.enumerable || false;
1956 descriptor.configurable = true;
1957 if ("value" in descriptor) descriptor.writable = true;
1958 Object.defineProperty(target, descriptor.key, descriptor);
1959 }
1960 }
1961
1962 return function (Constructor, protoProps, staticProps) {
1963 if (protoProps) defineProperties(Constructor.prototype, protoProps);
1964 if (staticProps) defineProperties(Constructor, staticProps);
1965 return Constructor;
1966 };
1967 }();
1968
1969
1970
1971
1972
1973 var defineProperty = function (obj, key, value) {
1974 if (key in obj) {
1975 Object.defineProperty(obj, key, {
1976 value: value,
1977 enumerable: true,
1978 configurable: true,
1979 writable: true
1980 });
1981 } else {
1982 obj[key] = value;
1983 }
1984
1985 return obj;
1986 };
1987
1988 var _extends = Object.assign || function (target) {
1989 for (var i = 1; i < arguments.length; i++) {
1990 var source = arguments[i];
1991
1992 for (var key in source) {
1993 if (Object.prototype.hasOwnProperty.call(source, key)) {
1994 target[key] = source[key];
1995 }
1996 }
1997 }
1998
1999 return target;
2000 };
2001
2002 /**
2003 * Given element offsets, generate an output similar to getBoundingClientRect
2004 * @method
2005 * @memberof Popper.Utils
2006 * @argument {Object} offsets
2007 * @returns {Object} ClientRect like output
2008 */
2009 function getClientRect(offsets) {
2010 return _extends({}, offsets, {
2011 right: offsets.left + offsets.width,
2012 bottom: offsets.top + offsets.height
2013 });
2014 }
2015
2016 /**
2017 * Get bounding client rect of given element
2018 * @method
2019 * @memberof Popper.Utils
2020 * @param {HTMLElement} element
2021 * @return {Object} client rect
2022 */
2023 function getBoundingClientRect(element) {
2024 var rect = {};
2025
2026 // IE10 10 FIX: Please, don't ask, the element isn't
2027 // considered in DOM in some circumstances...
2028 // This isn't reproducible in IE10 compatibility mode of IE11
2029 try {
2030 if (isIE(10)) {
2031 rect = element.getBoundingClientRect();
2032 var scrollTop = getScroll(element, 'top');
2033 var scrollLeft = getScroll(element, 'left');
2034 rect.top += scrollTop;
2035 rect.left += scrollLeft;
2036 rect.bottom += scrollTop;
2037 rect.right += scrollLeft;
2038 } else {
2039 rect = element.getBoundingClientRect();
2040 }
2041 } catch (e) {}
2042
2043 var result = {
2044 left: rect.left,
2045 top: rect.top,
2046 width: rect.right - rect.left,
2047 height: rect.bottom - rect.top
2048 };
2049
2050 // subtract scrollbar size from sizes
2051 var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
2052 var width = sizes.width || element.clientWidth || result.width;
2053 var height = sizes.height || element.clientHeight || result.height;
2054
2055 var horizScrollbar = element.offsetWidth - width;
2056 var vertScrollbar = element.offsetHeight - height;
2057
2058 // if an hypothetical scrollbar is detected, we must be sure it's not a `border`
2059 // we make this check conditional for performance reasons
2060 if (horizScrollbar || vertScrollbar) {
2061 var styles = getStyleComputedProperty(element);
2062 horizScrollbar -= getBordersSize(styles, 'x');
2063 vertScrollbar -= getBordersSize(styles, 'y');
2064
2065 result.width -= horizScrollbar;
2066 result.height -= vertScrollbar;
2067 }
2068
2069 return getClientRect(result);
2070 }
2071
2072 function getOffsetRectRelativeToArbitraryNode(children, parent) {
2073 var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
2074
2075 var isIE10 = isIE(10);
2076 var isHTML = parent.nodeName === 'HTML';
2077 var childrenRect = getBoundingClientRect(children);
2078 var parentRect = getBoundingClientRect(parent);
2079 var scrollParent = getScrollParent(children);
2080
2081 var styles = getStyleComputedProperty(parent);
2082 var borderTopWidth = parseFloat(styles.borderTopWidth, 10);
2083 var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);
2084
2085 // In cases where the parent is fixed, we must ignore negative scroll in offset calc
2086 if (fixedPosition && isHTML) {
2087 parentRect.top = Math.max(parentRect.top, 0);
2088 parentRect.left = Math.max(parentRect.left, 0);
2089 }
2090 var offsets = getClientRect({
2091 top: childrenRect.top - parentRect.top - borderTopWidth,
2092 left: childrenRect.left - parentRect.left - borderLeftWidth,
2093 width: childrenRect.width,
2094 height: childrenRect.height
2095 });
2096 offsets.marginTop = 0;
2097 offsets.marginLeft = 0;
2098
2099 // Subtract margins of documentElement in case it's being used as parent
2100 // we do this only on HTML because it's the only element that behaves
2101 // differently when margins are applied to it. The margins are included in
2102 // the box of the documentElement, in the other cases not.
2103 if (!isIE10 && isHTML) {
2104 var marginTop = parseFloat(styles.marginTop, 10);
2105 var marginLeft = parseFloat(styles.marginLeft, 10);
2106
2107 offsets.top -= borderTopWidth - marginTop;
2108 offsets.bottom -= borderTopWidth - marginTop;
2109 offsets.left -= borderLeftWidth - marginLeft;
2110 offsets.right -= borderLeftWidth - marginLeft;
2111
2112 // Attach marginTop and marginLeft because in some circumstances we may need them
2113 offsets.marginTop = marginTop;
2114 offsets.marginLeft = marginLeft;
2115 }
2116
2117 if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {
2118 offsets = includeScroll(offsets, parent);
2119 }
2120
2121 return offsets;
2122 }
2123
2124 function getViewportOffsetRectRelativeToArtbitraryNode(element) {
2125 var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
2126
2127 var html = element.ownerDocument.documentElement;
2128 var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);
2129 var width = Math.max(html.clientWidth, window.innerWidth || 0);
2130 var height = Math.max(html.clientHeight, window.innerHeight || 0);
2131
2132 var scrollTop = !excludeScroll ? getScroll(html) : 0;
2133 var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;
2134
2135 var offset = {
2136 top: scrollTop - relativeOffset.top + relativeOffset.marginTop,
2137 left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,
2138 width: width,
2139 height: height
2140 };
2141
2142 return getClientRect(offset);
2143 }
2144
2145 /**
2146 * Check if the given element is fixed or is inside a fixed parent
2147 * @method
2148 * @memberof Popper.Utils
2149 * @argument {Element} element
2150 * @argument {Element} customContainer
2151 * @returns {Boolean} answer to "isFixed?"
2152 */
2153 function isFixed(element) {
2154 var nodeName = element.nodeName;
2155 if (nodeName === 'BODY' || nodeName === 'HTML') {
2156 return false;
2157 }
2158 if (getStyleComputedProperty(element, 'position') === 'fixed') {
2159 return true;
2160 }
2161 var parentNode = getParentNode(element);
2162 if (!parentNode) {
2163 return false;
2164 }
2165 return isFixed(parentNode);
2166 }
2167
2168 /**
2169 * Finds the first parent of an element that has a transformed property defined
2170 * @method
2171 * @memberof Popper.Utils
2172 * @argument {Element} element
2173 * @returns {Element} first transformed parent or documentElement
2174 */
2175
2176 function getFixedPositionOffsetParent(element) {
2177 // This check is needed to avoid errors in case one of the elements isn't defined for any reason
2178 if (!element || !element.parentElement || isIE()) {
2179 return document.documentElement;
2180 }
2181 var el = element.parentElement;
2182 while (el && getStyleComputedProperty(el, 'transform') === 'none') {
2183 el = el.parentElement;
2184 }
2185 return el || document.documentElement;
2186 }
2187
2188 /**
2189 * Computed the boundaries limits and return them
2190 * @method
2191 * @memberof Popper.Utils
2192 * @param {HTMLElement} popper
2193 * @param {HTMLElement} reference
2194 * @param {number} padding
2195 * @param {HTMLElement} boundariesElement - Element used to define the boundaries
2196 * @param {Boolean} fixedPosition - Is in fixed position mode
2197 * @returns {Object} Coordinates of the boundaries
2198 */
2199 function getBoundaries(popper, reference, padding, boundariesElement) {
2200 var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
2201
2202 // NOTE: 1 DOM access here
2203
2204 var boundaries = { top: 0, left: 0 };
2205 var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));
2206
2207 // Handle viewport case
2208 if (boundariesElement === 'viewport') {
2209 boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);
2210 } else {
2211 // Handle other cases based on DOM element used as boundaries
2212 var boundariesNode = void 0;
2213 if (boundariesElement === 'scrollParent') {
2214 boundariesNode = getScrollParent(getParentNode(reference));
2215 if (boundariesNode.nodeName === 'BODY') {
2216 boundariesNode = popper.ownerDocument.documentElement;
2217 }
2218 } else if (boundariesElement === 'window') {
2219 boundariesNode = popper.ownerDocument.documentElement;
2220 } else {
2221 boundariesNode = boundariesElement;
2222 }
2223
2224 var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);
2225
2226 // In case of HTML, we need a different computation
2227 if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {
2228 var _getWindowSizes = getWindowSizes(popper.ownerDocument),
2229 height = _getWindowSizes.height,
2230 width = _getWindowSizes.width;
2231
2232 boundaries.top += offsets.top - offsets.marginTop;
2233 boundaries.bottom = height + offsets.top;
2234 boundaries.left += offsets.left - offsets.marginLeft;
2235 boundaries.right = width + offsets.left;
2236 } else {
2237 // for all the other DOM elements, this one is good
2238 boundaries = offsets;
2239 }
2240 }
2241
2242 // Add paddings
2243 padding = padding || 0;
2244 var isPaddingNumber = typeof padding === 'number';
2245 boundaries.left += isPaddingNumber ? padding : padding.left || 0;
2246 boundaries.top += isPaddingNumber ? padding : padding.top || 0;
2247 boundaries.right -= isPaddingNumber ? padding : padding.right || 0;
2248 boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;
2249
2250 return boundaries;
2251 }
2252
2253 function getArea(_ref) {
2254 var width = _ref.width,
2255 height = _ref.height;
2256
2257 return width * height;
2258 }
2259
2260 /**
2261 * Utility used to transform the `auto` placement to the placement with more
2262 * available space.
2263 * @method
2264 * @memberof Popper.Utils
2265 * @argument {Object} data - The data object generated by update method
2266 * @argument {Object} options - Modifiers configuration and options
2267 * @returns {Object} The data object, properly modified
2268 */
2269 function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {
2270 var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;
2271
2272 if (placement.indexOf('auto') === -1) {
2273 return placement;
2274 }
2275
2276 var boundaries = getBoundaries(popper, reference, padding, boundariesElement);
2277
2278 var rects = {
2279 top: {
2280 width: boundaries.width,
2281 height: refRect.top - boundaries.top
2282 },
2283 right: {
2284 width: boundaries.right - refRect.right,
2285 height: boundaries.height
2286 },
2287 bottom: {
2288 width: boundaries.width,
2289 height: boundaries.bottom - refRect.bottom
2290 },
2291 left: {
2292 width: refRect.left - boundaries.left,
2293 height: boundaries.height
2294 }
2295 };
2296
2297 var sortedAreas = Object.keys(rects).map(function (key) {
2298 return _extends({
2299 key: key
2300 }, rects[key], {
2301 area: getArea(rects[key])
2302 });
2303 }).sort(function (a, b) {
2304 return b.area - a.area;
2305 });
2306
2307 var filteredAreas = sortedAreas.filter(function (_ref2) {
2308 var width = _ref2.width,
2309 height = _ref2.height;
2310 return width >= popper.clientWidth && height >= popper.clientHeight;
2311 });
2312
2313 var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;
2314
2315 var variation = placement.split('-')[1];
2316
2317 return computedPlacement + (variation ? '-' + variation : '');
2318 }
2319
2320 /**
2321 * Get offsets to the reference element
2322 * @method
2323 * @memberof Popper.Utils
2324 * @param {Object} state
2325 * @param {Element} popper - the popper element
2326 * @param {Element} reference - the reference element (the popper will be relative to this)
2327 * @param {Element} fixedPosition - is in fixed position mode
2328 * @returns {Object} An object containing the offsets which will be applied to the popper
2329 */
2330 function getReferenceOffsets(state, popper, reference) {
2331 var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
2332
2333 var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));
2334 return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);
2335 }
2336
2337 /**
2338 * Get the outer sizes of the given element (offset size + margins)
2339 * @method
2340 * @memberof Popper.Utils
2341 * @argument {Element} element
2342 * @returns {Object} object containing width and height properties
2343 */
2344 function getOuterSizes(element) {
2345 var window = element.ownerDocument.defaultView;
2346 var styles = window.getComputedStyle(element);
2347 var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);
2348 var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);
2349 var result = {
2350 width: element.offsetWidth + y,
2351 height: element.offsetHeight + x
2352 };
2353 return result;
2354 }
2355
2356 /**
2357 * Get the opposite placement of the given one
2358 * @method
2359 * @memberof Popper.Utils
2360 * @argument {String} placement
2361 * @returns {String} flipped placement
2362 */
2363 function getOppositePlacement(placement) {
2364 var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };
2365 return placement.replace(/left|right|bottom|top/g, function (matched) {
2366 return hash[matched];
2367 });
2368 }
2369
2370 /**
2371 * Get offsets to the popper
2372 * @method
2373 * @memberof Popper.Utils
2374 * @param {Object} position - CSS position the Popper will get applied
2375 * @param {HTMLElement} popper - the popper element
2376 * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)
2377 * @param {String} placement - one of the valid placement options
2378 * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper
2379 */
2380 function getPopperOffsets(popper, referenceOffsets, placement) {
2381 placement = placement.split('-')[0];
2382
2383 // Get popper node sizes
2384 var popperRect = getOuterSizes(popper);
2385
2386 // Add position, width and height to our offsets object
2387 var popperOffsets = {
2388 width: popperRect.width,
2389 height: popperRect.height
2390 };
2391
2392 // depending by the popper placement we have to compute its offsets slightly differently
2393 var isHoriz = ['right', 'left'].indexOf(placement) !== -1;
2394 var mainSide = isHoriz ? 'top' : 'left';
2395 var secondarySide = isHoriz ? 'left' : 'top';
2396 var measurement = isHoriz ? 'height' : 'width';
2397 var secondaryMeasurement = !isHoriz ? 'height' : 'width';
2398
2399 popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;
2400 if (placement === secondarySide) {
2401 popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];
2402 } else {
2403 popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];
2404 }
2405
2406 return popperOffsets;
2407 }
2408
2409 /**
2410 * Mimics the `find` method of Array
2411 * @method
2412 * @memberof Popper.Utils
2413 * @argument {Array} arr
2414 * @argument prop
2415 * @argument value
2416 * @returns index or -1
2417 */
2418 function find(arr, check) {
2419 // use native find if supported
2420 if (Array.prototype.find) {
2421 return arr.find(check);
2422 }
2423
2424 // use `filter` to obtain the same behavior of `find`
2425 return arr.filter(check)[0];
2426 }
2427
2428 /**
2429 * Return the index of the matching object
2430 * @method
2431 * @memberof Popper.Utils
2432 * @argument {Array} arr
2433 * @argument prop
2434 * @argument value
2435 * @returns index or -1
2436 */
2437 function findIndex(arr, prop, value) {
2438 // use native findIndex if supported
2439 if (Array.prototype.findIndex) {
2440 return arr.findIndex(function (cur) {
2441 return cur[prop] === value;
2442 });
2443 }
2444
2445 // use `find` + `indexOf` if `findIndex` isn't supported
2446 var match = find(arr, function (obj) {
2447 return obj[prop] === value;
2448 });
2449 return arr.indexOf(match);
2450 }
2451
2452 /**
2453 * Loop trough the list of modifiers and run them in order,
2454 * each of them will then edit the data object.
2455 * @method
2456 * @memberof Popper.Utils
2457 * @param {dataObject} data
2458 * @param {Array} modifiers
2459 * @param {String} ends - Optional modifier name used as stopper
2460 * @returns {dataObject}
2461 */
2462 function runModifiers(modifiers, data, ends) {
2463 var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));
2464
2465 modifiersToRun.forEach(function (modifier) {
2466 if (modifier['function']) {
2467 // eslint-disable-line dot-notation
2468 console.warn('`modifier.function` is deprecated, use `modifier.fn`!');
2469 }
2470 var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation
2471 if (modifier.enabled && isFunction(fn)) {
2472 // Add properties to offsets to make them a complete clientRect object
2473 // we do this before each modifier to make sure the previous one doesn't
2474 // mess with these values
2475 data.offsets.popper = getClientRect(data.offsets.popper);
2476 data.offsets.reference = getClientRect(data.offsets.reference);
2477
2478 data = fn(data, modifier);
2479 }
2480 });
2481
2482 return data;
2483 }
2484
2485 /**
2486 * Updates the position of the popper, computing the new offsets and applying
2487 * the new style.<br />
2488 * Prefer `scheduleUpdate` over `update` because of performance reasons.
2489 * @method
2490 * @memberof Popper
2491 */
2492 function update() {
2493 // if popper is destroyed, don't perform any further update
2494 if (this.state.isDestroyed) {
2495 return;
2496 }
2497
2498 var data = {
2499 instance: this,
2500 styles: {},
2501 arrowStyles: {},
2502 attributes: {},
2503 flipped: false,
2504 offsets: {}
2505 };
2506
2507 // compute reference element offsets
2508 data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);
2509
2510 // compute auto placement, store placement inside the data object,
2511 // modifiers will be able to edit `placement` if needed
2512 // and refer to originalPlacement to know the original value
2513 data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);
2514
2515 // store the computed placement inside `originalPlacement`
2516 data.originalPlacement = data.placement;
2517
2518 data.positionFixed = this.options.positionFixed;
2519
2520 // compute the popper offsets
2521 data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);
2522
2523 data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';
2524
2525 // run the modifiers
2526 data = runModifiers(this.modifiers, data);
2527
2528 // the first `update` will call `onCreate` callback
2529 // the other ones will call `onUpdate` callback
2530 if (!this.state.isCreated) {
2531 this.state.isCreated = true;
2532 this.options.onCreate(data);
2533 } else {
2534 this.options.onUpdate(data);
2535 }
2536 }
2537
2538 /**
2539 * Helper used to know if the given modifier is enabled.
2540 * @method
2541 * @memberof Popper.Utils
2542 * @returns {Boolean}
2543 */
2544 function isModifierEnabled(modifiers, modifierName) {
2545 return modifiers.some(function (_ref) {
2546 var name = _ref.name,
2547 enabled = _ref.enabled;
2548 return enabled && name === modifierName;
2549 });
2550 }
2551
2552 /**
2553 * Get the prefixed supported property name
2554 * @method
2555 * @memberof Popper.Utils
2556 * @argument {String} property (camelCase)
2557 * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)
2558 */
2559 function getSupportedPropertyName(property) {
2560 var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];
2561 var upperProp = property.charAt(0).toUpperCase() + property.slice(1);
2562
2563 for (var i = 0; i < prefixes.length; i++) {
2564 var prefix = prefixes[i];
2565 var toCheck = prefix ? '' + prefix + upperProp : property;
2566 if (typeof document.body.style[toCheck] !== 'undefined') {
2567 return toCheck;
2568 }
2569 }
2570 return null;
2571 }
2572
2573 /**
2574 * Destroys the popper.
2575 * @method
2576 * @memberof Popper
2577 */
2578 function destroy() {
2579 this.state.isDestroyed = true;
2580
2581 // touch DOM only if `applyStyle` modifier is enabled
2582 if (isModifierEnabled(this.modifiers, 'applyStyle')) {
2583 this.popper.removeAttribute('x-placement');
2584 this.popper.style.position = '';
2585 this.popper.style.top = '';
2586 this.popper.style.left = '';
2587 this.popper.style.right = '';
2588 this.popper.style.bottom = '';
2589 this.popper.style.willChange = '';
2590 this.popper.style[getSupportedPropertyName('transform')] = '';
2591 }
2592
2593 this.disableEventListeners();
2594
2595 // remove the popper if user explicitly asked for the deletion on destroy
2596 // do not use `remove` because IE11 doesn't support it
2597 if (this.options.removeOnDestroy) {
2598 this.popper.parentNode.removeChild(this.popper);
2599 }
2600 return this;
2601 }
2602
2603 /**
2604 * Get the window associated with the element
2605 * @argument {Element} element
2606 * @returns {Window}
2607 */
2608 function getWindow(element) {
2609 var ownerDocument = element.ownerDocument;
2610 return ownerDocument ? ownerDocument.defaultView : window;
2611 }
2612
2613 function attachToScrollParents(scrollParent, event, callback, scrollParents) {
2614 var isBody = scrollParent.nodeName === 'BODY';
2615 var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;
2616 target.addEventListener(event, callback, { passive: true });
2617
2618 if (!isBody) {
2619 attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);
2620 }
2621 scrollParents.push(target);
2622 }
2623
2624 /**
2625 * Setup needed event listeners used to update the popper position
2626 * @method
2627 * @memberof Popper.Utils
2628 * @private
2629 */
2630 function setupEventListeners(reference, options, state, updateBound) {
2631 // Resize event listener on window
2632 state.updateBound = updateBound;
2633 getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });
2634
2635 // Scroll event listener on scroll parents
2636 var scrollElement = getScrollParent(reference);
2637 attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);
2638 state.scrollElement = scrollElement;
2639 state.eventsEnabled = true;
2640
2641 return state;
2642 }
2643
2644 /**
2645 * It will add resize/scroll events and start recalculating
2646 * position of the popper element when they are triggered.
2647 * @method
2648 * @memberof Popper
2649 */
2650 function enableEventListeners() {
2651 if (!this.state.eventsEnabled) {
2652 this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);
2653 }
2654 }
2655
2656 /**
2657 * Remove event listeners used to update the popper position
2658 * @method
2659 * @memberof Popper.Utils
2660 * @private
2661 */
2662 function removeEventListeners(reference, state) {
2663 // Remove resize event listener on window
2664 getWindow(reference).removeEventListener('resize', state.updateBound);
2665
2666 // Remove scroll event listener on scroll parents
2667 state.scrollParents.forEach(function (target) {
2668 target.removeEventListener('scroll', state.updateBound);
2669 });
2670
2671 // Reset state
2672 state.updateBound = null;
2673 state.scrollParents = [];
2674 state.scrollElement = null;
2675 state.eventsEnabled = false;
2676 return state;
2677 }
2678
2679 /**
2680 * It will remove resize/scroll events and won't recalculate popper position
2681 * when they are triggered. It also won't trigger `onUpdate` callback anymore,
2682 * unless you call `update` method manually.
2683 * @method
2684 * @memberof Popper
2685 */
2686 function disableEventListeners() {
2687 if (this.state.eventsEnabled) {
2688 cancelAnimationFrame(this.scheduleUpdate);
2689 this.state = removeEventListeners(this.reference, this.state);
2690 }
2691 }
2692
2693 /**
2694 * Tells if a given input is a number
2695 * @method
2696 * @memberof Popper.Utils
2697 * @param {*} input to check
2698 * @return {Boolean}
2699 */
2700 function isNumeric(n) {
2701 return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);
2702 }
2703
2704 /**
2705 * Set the style to the given popper
2706 * @method
2707 * @memberof Popper.Utils
2708 * @argument {Element} element - Element to apply the style to
2709 * @argument {Object} styles
2710 * Object with a list of properties and values which will be applied to the element
2711 */
2712 function setStyles(element, styles) {
2713 Object.keys(styles).forEach(function (prop) {
2714 var unit = '';
2715 // add unit if the value is numeric and is one of the following
2716 if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {
2717 unit = 'px';
2718 }
2719 element.style[prop] = styles[prop] + unit;
2720 });
2721 }
2722
2723 /**
2724 * Set the attributes to the given popper
2725 * @method
2726 * @memberof Popper.Utils
2727 * @argument {Element} element - Element to apply the attributes to
2728 * @argument {Object} styles
2729 * Object with a list of properties and values which will be applied to the element
2730 */
2731 function setAttributes(element, attributes) {
2732 Object.keys(attributes).forEach(function (prop) {
2733 var value = attributes[prop];
2734 if (value !== false) {
2735 element.setAttribute(prop, attributes[prop]);
2736 } else {
2737 element.removeAttribute(prop);
2738 }
2739 });
2740 }
2741
2742 /**
2743 * @function
2744 * @memberof Modifiers
2745 * @argument {Object} data - The data object generated by `update` method
2746 * @argument {Object} data.styles - List of style properties - values to apply to popper element
2747 * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element
2748 * @argument {Object} options - Modifiers configuration and options
2749 * @returns {Object} The same data object
2750 */
2751 function applyStyle(data) {
2752 // any property present in `data.styles` will be applied to the popper,
2753 // in this way we can make the 3rd party modifiers add custom styles to it
2754 // Be aware, modifiers could override the properties defined in the previous
2755 // lines of this modifier!
2756 setStyles(data.instance.popper, data.styles);
2757
2758 // any property present in `data.attributes` will be applied to the popper,
2759 // they will be set as HTML attributes of the element
2760 setAttributes(data.instance.popper, data.attributes);
2761
2762 // if arrowElement is defined and arrowStyles has some properties
2763 if (data.arrowElement && Object.keys(data.arrowStyles).length) {
2764 setStyles(data.arrowElement, data.arrowStyles);
2765 }
2766
2767 return data;
2768 }
2769
2770 /**
2771 * Set the x-placement attribute before everything else because it could be used
2772 * to add margins to the popper margins needs to be calculated to get the
2773 * correct popper offsets.
2774 * @method
2775 * @memberof Popper.modifiers
2776 * @param {HTMLElement} reference - The reference element used to position the popper
2777 * @param {HTMLElement} popper - The HTML element used as popper
2778 * @param {Object} options - Popper.js options
2779 */
2780 function applyStyleOnLoad(reference, popper, options, modifierOptions, state) {
2781 // compute reference element offsets
2782 var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);
2783
2784 // compute auto placement, store placement inside the data object,
2785 // modifiers will be able to edit `placement` if needed
2786 // and refer to originalPlacement to know the original value
2787 var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);
2788
2789 popper.setAttribute('x-placement', placement);
2790
2791 // Apply `position` to popper before anything else because
2792 // without the position applied we can't guarantee correct computations
2793 setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });
2794
2795 return options;
2796 }
2797
2798 /**
2799 * @function
2800 * @memberof Popper.Utils
2801 * @argument {Object} data - The data object generated by `update` method
2802 * @argument {Boolean} shouldRound - If the offsets should be rounded at all
2803 * @returns {Object} The popper's position offsets rounded
2804 *
2805 * The tale of pixel-perfect positioning. It's still not 100% perfect, but as
2806 * good as it can be within reason.
2807 * Discussion here: https://github.com/FezVrasta/popper.js/pull/715
2808 *
2809 * Low DPI screens cause a popper to be blurry if not using full pixels (Safari
2810 * as well on High DPI screens).
2811 *
2812 * Firefox prefers no rounding for positioning and does not have blurriness on
2813 * high DPI screens.
2814 *
2815 * Only horizontal placement and left/right values need to be considered.
2816 */
2817 function getRoundedOffsets(data, shouldRound) {
2818 var _data$offsets = data.offsets,
2819 popper = _data$offsets.popper,
2820 reference = _data$offsets.reference;
2821 var round = Math.round,
2822 floor = Math.floor;
2823
2824 var noRound = function noRound(v) {
2825 return v;
2826 };
2827
2828 var referenceWidth = round(reference.width);
2829 var popperWidth = round(popper.width);
2830
2831 var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;
2832 var isVariation = data.placement.indexOf('-') !== -1;
2833 var sameWidthParity = referenceWidth % 2 === popperWidth % 2;
2834 var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;
2835
2836 var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;
2837 var verticalToInteger = !shouldRound ? noRound : round;
2838
2839 return {
2840 left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),
2841 top: verticalToInteger(popper.top),
2842 bottom: verticalToInteger(popper.bottom),
2843 right: horizontalToInteger(popper.right)
2844 };
2845 }
2846
2847 var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);
2848
2849 /**
2850 * @function
2851 * @memberof Modifiers
2852 * @argument {Object} data - The data object generated by `update` method
2853 * @argument {Object} options - Modifiers configuration and options
2854 * @returns {Object} The data object, properly modified
2855 */
2856 function computeStyle(data, options) {
2857 var x = options.x,
2858 y = options.y;
2859 var popper = data.offsets.popper;
2860
2861 // Remove this legacy support in Popper.js v2
2862
2863 var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {
2864 return modifier.name === 'applyStyle';
2865 }).gpuAcceleration;
2866 if (legacyGpuAccelerationOption !== undefined) {
2867 console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');
2868 }
2869 var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;
2870
2871 var offsetParent = getOffsetParent(data.instance.popper);
2872 var offsetParentRect = getBoundingClientRect(offsetParent);
2873
2874 // Styles
2875 var styles = {
2876 position: popper.position
2877 };
2878
2879 var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);
2880
2881 var sideA = x === 'bottom' ? 'top' : 'bottom';
2882 var sideB = y === 'right' ? 'left' : 'right';
2883
2884 // if gpuAcceleration is set to `true` and transform is supported,
2885 // we use `translate3d` to apply the position to the popper we
2886 // automatically use the supported prefixed version if needed
2887 var prefixedProperty = getSupportedPropertyName('transform');
2888
2889 // now, let's make a step back and look at this code closely (wtf?)
2890 // If the content of the popper grows once it's been positioned, it
2891 // may happen that the popper gets misplaced because of the new content
2892 // overflowing its reference element
2893 // To avoid this problem, we provide two options (x and y), which allow
2894 // the consumer to define the offset origin.
2895 // If we position a popper on top of a reference element, we can set
2896 // `x` to `top` to make the popper grow towards its top instead of
2897 // its bottom.
2898 var left = void 0,
2899 top = void 0;
2900 if (sideA === 'bottom') {
2901 // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)
2902 // and not the bottom of the html element
2903 if (offsetParent.nodeName === 'HTML') {
2904 top = -offsetParent.clientHeight + offsets.bottom;
2905 } else {
2906 top = -offsetParentRect.height + offsets.bottom;
2907 }
2908 } else {
2909 top = offsets.top;
2910 }
2911 if (sideB === 'right') {
2912 if (offsetParent.nodeName === 'HTML') {
2913 left = -offsetParent.clientWidth + offsets.right;
2914 } else {
2915 left = -offsetParentRect.width + offsets.right;
2916 }
2917 } else {
2918 left = offsets.left;
2919 }
2920 if (gpuAcceleration && prefixedProperty) {
2921 styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';
2922 styles[sideA] = 0;
2923 styles[sideB] = 0;
2924 styles.willChange = 'transform';
2925 } else {
2926 // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties
2927 var invertTop = sideA === 'bottom' ? -1 : 1;
2928 var invertLeft = sideB === 'right' ? -1 : 1;
2929 styles[sideA] = top * invertTop;
2930 styles[sideB] = left * invertLeft;
2931 styles.willChange = sideA + ', ' + sideB;
2932 }
2933
2934 // Attributes
2935 var attributes = {
2936 'x-placement': data.placement
2937 };
2938
2939 // Update `data` attributes, styles and arrowStyles
2940 data.attributes = _extends({}, attributes, data.attributes);
2941 data.styles = _extends({}, styles, data.styles);
2942 data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);
2943
2944 return data;
2945 }
2946
2947 /**
2948 * Helper used to know if the given modifier depends from another one.<br />
2949 * It checks if the needed modifier is listed and enabled.
2950 * @method
2951 * @memberof Popper.Utils
2952 * @param {Array} modifiers - list of modifiers
2953 * @param {String} requestingName - name of requesting modifier
2954 * @param {String} requestedName - name of requested modifier
2955 * @returns {Boolean}
2956 */
2957 function isModifierRequired(modifiers, requestingName, requestedName) {
2958 var requesting = find(modifiers, function (_ref) {
2959 var name = _ref.name;
2960 return name === requestingName;
2961 });
2962
2963 var isRequired = !!requesting && modifiers.some(function (modifier) {
2964 return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;
2965 });
2966
2967 if (!isRequired) {
2968 var _requesting = '`' + requestingName + '`';
2969 var requested = '`' + requestedName + '`';
2970 console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');
2971 }
2972 return isRequired;
2973 }
2974
2975 /**
2976 * @function
2977 * @memberof Modifiers
2978 * @argument {Object} data - The data object generated by update method
2979 * @argument {Object} options - Modifiers configuration and options
2980 * @returns {Object} The data object, properly modified
2981 */
2982 function arrow(data, options) {
2983 var _data$offsets$arrow;
2984
2985 // arrow depends on keepTogether in order to work
2986 if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {
2987 return data;
2988 }
2989
2990 var arrowElement = options.element;
2991
2992 // if arrowElement is a string, suppose it's a CSS selector
2993 if (typeof arrowElement === 'string') {
2994 arrowElement = data.instance.popper.querySelector(arrowElement);
2995
2996 // if arrowElement is not found, don't run the modifier
2997 if (!arrowElement) {
2998 return data;
2999 }
3000 } else {
3001 // if the arrowElement isn't a query selector we must check that the
3002 // provided DOM node is child of its popper node
3003 if (!data.instance.popper.contains(arrowElement)) {
3004 console.warn('WARNING: `arrow.element` must be child of its popper element!');
3005 return data;
3006 }
3007 }
3008
3009 var placement = data.placement.split('-')[0];
3010 var _data$offsets = data.offsets,
3011 popper = _data$offsets.popper,
3012 reference = _data$offsets.reference;
3013
3014 var isVertical = ['left', 'right'].indexOf(placement) !== -1;
3015
3016 var len = isVertical ? 'height' : 'width';
3017 var sideCapitalized = isVertical ? 'Top' : 'Left';
3018 var side = sideCapitalized.toLowerCase();
3019 var altSide = isVertical ? 'left' : 'top';
3020 var opSide = isVertical ? 'bottom' : 'right';
3021 var arrowElementSize = getOuterSizes(arrowElement)[len];
3022
3023 //
3024 // extends keepTogether behavior making sure the popper and its
3025 // reference have enough pixels in conjunction
3026 //
3027
3028 // top/left side
3029 if (reference[opSide] - arrowElementSize < popper[side]) {
3030 data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);
3031 }
3032 // bottom/right side
3033 if (reference[side] + arrowElementSize > popper[opSide]) {
3034 data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];
3035 }
3036 data.offsets.popper = getClientRect(data.offsets.popper);
3037
3038 // compute center of the popper
3039 var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;
3040
3041 // Compute the sideValue using the updated popper offsets
3042 // take popper margin in account because we don't have this info available
3043 var css = getStyleComputedProperty(data.instance.popper);
3044 var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);
3045 var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);
3046 var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;
3047
3048 // prevent arrowElement from being placed not contiguously to its popper
3049 sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);
3050
3051 data.arrowElement = arrowElement;
3052 data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);
3053
3054 return data;
3055 }
3056
3057 /**
3058 * Get the opposite placement variation of the given one
3059 * @method
3060 * @memberof Popper.Utils
3061 * @argument {String} placement variation
3062 * @returns {String} flipped placement variation
3063 */
3064 function getOppositeVariation(variation) {
3065 if (variation === 'end') {
3066 return 'start';
3067 } else if (variation === 'start') {
3068 return 'end';
3069 }
3070 return variation;
3071 }
3072
3073 /**
3074 * List of accepted placements to use as values of the `placement` option.<br />
3075 * Valid placements are:
3076 * - `auto`
3077 * - `top`
3078 * - `right`
3079 * - `bottom`
3080 * - `left`
3081 *
3082 * Each placement can have a variation from this list:
3083 * - `-start`
3084 * - `-end`
3085 *
3086 * Variations are interpreted easily if you think of them as the left to right
3087 * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`
3088 * is right.<br />
3089 * Vertically (`left` and `right`), `start` is top and `end` is bottom.
3090 *
3091 * Some valid examples are:
3092 * - `top-end` (on top of reference, right aligned)
3093 * - `right-start` (on right of reference, top aligned)
3094 * - `bottom` (on bottom, centered)
3095 * - `auto-end` (on the side with more space available, alignment depends by placement)
3096 *
3097 * @static
3098 * @type {Array}
3099 * @enum {String}
3100 * @readonly
3101 * @method placements
3102 * @memberof Popper
3103 */
3104 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'];
3105
3106 // Get rid of `auto` `auto-start` and `auto-end`
3107 var validPlacements = placements.slice(3);
3108
3109 /**
3110 * Given an initial placement, returns all the subsequent placements
3111 * clockwise (or counter-clockwise).
3112 *
3113 * @method
3114 * @memberof Popper.Utils
3115 * @argument {String} placement - A valid placement (it accepts variations)
3116 * @argument {Boolean} counter - Set to true to walk the placements counterclockwise
3117 * @returns {Array} placements including their variations
3118 */
3119 function clockwise(placement) {
3120 var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
3121
3122 var index = validPlacements.indexOf(placement);
3123 var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));
3124 return counter ? arr.reverse() : arr;
3125 }
3126
3127 var BEHAVIORS = {
3128 FLIP: 'flip',
3129 CLOCKWISE: 'clockwise',
3130 COUNTERCLOCKWISE: 'counterclockwise'
3131 };
3132
3133 /**
3134 * @function
3135 * @memberof Modifiers
3136 * @argument {Object} data - The data object generated by update method
3137 * @argument {Object} options - Modifiers configuration and options
3138 * @returns {Object} The data object, properly modified
3139 */
3140 function flip(data, options) {
3141 // if `inner` modifier is enabled, we can't use the `flip` modifier
3142 if (isModifierEnabled(data.instance.modifiers, 'inner')) {
3143 return data;
3144 }
3145
3146 if (data.flipped && data.placement === data.originalPlacement) {
3147 // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides
3148 return data;
3149 }
3150
3151 var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);
3152
3153 var placement = data.placement.split('-')[0];
3154 var placementOpposite = getOppositePlacement(placement);
3155 var variation = data.placement.split('-')[1] || '';
3156
3157 var flipOrder = [];
3158
3159 switch (options.behavior) {
3160 case BEHAVIORS.FLIP:
3161 flipOrder = [placement, placementOpposite];
3162 break;
3163 case BEHAVIORS.CLOCKWISE:
3164 flipOrder = clockwise(placement);
3165 break;
3166 case BEHAVIORS.COUNTERCLOCKWISE:
3167 flipOrder = clockwise(placement, true);
3168 break;
3169 default:
3170 flipOrder = options.behavior;
3171 }
3172
3173 flipOrder.forEach(function (step, index) {
3174 if (placement !== step || flipOrder.length === index + 1) {
3175 return data;
3176 }
3177
3178 placement = data.placement.split('-')[0];
3179 placementOpposite = getOppositePlacement(placement);
3180
3181 var popperOffsets = data.offsets.popper;
3182 var refOffsets = data.offsets.reference;
3183
3184 // using floor because the reference offsets may contain decimals we are not going to consider here
3185 var floor = Math.floor;
3186 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);
3187
3188 var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);
3189 var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);
3190 var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);
3191 var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);
3192
3193 var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;
3194
3195 // flip the variation if required
3196 var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
3197
3198 // flips variation if reference element overflows boundaries
3199 var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);
3200
3201 // flips variation if popper content overflows boundaries
3202 var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);
3203
3204 var flippedVariation = flippedVariationByRef || flippedVariationByContent;
3205
3206 if (overlapsRef || overflowsBoundaries || flippedVariation) {
3207 // this boolean to detect any flip loop
3208 data.flipped = true;
3209
3210 if (overlapsRef || overflowsBoundaries) {
3211 placement = flipOrder[index + 1];
3212 }
3213
3214 if (flippedVariation) {
3215 variation = getOppositeVariation(variation);
3216 }
3217
3218 data.placement = placement + (variation ? '-' + variation : '');
3219
3220 // this object contains `position`, we want to preserve it along with
3221 // any additional property we may add in the future
3222 data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));
3223
3224 data = runModifiers(data.instance.modifiers, data, 'flip');
3225 }
3226 });
3227 return data;
3228 }
3229
3230 /**
3231 * @function
3232 * @memberof Modifiers
3233 * @argument {Object} data - The data object generated by update method
3234 * @argument {Object} options - Modifiers configuration and options
3235 * @returns {Object} The data object, properly modified
3236 */
3237 function keepTogether(data) {
3238 var _data$offsets = data.offsets,
3239 popper = _data$offsets.popper,
3240 reference = _data$offsets.reference;
3241
3242 var placement = data.placement.split('-')[0];
3243 var floor = Math.floor;
3244 var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
3245 var side = isVertical ? 'right' : 'bottom';
3246 var opSide = isVertical ? 'left' : 'top';
3247 var measurement = isVertical ? 'width' : 'height';
3248
3249 if (popper[side] < floor(reference[opSide])) {
3250 data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];
3251 }
3252 if (popper[opSide] > floor(reference[side])) {
3253 data.offsets.popper[opSide] = floor(reference[side]);
3254 }
3255
3256 return data;
3257 }
3258
3259 /**
3260 * Converts a string containing value + unit into a px value number
3261 * @function
3262 * @memberof {modifiers~offset}
3263 * @private
3264 * @argument {String} str - Value + unit string
3265 * @argument {String} measurement - `height` or `width`
3266 * @argument {Object} popperOffsets
3267 * @argument {Object} referenceOffsets
3268 * @returns {Number|String}
3269 * Value in pixels, or original string if no values were extracted
3270 */
3271 function toValue(str, measurement, popperOffsets, referenceOffsets) {
3272 // separate value from unit
3273 var split = str.match(/((?:\-|\+)?\d*\.?\d*)(.*)/);
3274 var value = +split[1];
3275 var unit = split[2];
3276
3277 // If it's not a number it's an operator, I guess
3278 if (!value) {
3279 return str;
3280 }
3281
3282 if (unit.indexOf('%') === 0) {
3283 var element = void 0;
3284 switch (unit) {
3285 case '%p':
3286 element = popperOffsets;
3287 break;
3288 case '%':
3289 case '%r':
3290 default:
3291 element = referenceOffsets;
3292 }
3293
3294 var rect = getClientRect(element);
3295 return rect[measurement] / 100 * value;
3296 } else if (unit === 'vh' || unit === 'vw') {
3297 // if is a vh or vw, we calculate the size based on the viewport
3298 var size = void 0;
3299 if (unit === 'vh') {
3300 size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
3301 } else {
3302 size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
3303 }
3304 return size / 100 * value;
3305 } else {
3306 // if is an explicit pixel unit, we get rid of the unit and keep the value
3307 // if is an implicit unit, it's px, and we return just the value
3308 return value;
3309 }
3310 }
3311
3312 /**
3313 * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.
3314 * @function
3315 * @memberof {modifiers~offset}
3316 * @private
3317 * @argument {String} offset
3318 * @argument {Object} popperOffsets
3319 * @argument {Object} referenceOffsets
3320 * @argument {String} basePlacement
3321 * @returns {Array} a two cells array with x and y offsets in numbers
3322 */
3323 function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {
3324 var offsets = [0, 0];
3325
3326 // Use height if placement is left or right and index is 0 otherwise use width
3327 // in this way the first offset will use an axis and the second one
3328 // will use the other one
3329 var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;
3330
3331 // Split the offset string to obtain a list of values and operands
3332 // The regex addresses values with the plus or minus sign in front (+10, -20, etc)
3333 var fragments = offset.split(/(\+|\-)/).map(function (frag) {
3334 return frag.trim();
3335 });
3336
3337 // Detect if the offset string contains a pair of values or a single one
3338 // they could be separated by comma or space
3339 var divider = fragments.indexOf(find(fragments, function (frag) {
3340 return frag.search(/,|\s/) !== -1;
3341 }));
3342
3343 if (fragments[divider] && fragments[divider].indexOf(',') === -1) {
3344 console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');
3345 }
3346
3347 // If divider is found, we divide the list of values and operands to divide
3348 // them by ofset X and Y.
3349 var splitRegex = /\s*,\s*|\s+/;
3350 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];
3351
3352 // Convert the values with units to absolute pixels to allow our computations
3353 ops = ops.map(function (op, index) {
3354 // Most of the units rely on the orientation of the popper
3355 var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';
3356 var mergeWithPrevious = false;
3357 return op
3358 // This aggregates any `+` or `-` sign that aren't considered operators
3359 // e.g.: 10 + +5 => [10, +, +5]
3360 .reduce(function (a, b) {
3361 if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {
3362 a[a.length - 1] = b;
3363 mergeWithPrevious = true;
3364 return a;
3365 } else if (mergeWithPrevious) {
3366 a[a.length - 1] += b;
3367 mergeWithPrevious = false;
3368 return a;
3369 } else {
3370 return a.concat(b);
3371 }
3372 }, [])
3373 // Here we convert the string values into number values (in px)
3374 .map(function (str) {
3375 return toValue(str, measurement, popperOffsets, referenceOffsets);
3376 });
3377 });
3378
3379 // Loop trough the offsets arrays and execute the operations
3380 ops.forEach(function (op, index) {
3381 op.forEach(function (frag, index2) {
3382 if (isNumeric(frag)) {
3383 offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);
3384 }
3385 });
3386 });
3387 return offsets;
3388 }
3389
3390 /**
3391 * @function
3392 * @memberof Modifiers
3393 * @argument {Object} data - The data object generated by update method
3394 * @argument {Object} options - Modifiers configuration and options
3395 * @argument {Number|String} options.offset=0
3396 * The offset value as described in the modifier description
3397 * @returns {Object} The data object, properly modified
3398 */
3399 function offset(data, _ref) {
3400 var offset = _ref.offset;
3401 var placement = data.placement,
3402 _data$offsets = data.offsets,
3403 popper = _data$offsets.popper,
3404 reference = _data$offsets.reference;
3405
3406 var basePlacement = placement.split('-')[0];
3407
3408 var offsets = void 0;
3409 if (isNumeric(+offset)) {
3410 offsets = [+offset, 0];
3411 } else {
3412 offsets = parseOffset(offset, popper, reference, basePlacement);
3413 }
3414
3415 if (basePlacement === 'left') {
3416 popper.top += offsets[0];
3417 popper.left -= offsets[1];
3418 } else if (basePlacement === 'right') {
3419 popper.top += offsets[0];
3420 popper.left += offsets[1];
3421 } else if (basePlacement === 'top') {
3422 popper.left += offsets[0];
3423 popper.top -= offsets[1];
3424 } else if (basePlacement === 'bottom') {
3425 popper.left += offsets[0];
3426 popper.top += offsets[1];
3427 }
3428
3429 data.popper = popper;
3430 return data;
3431 }
3432
3433 /**
3434 * @function
3435 * @memberof Modifiers
3436 * @argument {Object} data - The data object generated by `update` method
3437 * @argument {Object} options - Modifiers configuration and options
3438 * @returns {Object} The data object, properly modified
3439 */
3440 function preventOverflow(data, options) {
3441 var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);
3442
3443 // If offsetParent is the reference element, we really want to
3444 // go one step up and use the next offsetParent as reference to
3445 // avoid to make this modifier completely useless and look like broken
3446 if (data.instance.reference === boundariesElement) {
3447 boundariesElement = getOffsetParent(boundariesElement);
3448 }
3449
3450 // NOTE: DOM access here
3451 // resets the popper's position so that the document size can be calculated excluding
3452 // the size of the popper element itself
3453 var transformProp = getSupportedPropertyName('transform');
3454 var popperStyles = data.instance.popper.style; // assignment to help minification
3455 var top = popperStyles.top,
3456 left = popperStyles.left,
3457 transform = popperStyles[transformProp];
3458
3459 popperStyles.top = '';
3460 popperStyles.left = '';
3461 popperStyles[transformProp] = '';
3462
3463 var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);
3464
3465 // NOTE: DOM access here
3466 // restores the original style properties after the offsets have been computed
3467 popperStyles.top = top;
3468 popperStyles.left = left;
3469 popperStyles[transformProp] = transform;
3470
3471 options.boundaries = boundaries;
3472
3473 var order = options.priority;
3474 var popper = data.offsets.popper;
3475
3476 var check = {
3477 primary: function primary(placement) {
3478 var value = popper[placement];
3479 if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {
3480 value = Math.max(popper[placement], boundaries[placement]);
3481 }
3482 return defineProperty({}, placement, value);
3483 },
3484 secondary: function secondary(placement) {
3485 var mainSide = placement === 'right' ? 'left' : 'top';
3486 var value = popper[mainSide];
3487 if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {
3488 value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));
3489 }
3490 return defineProperty({}, mainSide, value);
3491 }
3492 };
3493
3494 order.forEach(function (placement) {
3495 var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';
3496 popper = _extends({}, popper, check[side](placement));
3497 });
3498
3499 data.offsets.popper = popper;
3500
3501 return data;
3502 }
3503
3504 /**
3505 * @function
3506 * @memberof Modifiers
3507 * @argument {Object} data - The data object generated by `update` method
3508 * @argument {Object} options - Modifiers configuration and options
3509 * @returns {Object} The data object, properly modified
3510 */
3511 function shift(data) {
3512 var placement = data.placement;
3513 var basePlacement = placement.split('-')[0];
3514 var shiftvariation = placement.split('-')[1];
3515
3516 // if shift shiftvariation is specified, run the modifier
3517 if (shiftvariation) {
3518 var _data$offsets = data.offsets,
3519 reference = _data$offsets.reference,
3520 popper = _data$offsets.popper;
3521
3522 var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;
3523 var side = isVertical ? 'left' : 'top';
3524 var measurement = isVertical ? 'width' : 'height';
3525
3526 var shiftOffsets = {
3527 start: defineProperty({}, side, reference[side]),
3528 end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])
3529 };
3530
3531 data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);
3532 }
3533
3534 return data;
3535 }
3536
3537 /**
3538 * @function
3539 * @memberof Modifiers
3540 * @argument {Object} data - The data object generated by update method
3541 * @argument {Object} options - Modifiers configuration and options
3542 * @returns {Object} The data object, properly modified
3543 */
3544 function hide(data) {
3545 if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {
3546 return data;
3547 }
3548
3549 var refRect = data.offsets.reference;
3550 var bound = find(data.instance.modifiers, function (modifier) {
3551 return modifier.name === 'preventOverflow';
3552 }).boundaries;
3553
3554 if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {
3555 // Avoid unnecessary DOM access if visibility hasn't changed
3556 if (data.hide === true) {
3557 return data;
3558 }
3559
3560 data.hide = true;
3561 data.attributes['x-out-of-boundaries'] = '';
3562 } else {
3563 // Avoid unnecessary DOM access if visibility hasn't changed
3564 if (data.hide === false) {
3565 return data;
3566 }
3567
3568 data.hide = false;
3569 data.attributes['x-out-of-boundaries'] = false;
3570 }
3571
3572 return data;
3573 }
3574
3575 /**
3576 * @function
3577 * @memberof Modifiers
3578 * @argument {Object} data - The data object generated by `update` method
3579 * @argument {Object} options - Modifiers configuration and options
3580 * @returns {Object} The data object, properly modified
3581 */
3582 function inner(data) {
3583 var placement = data.placement;
3584 var basePlacement = placement.split('-')[0];
3585 var _data$offsets = data.offsets,
3586 popper = _data$offsets.popper,
3587 reference = _data$offsets.reference;
3588
3589 var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;
3590
3591 var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;
3592
3593 popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);
3594
3595 data.placement = getOppositePlacement(placement);
3596 data.offsets.popper = getClientRect(popper);
3597
3598 return data;
3599 }
3600
3601 /**
3602 * Modifier function, each modifier can have a function of this type assigned
3603 * to its `fn` property.<br />
3604 * These functions will be called on each update, this means that you must
3605 * make sure they are performant enough to avoid performance bottlenecks.
3606 *
3607 * @function ModifierFn
3608 * @argument {dataObject} data - The data object generated by `update` method
3609 * @argument {Object} options - Modifiers configuration and options
3610 * @returns {dataObject} The data object, properly modified
3611 */
3612
3613 /**
3614 * Modifiers are plugins used to alter the behavior of your poppers.<br />
3615 * Popper.js uses a set of 9 modifiers to provide all the basic functionalities
3616 * needed by the library.
3617 *
3618 * Usually you don't want to override the `order`, `fn` and `onLoad` props.
3619 * All the other properties are configurations that could be tweaked.
3620 * @namespace modifiers
3621 */
3622 var modifiers = {
3623 /**
3624 * Modifier used to shift the popper on the start or end of its reference
3625 * element.<br />
3626 * It will read the variation of the `placement` property.<br />
3627 * It can be one either `-end` or `-start`.
3628 * @memberof modifiers
3629 * @inner
3630 */
3631 shift: {
3632 /** @prop {number} order=100 - Index used to define the order of execution */
3633 order: 100,
3634 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
3635 enabled: true,
3636 /** @prop {ModifierFn} */
3637 fn: shift
3638 },
3639
3640 /**
3641 * The `offset` modifier can shift your popper on both its axis.
3642 *
3643 * It accepts the following units:
3644 * - `px` or unit-less, interpreted as pixels
3645 * - `%` or `%r`, percentage relative to the length of the reference element
3646 * - `%p`, percentage relative to the length of the popper element
3647 * - `vw`, CSS viewport width unit
3648 * - `vh`, CSS viewport height unit
3649 *
3650 * For length is intended the main axis relative to the placement of the popper.<br />
3651 * This means that if the placement is `top` or `bottom`, the length will be the
3652 * `width`. In case of `left` or `right`, it will be the `height`.
3653 *
3654 * You can provide a single value (as `Number` or `String`), or a pair of values
3655 * as `String` divided by a comma or one (or more) white spaces.<br />
3656 * The latter is a deprecated method because it leads to confusion and will be
3657 * removed in v2.<br />
3658 * Additionally, it accepts additions and subtractions between different units.
3659 * Note that multiplications and divisions aren't supported.
3660 *
3661 * Valid examples are:
3662 * ```
3663 * 10
3664 * '10%'
3665 * '10, 10'
3666 * '10%, 10'
3667 * '10 + 10%'
3668 * '10 - 5vh + 3%'
3669 * '-10px + 5vh, 5px - 6%'
3670 * ```
3671 * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap
3672 * > with their reference element, unfortunately, you will have to disable the `flip` modifier.
3673 * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).
3674 *
3675 * @memberof modifiers
3676 * @inner
3677 */
3678 offset: {
3679 /** @prop {number} order=200 - Index used to define the order of execution */
3680 order: 200,
3681 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
3682 enabled: true,
3683 /** @prop {ModifierFn} */
3684 fn: offset,
3685 /** @prop {Number|String} offset=0
3686 * The offset value as described in the modifier description
3687 */
3688 offset: 0
3689 },
3690
3691 /**
3692 * Modifier used to prevent the popper from being positioned outside the boundary.
3693 *
3694 * A scenario exists where the reference itself is not within the boundaries.<br />
3695 * We can say it has "escaped the boundaries" — or just "escaped".<br />
3696 * In this case we need to decide whether the popper should either:
3697 *
3698 * - detach from the reference and remain "trapped" in the boundaries, or
3699 * - if it should ignore the boundary and "escape with its reference"
3700 *
3701 * When `escapeWithReference` is set to`true` and reference is completely
3702 * outside its boundaries, the popper will overflow (or completely leave)
3703 * the boundaries in order to remain attached to the edge of the reference.
3704 *
3705 * @memberof modifiers
3706 * @inner
3707 */
3708 preventOverflow: {
3709 /** @prop {number} order=300 - Index used to define the order of execution */
3710 order: 300,
3711 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
3712 enabled: true,
3713 /** @prop {ModifierFn} */
3714 fn: preventOverflow,
3715 /**
3716 * @prop {Array} [priority=['left','right','top','bottom']]
3717 * Popper will try to prevent overflow following these priorities by default,
3718 * then, it could overflow on the left and on top of the `boundariesElement`
3719 */
3720 priority: ['left', 'right', 'top', 'bottom'],
3721 /**
3722 * @prop {number} padding=5
3723 * Amount of pixel used to define a minimum distance between the boundaries
3724 * and the popper. This makes sure the popper always has a little padding
3725 * between the edges of its container
3726 */
3727 padding: 5,
3728 /**
3729 * @prop {String|HTMLElement} boundariesElement='scrollParent'
3730 * Boundaries used by the modifier. Can be `scrollParent`, `window`,
3731 * `viewport` or any DOM element.
3732 */
3733 boundariesElement: 'scrollParent'
3734 },
3735
3736 /**
3737 * Modifier used to make sure the reference and its popper stay near each other
3738 * without leaving any gap between the two. Especially useful when the arrow is
3739 * enabled and you want to ensure that it points to its reference element.
3740 * It cares only about the first axis. You can still have poppers with margin
3741 * between the popper and its reference element.
3742 * @memberof modifiers
3743 * @inner
3744 */
3745 keepTogether: {
3746 /** @prop {number} order=400 - Index used to define the order of execution */
3747 order: 400,
3748 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
3749 enabled: true,
3750 /** @prop {ModifierFn} */
3751 fn: keepTogether
3752 },
3753
3754 /**
3755 * This modifier is used to move the `arrowElement` of the popper to make
3756 * sure it is positioned between the reference element and its popper element.
3757 * It will read the outer size of the `arrowElement` node to detect how many
3758 * pixels of conjunction are needed.
3759 *
3760 * It has no effect if no `arrowElement` is provided.
3761 * @memberof modifiers
3762 * @inner
3763 */
3764 arrow: {
3765 /** @prop {number} order=500 - Index used to define the order of execution */
3766 order: 500,
3767 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
3768 enabled: true,
3769 /** @prop {ModifierFn} */
3770 fn: arrow,
3771 /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */
3772 element: '[x-arrow]'
3773 },
3774
3775 /**
3776 * Modifier used to flip the popper's placement when it starts to overlap its
3777 * reference element.
3778 *
3779 * Requires the `preventOverflow` modifier before it in order to work.
3780 *
3781 * **NOTE:** this modifier will interrupt the current update cycle and will
3782 * restart it if it detects the need to flip the placement.
3783 * @memberof modifiers
3784 * @inner
3785 */
3786 flip: {
3787 /** @prop {number} order=600 - Index used to define the order of execution */
3788 order: 600,
3789 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
3790 enabled: true,
3791 /** @prop {ModifierFn} */
3792 fn: flip,
3793 /**
3794 * @prop {String|Array} behavior='flip'
3795 * The behavior used to change the popper's placement. It can be one of
3796 * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid
3797 * placements (with optional variations)
3798 */
3799 behavior: 'flip',
3800 /**
3801 * @prop {number} padding=5
3802 * The popper will flip if it hits the edges of the `boundariesElement`
3803 */
3804 padding: 5,
3805 /**
3806 * @prop {String|HTMLElement} boundariesElement='viewport'
3807 * The element which will define the boundaries of the popper position.
3808 * The popper will never be placed outside of the defined boundaries
3809 * (except if `keepTogether` is enabled)
3810 */
3811 boundariesElement: 'viewport',
3812 /**
3813 * @prop {Boolean} flipVariations=false
3814 * The popper will switch placement variation between `-start` and `-end` when
3815 * the reference element overlaps its boundaries.
3816 *
3817 * The original placement should have a set variation.
3818 */
3819 flipVariations: false,
3820 /**
3821 * @prop {Boolean} flipVariationsByContent=false
3822 * The popper will switch placement variation between `-start` and `-end` when
3823 * the popper element overlaps its reference boundaries.
3824 *
3825 * The original placement should have a set variation.
3826 */
3827 flipVariationsByContent: false
3828 },
3829
3830 /**
3831 * Modifier used to make the popper flow toward the inner of the reference element.
3832 * By default, when this modifier is disabled, the popper will be placed outside
3833 * the reference element.
3834 * @memberof modifiers
3835 * @inner
3836 */
3837 inner: {
3838 /** @prop {number} order=700 - Index used to define the order of execution */
3839 order: 700,
3840 /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */
3841 enabled: false,
3842 /** @prop {ModifierFn} */
3843 fn: inner
3844 },
3845
3846 /**
3847 * Modifier used to hide the popper when its reference element is outside of the
3848 * popper boundaries. It will set a `x-out-of-boundaries` attribute which can
3849 * be used to hide with a CSS selector the popper when its reference is
3850 * out of boundaries.
3851 *
3852 * Requires the `preventOverflow` modifier before it in order to work.
3853 * @memberof modifiers
3854 * @inner
3855 */
3856 hide: {
3857 /** @prop {number} order=800 - Index used to define the order of execution */
3858 order: 800,
3859 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
3860 enabled: true,
3861 /** @prop {ModifierFn} */
3862 fn: hide
3863 },
3864
3865 /**
3866 * Computes the style that will be applied to the popper element to gets
3867 * properly positioned.
3868 *
3869 * Note that this modifier will not touch the DOM, it just prepares the styles
3870 * so that `applyStyle` modifier can apply it. This separation is useful
3871 * in case you need to replace `applyStyle` with a custom implementation.
3872 *
3873 * This modifier has `850` as `order` value to maintain backward compatibility
3874 * with previous versions of Popper.js. Expect the modifiers ordering method
3875 * to change in future major versions of the library.
3876 *
3877 * @memberof modifiers
3878 * @inner
3879 */
3880 computeStyle: {
3881 /** @prop {number} order=850 - Index used to define the order of execution */
3882 order: 850,
3883 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
3884 enabled: true,
3885 /** @prop {ModifierFn} */
3886 fn: computeStyle,
3887 /**
3888 * @prop {Boolean} gpuAcceleration=true
3889 * If true, it uses the CSS 3D transformation to position the popper.
3890 * Otherwise, it will use the `top` and `left` properties
3891 */
3892 gpuAcceleration: true,
3893 /**
3894 * @prop {string} [x='bottom']
3895 * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.
3896 * Change this if your popper should grow in a direction different from `bottom`
3897 */
3898 x: 'bottom',
3899 /**
3900 * @prop {string} [x='left']
3901 * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.
3902 * Change this if your popper should grow in a direction different from `right`
3903 */
3904 y: 'right'
3905 },
3906
3907 /**
3908 * Applies the computed styles to the popper element.
3909 *
3910 * All the DOM manipulations are limited to this modifier. This is useful in case
3911 * you want to integrate Popper.js inside a framework or view library and you
3912 * want to delegate all the DOM manipulations to it.
3913 *
3914 * Note that if you disable this modifier, you must make sure the popper element
3915 * has its position set to `absolute` before Popper.js can do its work!
3916 *
3917 * Just disable this modifier and define your own to achieve the desired effect.
3918 *
3919 * @memberof modifiers
3920 * @inner
3921 */
3922 applyStyle: {
3923 /** @prop {number} order=900 - Index used to define the order of execution */
3924 order: 900,
3925 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
3926 enabled: true,
3927 /** @prop {ModifierFn} */
3928 fn: applyStyle,
3929 /** @prop {Function} */
3930 onLoad: applyStyleOnLoad,
3931 /**
3932 * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier
3933 * @prop {Boolean} gpuAcceleration=true
3934 * If true, it uses the CSS 3D transformation to position the popper.
3935 * Otherwise, it will use the `top` and `left` properties
3936 */
3937 gpuAcceleration: undefined
3938 }
3939 };
3940
3941 /**
3942 * The `dataObject` is an object containing all the information used by Popper.js.
3943 * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.
3944 * @name dataObject
3945 * @property {Object} data.instance The Popper.js instance
3946 * @property {String} data.placement Placement applied to popper
3947 * @property {String} data.originalPlacement Placement originally defined on init
3948 * @property {Boolean} data.flipped True if popper has been flipped by flip modifier
3949 * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper
3950 * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier
3951 * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)
3952 * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)
3953 * @property {Object} data.boundaries Offsets of the popper boundaries
3954 * @property {Object} data.offsets The measurements of popper, reference and arrow elements
3955 * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values
3956 * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values
3957 * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0
3958 */
3959
3960 /**
3961 * Default options provided to Popper.js constructor.<br />
3962 * These can be overridden using the `options` argument of Popper.js.<br />
3963 * To override an option, simply pass an object with the same
3964 * structure of the `options` object, as the 3rd argument. For example:
3965 * ```
3966 * new Popper(ref, pop, {
3967 * modifiers: {
3968 * preventOverflow: { enabled: false }
3969 * }
3970 * })
3971 * ```
3972 * @type {Object}
3973 * @static
3974 * @memberof Popper
3975 */
3976 var Defaults = {
3977 /**
3978 * Popper's placement.
3979 * @prop {Popper.placements} placement='bottom'
3980 */
3981 placement: 'bottom',
3982
3983 /**
3984 * Set this to true if you want popper to position it self in 'fixed' mode
3985 * @prop {Boolean} positionFixed=false
3986 */
3987 positionFixed: false,
3988
3989 /**
3990 * Whether events (resize, scroll) are initially enabled.
3991 * @prop {Boolean} eventsEnabled=true
3992 */
3993 eventsEnabled: true,
3994
3995 /**
3996 * Set to true if you want to automatically remove the popper when
3997 * you call the `destroy` method.
3998 * @prop {Boolean} removeOnDestroy=false
3999 */
4000 removeOnDestroy: false,
4001
4002 /**
4003 * Callback called when the popper is created.<br />
4004 * By default, it is set to no-op.<br />
4005 * Access Popper.js instance with `data.instance`.
4006 * @prop {onCreate}
4007 */
4008 onCreate: function onCreate() {},
4009
4010 /**
4011 * Callback called when the popper is updated. This callback is not called
4012 * on the initialization/creation of the popper, but only on subsequent
4013 * updates.<br />
4014 * By default, it is set to no-op.<br />
4015 * Access Popper.js instance with `data.instance`.
4016 * @prop {onUpdate}
4017 */
4018 onUpdate: function onUpdate() {},
4019
4020 /**
4021 * List of modifiers used to modify the offsets before they are applied to the popper.
4022 * They provide most of the functionalities of Popper.js.
4023 * @prop {modifiers}
4024 */
4025 modifiers: modifiers
4026 };
4027
4028 /**
4029 * @callback onCreate
4030 * @param {dataObject} data
4031 */
4032
4033 /**
4034 * @callback onUpdate
4035 * @param {dataObject} data
4036 */
4037
4038 // Utils
4039 // Methods
4040 var Popper = function () {
4041 /**
4042 * Creates a new Popper.js instance.
4043 * @class Popper
4044 * @param {Element|referenceObject} reference - The reference element used to position the popper
4045 * @param {Element} popper - The HTML / XML element used as the popper
4046 * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)
4047 * @return {Object} instance - The generated Popper.js instance
4048 */
4049 function Popper(reference, popper) {
4050 var _this = this;
4051
4052 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
4053 classCallCheck(this, Popper);
4054
4055 this.scheduleUpdate = function () {
4056 return requestAnimationFrame(_this.update);
4057 };
4058
4059 // make update() debounced, so that it only runs at most once-per-tick
4060 this.update = debounce(this.update.bind(this));
4061
4062 // with {} we create a new object with the options inside it
4063 this.options = _extends({}, Popper.Defaults, options);
4064
4065 // init state
4066 this.state = {
4067 isDestroyed: false,
4068 isCreated: false,
4069 scrollParents: []
4070 };
4071
4072 // get reference and popper elements (allow jQuery wrappers)
4073 this.reference = reference && reference.jquery ? reference[0] : reference;
4074 this.popper = popper && popper.jquery ? popper[0] : popper;
4075
4076 // Deep merge modifiers options
4077 this.options.modifiers = {};
4078 Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {
4079 _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});
4080 });
4081
4082 // Refactoring modifiers' list (Object => Array)
4083 this.modifiers = Object.keys(this.options.modifiers).map(function (name) {
4084 return _extends({
4085 name: name
4086 }, _this.options.modifiers[name]);
4087 })
4088 // sort the modifiers by order
4089 .sort(function (a, b) {
4090 return a.order - b.order;
4091 });
4092
4093 // modifiers have the ability to execute arbitrary code when Popper.js get inited
4094 // such code is executed in the same order of its modifier
4095 // they could add new properties to their options configuration
4096 // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!
4097 this.modifiers.forEach(function (modifierOptions) {
4098 if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {
4099 modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);
4100 }
4101 });
4102
4103 // fire the first update to position the popper in the right place
4104 this.update();
4105
4106 var eventsEnabled = this.options.eventsEnabled;
4107 if (eventsEnabled) {
4108 // setup event listeners, they will take care of update the position in specific situations
4109 this.enableEventListeners();
4110 }
4111
4112 this.state.eventsEnabled = eventsEnabled;
4113 }
4114
4115 // We can't use class properties because they don't get listed in the
4116 // class prototype and break stuff like Sinon stubs
4117
4118
4119 createClass(Popper, [{
4120 key: 'update',
4121 value: function update$$1() {
4122 return update.call(this);
4123 }
4124 }, {
4125 key: 'destroy',
4126 value: function destroy$$1() {
4127 return destroy.call(this);
4128 }
4129 }, {
4130 key: 'enableEventListeners',
4131 value: function enableEventListeners$$1() {
4132 return enableEventListeners.call(this);
4133 }
4134 }, {
4135 key: 'disableEventListeners',
4136 value: function disableEventListeners$$1() {
4137 return disableEventListeners.call(this);
4138 }
4139
4140 /**
4141 * Schedules an update. It will run on the next UI update available.
4142 * @method scheduleUpdate
4143 * @memberof Popper
4144 */
4145
4146
4147 /**
4148 * Collection of utilities useful when writing custom modifiers.
4149 * Starting from version 1.7, this method is available only if you
4150 * include `popper-utils.js` before `popper.js`.
4151 *
4152 * **DEPRECATION**: This way to access PopperUtils is deprecated
4153 * and will be removed in v2! Use the PopperUtils module directly instead.
4154 * Due to the high instability of the methods contained in Utils, we can't
4155 * guarantee them to follow semver. Use them at your own risk!
4156 * @static
4157 * @private
4158 * @type {Object}
4159 * @deprecated since version 1.8
4160 * @member Utils
4161 * @memberof Popper
4162 */
4163
4164 }]);
4165 return Popper;
4166 }();
4167
4168 /**
4169 * The `referenceObject` is an object that provides an interface compatible with Popper.js
4170 * and lets you use it as replacement of a real DOM node.<br />
4171 * You can use this method to position a popper relatively to a set of coordinates
4172 * in case you don't have a DOM node to use as reference.
4173 *
4174 * ```
4175 * new Popper(referenceObject, popperNode);
4176 * ```
4177 *
4178 * NB: This feature isn't supported in Internet Explorer 10.
4179 * @name referenceObject
4180 * @property {Function} data.getBoundingClientRect
4181 * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.
4182 * @property {number} data.clientWidth
4183 * An ES6 getter that will return the width of the virtual reference element.
4184 * @property {number} data.clientHeight
4185 * An ES6 getter that will return the height of the virtual reference element.
4186 */
4187
4188
4189 Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;
4190 Popper.placements = placements;
4191 Popper.Defaults = Defaults;
4192
4193 /**
4194 * ------------------------------------------------------------------------
4195 * Constants
4196 * ------------------------------------------------------------------------
4197 */
4198
4199 var NAME$4 = 'dropdown';
4200 var VERSION$4 = '4.4.1';
4201 var DATA_KEY$4 = 'bs.dropdown';
4202 var EVENT_KEY$4 = "." + DATA_KEY$4;
4203 var DATA_API_KEY$4 = '.data-api';
4204 var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4];
4205 var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
4206
4207 var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
4208
4209 var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
4210
4211 var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
4212
4213 var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
4214
4215 var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
4216
4217 var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
4218 var Event$4 = {
4219 HIDE: "hide" + EVENT_KEY$4,
4220 HIDDEN: "hidden" + EVENT_KEY$4,
4221 SHOW: "show" + EVENT_KEY$4,
4222 SHOWN: "shown" + EVENT_KEY$4,
4223 CLICK: "click" + EVENT_KEY$4,
4224 CLICK_DATA_API: "click" + EVENT_KEY$4 + DATA_API_KEY$4,
4225 KEYDOWN_DATA_API: "keydown" + EVENT_KEY$4 + DATA_API_KEY$4,
4226 KEYUP_DATA_API: "keyup" + EVENT_KEY$4 + DATA_API_KEY$4
4227 };
4228 var ClassName$4 = {
4229 DISABLED: 'disabled',
4230 SHOW: 'show',
4231 DROPUP: 'dropup',
4232 DROPRIGHT: 'dropright',
4233 DROPLEFT: 'dropleft',
4234 MENURIGHT: 'dropdown-menu-right',
4235 MENULEFT: 'dropdown-menu-left',
4236 POSITION_STATIC: 'position-static'
4237 };
4238 var Selector$4 = {
4239 DATA_TOGGLE: '[data-toggle="dropdown"]',
4240 FORM_CHILD: '.dropdown form',
4241 MENU: '.dropdown-menu',
4242 NAVBAR_NAV: '.navbar-nav',
4243 VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
4244 };
4245 var AttachmentMap = {
4246 TOP: 'top-start',
4247 TOPEND: 'top-end',
4248 BOTTOM: 'bottom-start',
4249 BOTTOMEND: 'bottom-end',
4250 RIGHT: 'right-start',
4251 RIGHTEND: 'right-end',
4252 LEFT: 'left-start',
4253 LEFTEND: 'left-end'
4254 };
4255 var Default$2 = {
4256 offset: 0,
4257 flip: true,
4258 boundary: 'scrollParent',
4259 reference: 'toggle',
4260 display: 'dynamic',
4261 popperConfig: null
4262 };
4263 var DefaultType$2 = {
4264 offset: '(number|string|function)',
4265 flip: 'boolean',
4266 boundary: '(string|element)',
4267 reference: '(string|element)',
4268 display: 'string',
4269 popperConfig: '(null|object)'
4270 };
4271 /**
4272 * ------------------------------------------------------------------------
4273 * Class Definition
4274 * ------------------------------------------------------------------------
4275 */
4276
4277 var Dropdown =
4278 /*#__PURE__*/
4279 function () {
4280 function Dropdown(element, config) {
4281 this._element = element;
4282 this._popper = null;
4283 this._config = this._getConfig(config);
4284 this._menu = this._getMenuElement();
4285 this._inNavbar = this._detectNavbar();
4286
4287 this._addEventListeners();
4288 } // Getters
4289
4290
4291 var _proto = Dropdown.prototype;
4292
4293 // Public
4294 _proto.toggle = function toggle() {
4295 if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) {
4296 return;
4297 }
4298
4299 var isActive = $(this._menu).hasClass(ClassName$4.SHOW);
4300
4301 Dropdown._clearMenus();
4302
4303 if (isActive) {
4304 return;
4305 }
4306
4307 this.show(true);
4308 };
4309
4310 _proto.show = function show(usePopper) {
4311 if (usePopper === void 0) {
4312 usePopper = false;
4313 }
4314
4315 if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {
4316 return;
4317 }
4318
4319 var relatedTarget = {
4320 relatedTarget: this._element
4321 };
4322 var showEvent = $.Event(Event$4.SHOW, relatedTarget);
4323
4324 var parent = Dropdown._getParentFromElement(this._element);
4325
4326 $(parent).trigger(showEvent);
4327
4328 if (showEvent.isDefaultPrevented()) {
4329 return;
4330 } // Disable totally Popper.js for Dropdown in Navbar
4331
4332
4333 if (!this._inNavbar && usePopper) {
4334 /**
4335 * Check for Popper dependency
4336 * Popper - https://popper.js.org
4337 */
4338 if (typeof Popper === 'undefined') {
4339 throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)');
4340 }
4341
4342 var referenceElement = this._element;
4343
4344 if (this._config.reference === 'parent') {
4345 referenceElement = parent;
4346 } else if (Util.isElement(this._config.reference)) {
4347 referenceElement = this._config.reference; // Check if it's jQuery element
4348
4349 if (typeof this._config.reference.jquery !== 'undefined') {
4350 referenceElement = this._config.reference[0];
4351 }
4352 } // If boundary is not `scrollParent`, then set position to `static`
4353 // to allow the menu to "escape" the scroll parent's boundaries
4354 // https://github.com/twbs/bootstrap/issues/24251
4355
4356
4357 if (this._config.boundary !== 'scrollParent') {
4358 $(parent).addClass(ClassName$4.POSITION_STATIC);
4359 }
4360
4361 this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());
4362 } // If this is a touch-enabled device we add extra
4363 // empty mouseover listeners to the body's immediate children;
4364 // only needed because of broken event delegation on iOS
4365 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
4366
4367
4368 if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) {
4369 $(document.body).children().on('mouseover', null, $.noop);
4370 }
4371
4372 this._element.focus();
4373
4374 this._element.setAttribute('aria-expanded', true);
4375
4376 $(this._menu).toggleClass(ClassName$4.SHOW);
4377 $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
4378 };
4379
4380 _proto.hide = function hide() {
4381 if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {
4382 return;
4383 }
4384
4385 var relatedTarget = {
4386 relatedTarget: this._element
4387 };
4388 var hideEvent = $.Event(Event$4.HIDE, relatedTarget);
4389
4390 var parent = Dropdown._getParentFromElement(this._element);
4391
4392 $(parent).trigger(hideEvent);
4393
4394 if (hideEvent.isDefaultPrevented()) {
4395 return;
4396 }
4397
4398 if (this._popper) {
4399 this._popper.destroy();
4400 }
4401
4402 $(this._menu).toggleClass(ClassName$4.SHOW);
4403 $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
4404 };
4405
4406 _proto.dispose = function dispose() {
4407 $.removeData(this._element, DATA_KEY$4);
4408 $(this._element).off(EVENT_KEY$4);
4409 this._element = null;
4410 this._menu = null;
4411
4412 if (this._popper !== null) {
4413 this._popper.destroy();
4414
4415 this._popper = null;
4416 }
4417 };
4418
4419 _proto.update = function update() {
4420 this._inNavbar = this._detectNavbar();
4421
4422 if (this._popper !== null) {
4423 this._popper.scheduleUpdate();
4424 }
4425 } // Private
4426 ;
4427
4428 _proto._addEventListeners = function _addEventListeners() {
4429 var _this = this;
4430
4431 $(this._element).on(Event$4.CLICK, function (event) {
4432 event.preventDefault();
4433 event.stopPropagation();
4434
4435 _this.toggle();
4436 });
4437 };
4438
4439 _proto._getConfig = function _getConfig(config) {
4440 config = _objectSpread2({}, this.constructor.Default, {}, $(this._element).data(), {}, config);
4441 Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
4442 return config;
4443 };
4444
4445 _proto._getMenuElement = function _getMenuElement() {
4446 if (!this._menu) {
4447 var parent = Dropdown._getParentFromElement(this._element);
4448
4449 if (parent) {
4450 this._menu = parent.querySelector(Selector$4.MENU);
4451 }
4452 }
4453
4454 return this._menu;
4455 };
4456
4457 _proto._getPlacement = function _getPlacement() {
4458 var $parentDropdown = $(this._element.parentNode);
4459 var placement = AttachmentMap.BOTTOM; // Handle dropup
4460
4461 if ($parentDropdown.hasClass(ClassName$4.DROPUP)) {
4462 placement = AttachmentMap.TOP;
4463
4464 if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {
4465 placement = AttachmentMap.TOPEND;
4466 }
4467 } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) {
4468 placement = AttachmentMap.RIGHT;
4469 } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) {
4470 placement = AttachmentMap.LEFT;
4471 } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {
4472 placement = AttachmentMap.BOTTOMEND;
4473 }
4474
4475 return placement;
4476 };
4477
4478 _proto._detectNavbar = function _detectNavbar() {
4479 return $(this._element).closest('.navbar').length > 0;
4480 };
4481
4482 _proto._getOffset = function _getOffset() {
4483 var _this2 = this;
4484
4485 var offset = {};
4486
4487 if (typeof this._config.offset === 'function') {
4488 offset.fn = function (data) {
4489 data.offsets = _objectSpread2({}, data.offsets, {}, _this2._config.offset(data.offsets, _this2._element) || {});
4490 return data;
4491 };
4492 } else {
4493 offset.offset = this._config.offset;
4494 }
4495
4496 return offset;
4497 };
4498
4499 _proto._getPopperConfig = function _getPopperConfig() {
4500 var popperConfig = {
4501 placement: this._getPlacement(),
4502 modifiers: {
4503 offset: this._getOffset(),
4504 flip: {
4505 enabled: this._config.flip
4506 },
4507 preventOverflow: {
4508 boundariesElement: this._config.boundary
4509 }
4510 }
4511 }; // Disable Popper.js if we have a static display
4512
4513 if (this._config.display === 'static') {
4514 popperConfig.modifiers.applyStyle = {
4515 enabled: false
4516 };
4517 }
4518
4519 return _objectSpread2({}, popperConfig, {}, this._config.popperConfig);
4520 } // Static
4521 ;
4522
4523 Dropdown._jQueryInterface = function _jQueryInterface(config) {
4524 return this.each(function () {
4525 var data = $(this).data(DATA_KEY$4);
4526
4527 var _config = typeof config === 'object' ? config : null;
4528
4529 if (!data) {
4530 data = new Dropdown(this, _config);
4531 $(this).data(DATA_KEY$4, data);
4532 }
4533
4534 if (typeof config === 'string') {
4535 if (typeof data[config] === 'undefined') {
4536 throw new TypeError("No method named \"" + config + "\"");
4537 }
4538
4539 data[config]();
4540 }
4541 });
4542 };
4543
4544 Dropdown._clearMenus = function _clearMenus(event) {
4545 if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
4546 return;
4547 }
4548
4549 var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE));
4550
4551 for (var i = 0, len = toggles.length; i < len; i++) {
4552 var parent = Dropdown._getParentFromElement(toggles[i]);
4553
4554 var context = $(toggles[i]).data(DATA_KEY$4);
4555 var relatedTarget = {
4556 relatedTarget: toggles[i]
4557 };
4558
4559 if (event && event.type === 'click') {
4560 relatedTarget.clickEvent = event;
4561 }
4562
4563 if (!context) {
4564 continue;
4565 }
4566
4567 var dropdownMenu = context._menu;
4568
4569 if (!$(parent).hasClass(ClassName$4.SHOW)) {
4570 continue;
4571 }
4572
4573 if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {
4574 continue;
4575 }
4576
4577 var hideEvent = $.Event(Event$4.HIDE, relatedTarget);
4578 $(parent).trigger(hideEvent);
4579
4580 if (hideEvent.isDefaultPrevented()) {
4581 continue;
4582 } // If this is a touch-enabled device we remove the extra
4583 // empty mouseover listeners we added for iOS support
4584
4585
4586 if ('ontouchstart' in document.documentElement) {
4587 $(document.body).children().off('mouseover', null, $.noop);
4588 }
4589
4590 toggles[i].setAttribute('aria-expanded', 'false');
4591
4592 if (context._popper) {
4593 context._popper.destroy();
4594 }
4595
4596 $(dropdownMenu).removeClass(ClassName$4.SHOW);
4597 $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
4598 }
4599 };
4600
4601 Dropdown._getParentFromElement = function _getParentFromElement(element) {
4602 var parent;
4603 var selector = Util.getSelectorFromElement(element);
4604
4605 if (selector) {
4606 parent = document.querySelector(selector);
4607 }
4608
4609 return parent || element.parentNode;
4610 } // eslint-disable-next-line complexity
4611 ;
4612
4613 Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
4614 // If not input/textarea:
4615 // - And not a key in REGEXP_KEYDOWN => not a dropdown command
4616 // If input/textarea:
4617 // - If space key => not a dropdown command
4618 // - If key is other than escape
4619 // - If key is not up or down => not a dropdown command
4620 // - If trigger inside the menu => not a dropdown command
4621 if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
4622 return;
4623 }
4624
4625 event.preventDefault();
4626 event.stopPropagation();
4627
4628 if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) {
4629 return;
4630 }
4631
4632 var parent = Dropdown._getParentFromElement(this);
4633
4634 var isActive = $(parent).hasClass(ClassName$4.SHOW);
4635
4636 if (!isActive && event.which === ESCAPE_KEYCODE) {
4637 return;
4638 }
4639
4640 if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
4641 if (event.which === ESCAPE_KEYCODE) {
4642 var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);
4643 $(toggle).trigger('focus');
4644 }
4645
4646 $(this).trigger('click');
4647 return;
4648 }
4649
4650 var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS)).filter(function (item) {
4651 return $(item).is(':visible');
4652 });
4653
4654 if (items.length === 0) {
4655 return;
4656 }
4657
4658 var index = items.indexOf(event.target);
4659
4660 if (event.which === ARROW_UP_KEYCODE && index > 0) {
4661 // Up
4662 index--;
4663 }
4664
4665 if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
4666 // Down
4667 index++;
4668 }
4669
4670 if (index < 0) {
4671 index = 0;
4672 }
4673
4674 items[index].focus();
4675 };
4676
4677 _createClass(Dropdown, null, [{
4678 key: "VERSION",
4679 get: function get() {
4680 return VERSION$4;
4681 }
4682 }, {
4683 key: "Default",
4684 get: function get() {
4685 return Default$2;
4686 }
4687 }, {
4688 key: "DefaultType",
4689 get: function get() {
4690 return DefaultType$2;
4691 }
4692 }]);
4693
4694 return Dropdown;
4695 }();
4696 /**
4697 * ------------------------------------------------------------------------
4698 * Data Api implementation
4699 * ------------------------------------------------------------------------
4700 */
4701
4702
4703 $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + " " + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) {
4704 event.preventDefault();
4705 event.stopPropagation();
4706
4707 Dropdown._jQueryInterface.call($(this), 'toggle');
4708 }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) {
4709 e.stopPropagation();
4710 });
4711 /**
4712 * ------------------------------------------------------------------------
4713 * jQuery
4714 * ------------------------------------------------------------------------
4715 */
4716
4717 $.fn[NAME$4] = Dropdown._jQueryInterface;
4718 $.fn[NAME$4].Constructor = Dropdown;
4719
4720 $.fn[NAME$4].noConflict = function () {
4721 $.fn[NAME$4] = JQUERY_NO_CONFLICT$4;
4722 return Dropdown._jQueryInterface;
4723 };
4724
4725 /**
4726 * ------------------------------------------------------------------------
4727 * Constants
4728 * ------------------------------------------------------------------------
4729 */
4730
4731 var NAME$5 = 'modal';
4732 var VERSION$5 = '4.4.1';
4733 var DATA_KEY$5 = 'bs.modal';
4734 var EVENT_KEY$5 = "." + DATA_KEY$5;
4735 var DATA_API_KEY$5 = '.data-api';
4736 var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5];
4737 var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key
4738
4739 var Default$3 = {
4740 backdrop: true,
4741 keyboard: true,
4742 focus: true,
4743 show: true
4744 };
4745 var DefaultType$3 = {
4746 backdrop: '(boolean|string)',
4747 keyboard: 'boolean',
4748 focus: 'boolean',
4749 show: 'boolean'
4750 };
4751 var Event$5 = {
4752 HIDE: "hide" + EVENT_KEY$5,
4753 HIDE_PREVENTED: "hidePrevented" + EVENT_KEY$5,
4754 HIDDEN: "hidden" + EVENT_KEY$5,
4755 SHOW: "show" + EVENT_KEY$5,
4756 SHOWN: "shown" + EVENT_KEY$5,
4757 FOCUSIN: "focusin" + EVENT_KEY$5,
4758 RESIZE: "resize" + EVENT_KEY$5,
4759 CLICK_DISMISS: "click.dismiss" + EVENT_KEY$5,
4760 KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY$5,
4761 MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY$5,
4762 MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY$5,
4763 CLICK_DATA_API: "click" + EVENT_KEY$5 + DATA_API_KEY$5
4764 };
4765 var ClassName$5 = {
4766 SCROLLABLE: 'modal-dialog-scrollable',
4767 SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
4768 BACKDROP: 'modal-backdrop',
4769 OPEN: 'modal-open',
4770 FADE: 'fade',
4771 SHOW: 'show',
4772 STATIC: 'modal-static'
4773 };
4774 var Selector$5 = {
4775 DIALOG: '.modal-dialog',
4776 MODAL_BODY: '.modal-body',
4777 DATA_TOGGLE: '[data-toggle="modal"]',
4778 DATA_DISMISS: '[data-dismiss="modal"]',
4779 FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
4780 STICKY_CONTENT: '.sticky-top'
4781 };
4782 /**
4783 * ------------------------------------------------------------------------
4784 * Class Definition
4785 * ------------------------------------------------------------------------
4786 */
4787
4788 var Modal =
4789 /*#__PURE__*/
4790 function () {
4791 function Modal(element, config) {
4792 this._config = this._getConfig(config);
4793 this._element = element;
4794 this._dialog = element.querySelector(Selector$5.DIALOG);
4795 this._backdrop = null;
4796 this._isShown = false;
4797 this._isBodyOverflowing = false;
4798 this._ignoreBackdropClick = false;
4799 this._isTransitioning = false;
4800 this._scrollbarWidth = 0;
4801 } // Getters
4802
4803
4804 var _proto = Modal.prototype;
4805
4806 // Public
4807 _proto.toggle = function toggle(relatedTarget) {
4808 return this._isShown ? this.hide() : this.show(relatedTarget);
4809 };
4810
4811 _proto.show = function show(relatedTarget) {
4812 var _this = this;
4813
4814 if (this._isShown || this._isTransitioning) {
4815 return;
4816 }
4817
4818 if ($(this._element).hasClass(ClassName$5.FADE)) {
4819 this._isTransitioning = true;
4820 }
4821
4822 var showEvent = $.Event(Event$5.SHOW, {
4823 relatedTarget: relatedTarget
4824 });
4825 $(this._element).trigger(showEvent);
4826
4827 if (this._isShown || showEvent.isDefaultPrevented()) {
4828 return;
4829 }
4830
4831 this._isShown = true;
4832
4833 this._checkScrollbar();
4834
4835 this._setScrollbar();
4836
4837 this._adjustDialog();
4838
4839 this._setEscapeEvent();
4840
4841 this._setResizeEvent();
4842
4843 $(this._element).on(Event$5.CLICK_DISMISS, Selector$5.DATA_DISMISS, function (event) {
4844 return _this.hide(event);
4845 });
4846 $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () {
4847 $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) {
4848 if ($(event.target).is(_this._element)) {
4849 _this._ignoreBackdropClick = true;
4850 }
4851 });
4852 });
4853
4854 this._showBackdrop(function () {
4855 return _this._showElement(relatedTarget);
4856 });
4857 };
4858
4859 _proto.hide = function hide(event) {
4860 var _this2 = this;
4861
4862 if (event) {
4863 event.preventDefault();
4864 }
4865
4866 if (!this._isShown || this._isTransitioning) {
4867 return;
4868 }
4869
4870 var hideEvent = $.Event(Event$5.HIDE);
4871 $(this._element).trigger(hideEvent);
4872
4873 if (!this._isShown || hideEvent.isDefaultPrevented()) {
4874 return;
4875 }
4876
4877 this._isShown = false;
4878 var transition = $(this._element).hasClass(ClassName$5.FADE);
4879
4880 if (transition) {
4881 this._isTransitioning = true;
4882 }
4883
4884 this._setEscapeEvent();
4885
4886 this._setResizeEvent();
4887
4888 $(document).off(Event$5.FOCUSIN);
4889 $(this._element).removeClass(ClassName$5.SHOW);
4890 $(this._element).off(Event$5.CLICK_DISMISS);
4891 $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS);
4892
4893 if (transition) {
4894 var transitionDuration = Util.getTransitionDurationFromElement(this._element);
4895 $(this._element).one(Util.TRANSITION_END, function (event) {
4896 return _this2._hideModal(event);
4897 }).emulateTransitionEnd(transitionDuration);
4898 } else {
4899 this._hideModal();
4900 }
4901 };
4902
4903 _proto.dispose = function dispose() {
4904 [window, this._element, this._dialog].forEach(function (htmlElement) {
4905 return $(htmlElement).off(EVENT_KEY$5);
4906 });
4907 /**
4908 * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`
4909 * Do not move `document` in `htmlElements` array
4910 * It will remove `Event.CLICK_DATA_API` event that should remain
4911 */
4912
4913 $(document).off(Event$5.FOCUSIN);
4914 $.removeData(this._element, DATA_KEY$5);
4915 this._config = null;
4916 this._element = null;
4917 this._dialog = null;
4918 this._backdrop = null;
4919 this._isShown = null;
4920 this._isBodyOverflowing = null;
4921 this._ignoreBackdropClick = null;
4922 this._isTransitioning = null;
4923 this._scrollbarWidth = null;
4924 };
4925
4926 _proto.handleUpdate = function handleUpdate() {
4927 this._adjustDialog();
4928 } // Private
4929 ;
4930
4931 _proto._getConfig = function _getConfig(config) {
4932 config = _objectSpread2({}, Default$3, {}, config);
4933 Util.typeCheckConfig(NAME$5, config, DefaultType$3);
4934 return config;
4935 };
4936
4937 _proto._triggerBackdropTransition = function _triggerBackdropTransition() {
4938 var _this3 = this;
4939
4940 if (this._config.backdrop === 'static') {
4941 var hideEventPrevented = $.Event(Event$5.HIDE_PREVENTED);
4942 $(this._element).trigger(hideEventPrevented);
4943
4944 if (hideEventPrevented.defaultPrevented) {
4945 return;
4946 }
4947
4948 this._element.classList.add(ClassName$5.STATIC);
4949
4950 var modalTransitionDuration = Util.getTransitionDurationFromElement(this._element);
4951 $(this._element).one(Util.TRANSITION_END, function () {
4952 _this3._element.classList.remove(ClassName$5.STATIC);
4953 }).emulateTransitionEnd(modalTransitionDuration);
4954
4955 this._element.focus();
4956 } else {
4957 this.hide();
4958 }
4959 };
4960
4961 _proto._showElement = function _showElement(relatedTarget) {
4962 var _this4 = this;
4963
4964 var transition = $(this._element).hasClass(ClassName$5.FADE);
4965 var modalBody = this._dialog ? this._dialog.querySelector(Selector$5.MODAL_BODY) : null;
4966
4967 if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
4968 // Don't move modal's DOM position
4969 document.body.appendChild(this._element);
4970 }
4971
4972 this._element.style.display = 'block';
4973
4974 this._element.removeAttribute('aria-hidden');
4975
4976 this._element.setAttribute('aria-modal', true);
4977
4978 if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE) && modalBody) {
4979 modalBody.scrollTop = 0;
4980 } else {
4981 this._element.scrollTop = 0;
4982 }
4983
4984 if (transition) {
4985 Util.reflow(this._element);
4986 }
4987
4988 $(this._element).addClass(ClassName$5.SHOW);
4989
4990 if (this._config.focus) {
4991 this._enforceFocus();
4992 }
4993
4994 var shownEvent = $.Event(Event$5.SHOWN, {
4995 relatedTarget: relatedTarget
4996 });
4997
4998 var transitionComplete = function transitionComplete() {
4999 if (_this4._config.focus) {
5000 _this4._element.focus();
5001 }
5002
5003 _this4._isTransitioning = false;
5004 $(_this4._element).trigger(shownEvent);
5005 };
5006
5007 if (transition) {
5008 var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);
5009 $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
5010 } else {
5011 transitionComplete();
5012 }
5013 };
5014
5015 _proto._enforceFocus = function _enforceFocus() {
5016 var _this5 = this;
5017
5018 $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop
5019 .on(Event$5.FOCUSIN, function (event) {
5020 if (document !== event.target && _this5._element !== event.target && $(_this5._element).has(event.target).length === 0) {
5021 _this5._element.focus();
5022 }
5023 });
5024 };
5025
5026 _proto._setEscapeEvent = function _setEscapeEvent() {
5027 var _this6 = this;
5028
5029 if (this._isShown && this._config.keyboard) {
5030 $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {
5031 if (event.which === ESCAPE_KEYCODE$1) {
5032 _this6._triggerBackdropTransition();
5033 }
5034 });
5035 } else if (!this._isShown) {
5036 $(this._element).off(Event$5.KEYDOWN_DISMISS);
5037 }
5038 };
5039
5040 _proto._setResizeEvent = function _setResizeEvent() {
5041 var _this7 = this;
5042
5043 if (this._isShown) {
5044 $(window).on(Event$5.RESIZE, function (event) {
5045 return _this7.handleUpdate(event);
5046 });
5047 } else {
5048 $(window).off(Event$5.RESIZE);
5049 }
5050 };
5051
5052 _proto._hideModal = function _hideModal() {
5053 var _this8 = this;
5054
5055 this._element.style.display = 'none';
5056
5057 this._element.setAttribute('aria-hidden', true);
5058
5059 this._element.removeAttribute('aria-modal');
5060
5061 this._isTransitioning = false;
5062
5063 this._showBackdrop(function () {
5064 $(document.body).removeClass(ClassName$5.OPEN);
5065
5066 _this8._resetAdjustments();
5067
5068 _this8._resetScrollbar();
5069
5070 $(_this8._element).trigger(Event$5.HIDDEN);
5071 });
5072 };
5073
5074 _proto._removeBackdrop = function _removeBackdrop() {
5075 if (this._backdrop) {
5076 $(this._backdrop).remove();
5077 this._backdrop = null;
5078 }
5079 };
5080
5081 _proto._showBackdrop = function _showBackdrop(callback) {
5082 var _this9 = this;
5083
5084 var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';
5085
5086 if (this._isShown && this._config.backdrop) {
5087 this._backdrop = document.createElement('div');
5088 this._backdrop.className = ClassName$5.BACKDROP;
5089
5090 if (animate) {
5091 this._backdrop.classList.add(animate);
5092 }
5093
5094 $(this._backdrop).appendTo(document.body);
5095 $(this._element).on(Event$5.CLICK_DISMISS, function (event) {
5096 if (_this9._ignoreBackdropClick) {
5097 _this9._ignoreBackdropClick = false;
5098 return;
5099 }
5100
5101 if (event.target !== event.currentTarget) {
5102 return;
5103 }
5104
5105 _this9._triggerBackdropTransition();
5106 });
5107
5108 if (animate) {
5109 Util.reflow(this._backdrop);
5110 }
5111
5112 $(this._backdrop).addClass(ClassName$5.SHOW);
5113
5114 if (!callback) {
5115 return;
5116 }
5117
5118 if (!animate) {
5119 callback();
5120 return;
5121 }
5122
5123 var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
5124 $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);
5125 } else if (!this._isShown && this._backdrop) {
5126 $(this._backdrop).removeClass(ClassName$5.SHOW);
5127
5128 var callbackRemove = function callbackRemove() {
5129 _this9._removeBackdrop();
5130
5131 if (callback) {
5132 callback();
5133 }
5134 };
5135
5136 if ($(this._element).hasClass(ClassName$5.FADE)) {
5137 var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
5138
5139 $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
5140 } else {
5141 callbackRemove();
5142 }
5143 } else if (callback) {
5144 callback();
5145 }
5146 } // ----------------------------------------------------------------------
5147 // the following methods are used to handle overflowing modals
5148 // todo (fat): these should probably be refactored out of modal.js
5149 // ----------------------------------------------------------------------
5150 ;
5151
5152 _proto._adjustDialog = function _adjustDialog() {
5153 var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
5154
5155 if (!this._isBodyOverflowing && isModalOverflowing) {
5156 this._element.style.paddingLeft = this._scrollbarWidth + "px";
5157 }
5158
5159 if (this._isBodyOverflowing && !isModalOverflowing) {
5160 this._element.style.paddingRight = this._scrollbarWidth + "px";
5161 }
5162 };
5163
5164 _proto._resetAdjustments = function _resetAdjustments() {
5165 this._element.style.paddingLeft = '';
5166 this._element.style.paddingRight = '';
5167 };
5168
5169 _proto._checkScrollbar = function _checkScrollbar() {
5170 var rect = document.body.getBoundingClientRect();
5171 this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;
5172 this._scrollbarWidth = this._getScrollbarWidth();
5173 };
5174
5175 _proto._setScrollbar = function _setScrollbar() {
5176 var _this10 = this;
5177
5178 if (this._isBodyOverflowing) {
5179 // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
5180 // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
5181 var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));
5182 var stickyContent = [].slice.call(document.querySelectorAll(Selector$5.STICKY_CONTENT)); // Adjust fixed content padding
5183
5184 $(fixedContent).each(function (index, element) {
5185 var actualPadding = element.style.paddingRight;
5186 var calculatedPadding = $(element).css('padding-right');
5187 $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px");
5188 }); // Adjust sticky content margin
5189
5190 $(stickyContent).each(function (index, element) {
5191 var actualMargin = element.style.marginRight;
5192 var calculatedMargin = $(element).css('margin-right');
5193 $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px");
5194 }); // Adjust body padding
5195
5196 var actualPadding = document.body.style.paddingRight;
5197 var calculatedPadding = $(document.body).css('padding-right');
5198 $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
5199 }
5200
5201 $(document.body).addClass(ClassName$5.OPEN);
5202 };
5203
5204 _proto._resetScrollbar = function _resetScrollbar() {
5205 // Restore fixed content padding
5206 var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));
5207 $(fixedContent).each(function (index, element) {
5208 var padding = $(element).data('padding-right');
5209 $(element).removeData('padding-right');
5210 element.style.paddingRight = padding ? padding : '';
5211 }); // Restore sticky content
5212
5213 var elements = [].slice.call(document.querySelectorAll("" + Selector$5.STICKY_CONTENT));
5214 $(elements).each(function (index, element) {
5215 var margin = $(element).data('margin-right');
5216
5217 if (typeof margin !== 'undefined') {
5218 $(element).css('margin-right', margin).removeData('margin-right');
5219 }
5220 }); // Restore body padding
5221
5222 var padding = $(document.body).data('padding-right');
5223 $(document.body).removeData('padding-right');
5224 document.body.style.paddingRight = padding ? padding : '';
5225 };
5226
5227 _proto._getScrollbarWidth = function _getScrollbarWidth() {
5228 // thx d.walsh
5229 var scrollDiv = document.createElement('div');
5230 scrollDiv.className = ClassName$5.SCROLLBAR_MEASURER;
5231 document.body.appendChild(scrollDiv);
5232 var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
5233 document.body.removeChild(scrollDiv);
5234 return scrollbarWidth;
5235 } // Static
5236 ;
5237
5238 Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
5239 return this.each(function () {
5240 var data = $(this).data(DATA_KEY$5);
5241
5242 var _config = _objectSpread2({}, Default$3, {}, $(this).data(), {}, typeof config === 'object' && config ? config : {});
5243
5244 if (!data) {
5245 data = new Modal(this, _config);
5246 $(this).data(DATA_KEY$5, data);
5247 }
5248
5249 if (typeof config === 'string') {
5250 if (typeof data[config] === 'undefined') {
5251 throw new TypeError("No method named \"" + config + "\"");
5252 }
5253
5254 data[config](relatedTarget);
5255 } else if (_config.show) {
5256 data.show(relatedTarget);
5257 }
5258 });
5259 };
5260
5261 _createClass(Modal, null, [{
5262 key: "VERSION",
5263 get: function get() {
5264 return VERSION$5;
5265 }
5266 }, {
5267 key: "Default",
5268 get: function get() {
5269 return Default$3;
5270 }
5271 }]);
5272
5273 return Modal;
5274 }();
5275 /**
5276 * ------------------------------------------------------------------------
5277 * Data Api implementation
5278 * ------------------------------------------------------------------------
5279 */
5280
5281
5282 $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {
5283 var _this11 = this;
5284
5285 var target;
5286 var selector = Util.getSelectorFromElement(this);
5287
5288 if (selector) {
5289 target = document.querySelector(selector);
5290 }
5291
5292 var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread2({}, $(target).data(), {}, $(this).data());
5293
5294 if (this.tagName === 'A' || this.tagName === 'AREA') {
5295 event.preventDefault();
5296 }
5297
5298 var $target = $(target).one(Event$5.SHOW, function (showEvent) {
5299 if (showEvent.isDefaultPrevented()) {
5300 // Only register focus restorer if modal will actually get shown
5301 return;
5302 }
5303
5304 $target.one(Event$5.HIDDEN, function () {
5305 if ($(_this11).is(':visible')) {
5306 _this11.focus();
5307 }
5308 });
5309 });
5310
5311 Modal._jQueryInterface.call($(target), config, this);
5312 });
5313 /**
5314 * ------------------------------------------------------------------------
5315 * jQuery
5316 * ------------------------------------------------------------------------
5317 */
5318
5319 $.fn[NAME$5] = Modal._jQueryInterface;
5320 $.fn[NAME$5].Constructor = Modal;
5321
5322 $.fn[NAME$5].noConflict = function () {
5323 $.fn[NAME$5] = JQUERY_NO_CONFLICT$5;
5324 return Modal._jQueryInterface;
5325 };
5326
5327 /**
5328 * --------------------------------------------------------------------------
5329 * Bootstrap (v4.4.1): tools/sanitizer.js
5330 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5331 * --------------------------------------------------------------------------
5332 */
5333 var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];
5334 var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
5335 var DefaultWhitelist = {
5336 // Global attributes allowed on any supplied element below.
5337 '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
5338 a: ['target', 'href', 'title', 'rel'],
5339 area: [],
5340 b: [],
5341 br: [],
5342 col: [],
5343 code: [],
5344 div: [],
5345 em: [],
5346 hr: [],
5347 h1: [],
5348 h2: [],
5349 h3: [],
5350 h4: [],
5351 h5: [],
5352 h6: [],
5353 i: [],
5354 img: ['src', 'alt', 'title', 'width', 'height'],
5355 li: [],
5356 ol: [],
5357 p: [],
5358 pre: [],
5359 s: [],
5360 small: [],
5361 span: [],
5362 sub: [],
5363 sup: [],
5364 strong: [],
5365 u: [],
5366 ul: []
5367 };
5368 /**
5369 * A pattern that recognizes a commonly useful subset of URLs that are safe.
5370 *
5371 * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
5372 */
5373
5374 var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
5375 /**
5376 * A pattern that matches safe data URLs. Only matches image, video and audio types.
5377 *
5378 * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
5379 */
5380
5381 var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;
5382
5383 function allowedAttribute(attr, allowedAttributeList) {
5384 var attrName = attr.nodeName.toLowerCase();
5385
5386 if (allowedAttributeList.indexOf(attrName) !== -1) {
5387 if (uriAttrs.indexOf(attrName) !== -1) {
5388 return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));
5389 }
5390
5391 return true;
5392 }
5393
5394 var regExp = allowedAttributeList.filter(function (attrRegex) {
5395 return attrRegex instanceof RegExp;
5396 }); // Check if a regular expression validates the attribute.
5397
5398 for (var i = 0, l = regExp.length; i < l; i++) {
5399 if (attrName.match(regExp[i])) {
5400 return true;
5401 }
5402 }
5403
5404 return false;
5405 }
5406
5407 function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
5408 if (unsafeHtml.length === 0) {
5409 return unsafeHtml;
5410 }
5411
5412 if (sanitizeFn && typeof sanitizeFn === 'function') {
5413 return sanitizeFn(unsafeHtml);
5414 }
5415
5416 var domParser = new window.DOMParser();
5417 var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
5418 var whitelistKeys = Object.keys(whiteList);
5419 var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));
5420
5421 var _loop = function _loop(i, len) {
5422 var el = elements[i];
5423 var elName = el.nodeName.toLowerCase();
5424
5425 if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {
5426 el.parentNode.removeChild(el);
5427 return "continue";
5428 }
5429
5430 var attributeList = [].slice.call(el.attributes);
5431 var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);
5432 attributeList.forEach(function (attr) {
5433 if (!allowedAttribute(attr, whitelistedAttributes)) {
5434 el.removeAttribute(attr.nodeName);
5435 }
5436 });
5437 };
5438
5439 for (var i = 0, len = elements.length; i < len; i++) {
5440 var _ret = _loop(i);
5441
5442 if (_ret === "continue") continue;
5443 }
5444
5445 return createdDocument.body.innerHTML;
5446 }
5447
5448 /**
5449 * ------------------------------------------------------------------------
5450 * Constants
5451 * ------------------------------------------------------------------------
5452 */
5453
5454 var NAME$6 = 'tooltip';
5455 var VERSION$6 = '4.4.1';
5456 var DATA_KEY$6 = 'bs.tooltip';
5457 var EVENT_KEY$6 = "." + DATA_KEY$6;
5458 var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];
5459 var CLASS_PREFIX = 'bs-tooltip';
5460 var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
5461 var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];
5462 var DefaultType$4 = {
5463 animation: 'boolean',
5464 template: 'string',
5465 title: '(string|element|function)',
5466 trigger: 'string',
5467 delay: '(number|object)',
5468 html: 'boolean',
5469 selector: '(string|boolean)',
5470 placement: '(string|function)',
5471 offset: '(number|string|function)',
5472 container: '(string|element|boolean)',
5473 fallbackPlacement: '(string|array)',
5474 boundary: '(string|element)',
5475 sanitize: 'boolean',
5476 sanitizeFn: '(null|function)',
5477 whiteList: 'object',
5478 popperConfig: '(null|object)'
5479 };
5480 var AttachmentMap$1 = {
5481 AUTO: 'auto',
5482 TOP: 'top',
5483 RIGHT: 'right',
5484 BOTTOM: 'bottom',
5485 LEFT: 'left'
5486 };
5487 var Default$4 = {
5488 animation: true,
5489 template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div></div>',
5490 trigger: 'hover focus',
5491 title: '',
5492 delay: 0,
5493 html: false,
5494 selector: false,
5495 placement: 'top',
5496 offset: 0,
5497 container: false,
5498 fallbackPlacement: 'flip',
5499 boundary: 'scrollParent',
5500 sanitize: true,
5501 sanitizeFn: null,
5502 whiteList: DefaultWhitelist,
5503 popperConfig: null
5504 };
5505 var HoverState = {
5506 SHOW: 'show',
5507 OUT: 'out'
5508 };
5509 var Event$6 = {
5510 HIDE: "hide" + EVENT_KEY$6,
5511 HIDDEN: "hidden" + EVENT_KEY$6,
5512 SHOW: "show" + EVENT_KEY$6,
5513 SHOWN: "shown" + EVENT_KEY$6,
5514 INSERTED: "inserted" + EVENT_KEY$6,
5515 CLICK: "click" + EVENT_KEY$6,
5516 FOCUSIN: "focusin" + EVENT_KEY$6,
5517 FOCUSOUT: "focusout" + EVENT_KEY$6,
5518 MOUSEENTER: "mouseenter" + EVENT_KEY$6,
5519 MOUSELEAVE: "mouseleave" + EVENT_KEY$6
5520 };
5521 var ClassName$6 = {
5522 FADE: 'fade',
5523 SHOW: 'show'
5524 };
5525 var Selector$6 = {
5526 TOOLTIP: '.tooltip',
5527 TOOLTIP_INNER: '.tooltip-inner',
5528 ARROW: '.arrow'
5529 };
5530 var Trigger = {
5531 HOVER: 'hover',
5532 FOCUS: 'focus',
5533 CLICK: 'click',
5534 MANUAL: 'manual'
5535 };
5536 /**
5537 * ------------------------------------------------------------------------
5538 * Class Definition
5539 * ------------------------------------------------------------------------
5540 */
5541
5542 var Tooltip =
5543 /*#__PURE__*/
5544 function () {
5545 function Tooltip(element, config) {
5546 if (typeof Popper === 'undefined') {
5547 throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
5548 } // private
5549
5550
5551 this._isEnabled = true;
5552 this._timeout = 0;
5553 this._hoverState = '';
5554 this._activeTrigger = {};
5555 this._popper = null; // Protected
5556
5557 this.element = element;
5558 this.config = this._getConfig(config);
5559 this.tip = null;
5560
5561 this._setListeners();
5562 } // Getters
5563
5564
5565 var _proto = Tooltip.prototype;
5566
5567 // Public
5568 _proto.enable = function enable() {
5569 this._isEnabled = true;
5570 };
5571
5572 _proto.disable = function disable() {
5573 this._isEnabled = false;
5574 };
5575
5576 _proto.toggleEnabled = function toggleEnabled() {
5577 this._isEnabled = !this._isEnabled;
5578 };
5579
5580 _proto.toggle = function toggle(event) {
5581 if (!this._isEnabled) {
5582 return;
5583 }
5584
5585 if (event) {
5586 var dataKey = this.constructor.DATA_KEY;
5587 var context = $(event.currentTarget).data(dataKey);
5588
5589 if (!context) {
5590 context = new this.constructor(event.currentTarget, this._getDelegateConfig());
5591 $(event.currentTarget).data(dataKey, context);
5592 }
5593
5594 context._activeTrigger.click = !context._activeTrigger.click;
5595
5596 if (context._isWithActiveTrigger()) {
5597 context._enter(null, context);
5598 } else {
5599 context._leave(null, context);
5600 }
5601 } else {
5602 if ($(this.getTipElement()).hasClass(ClassName$6.SHOW)) {
5603 this._leave(null, this);
5604
5605 return;
5606 }
5607
5608 this._enter(null, this);
5609 }
5610 };
5611
5612 _proto.dispose = function dispose() {
5613 clearTimeout(this._timeout);
5614 $.removeData(this.element, this.constructor.DATA_KEY);
5615 $(this.element).off(this.constructor.EVENT_KEY);
5616 $(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler);
5617
5618 if (this.tip) {
5619 $(this.tip).remove();
5620 }
5621
5622 this._isEnabled = null;
5623 this._timeout = null;
5624 this._hoverState = null;
5625 this._activeTrigger = null;
5626
5627 if (this._popper) {
5628 this._popper.destroy();
5629 }
5630
5631 this._popper = null;
5632 this.element = null;
5633 this.config = null;
5634 this.tip = null;
5635 };
5636
5637 _proto.show = function show() {
5638 var _this = this;
5639
5640 if ($(this.element).css('display') === 'none') {
5641 throw new Error('Please use show on visible elements');
5642 }
5643
5644 var showEvent = $.Event(this.constructor.Event.SHOW);
5645
5646 if (this.isWithContent() && this._isEnabled) {
5647 $(this.element).trigger(showEvent);
5648 var shadowRoot = Util.findShadowRoot(this.element);
5649 var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);
5650
5651 if (showEvent.isDefaultPrevented() || !isInTheDom) {
5652 return;
5653 }
5654
5655 var tip = this.getTipElement();
5656 var tipId = Util.getUID(this.constructor.NAME);
5657 tip.setAttribute('id', tipId);
5658 this.element.setAttribute('aria-describedby', tipId);
5659 this.setContent();
5660
5661 if (this.config.animation) {
5662 $(tip).addClass(ClassName$6.FADE);
5663 }
5664
5665 var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
5666
5667 var attachment = this._getAttachment(placement);
5668
5669 this.addAttachmentClass(attachment);
5670
5671 var container = this._getContainer();
5672
5673 $(tip).data(this.constructor.DATA_KEY, this);
5674
5675 if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {
5676 $(tip).appendTo(container);
5677 }
5678
5679 $(this.element).trigger(this.constructor.Event.INSERTED);
5680 this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment));
5681 $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra
5682 // empty mouseover listeners to the body's immediate children;
5683 // only needed because of broken event delegation on iOS
5684 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
5685
5686 if ('ontouchstart' in document.documentElement) {
5687 $(document.body).children().on('mouseover', null, $.noop);
5688 }
5689
5690 var complete = function complete() {
5691 if (_this.config.animation) {
5692 _this._fixTransition();
5693 }
5694
5695 var prevHoverState = _this._hoverState;
5696 _this._hoverState = null;
5697 $(_this.element).trigger(_this.constructor.Event.SHOWN);
5698
5699 if (prevHoverState === HoverState.OUT) {
5700 _this._leave(null, _this);
5701 }
5702 };
5703
5704 if ($(this.tip).hasClass(ClassName$6.FADE)) {
5705 var transitionDuration = Util.getTransitionDurationFromElement(this.tip);
5706 $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
5707 } else {
5708 complete();
5709 }
5710 }
5711 };
5712
5713 _proto.hide = function hide(callback) {
5714 var _this2 = this;
5715
5716 var tip = this.getTipElement();
5717 var hideEvent = $.Event(this.constructor.Event.HIDE);
5718
5719 var complete = function complete() {
5720 if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {
5721 tip.parentNode.removeChild(tip);
5722 }
5723
5724 _this2._cleanTipClass();
5725
5726 _this2.element.removeAttribute('aria-describedby');
5727
5728 $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
5729
5730 if (_this2._popper !== null) {
5731 _this2._popper.destroy();
5732 }
5733
5734 if (callback) {
5735 callback();
5736 }
5737 };
5738
5739 $(this.element).trigger(hideEvent);
5740
5741 if (hideEvent.isDefaultPrevented()) {
5742 return;
5743 }
5744
5745 $(tip).removeClass(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra
5746 // empty mouseover listeners we added for iOS support
5747
5748 if ('ontouchstart' in document.documentElement) {
5749 $(document.body).children().off('mouseover', null, $.noop);
5750 }
5751
5752 this._activeTrigger[Trigger.CLICK] = false;
5753 this._activeTrigger[Trigger.FOCUS] = false;
5754 this._activeTrigger[Trigger.HOVER] = false;
5755
5756 if ($(this.tip).hasClass(ClassName$6.FADE)) {
5757 var transitionDuration = Util.getTransitionDurationFromElement(tip);
5758 $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
5759 } else {
5760 complete();
5761 }
5762
5763 this._hoverState = '';
5764 };
5765
5766 _proto.update = function update() {
5767 if (this._popper !== null) {
5768 this._popper.scheduleUpdate();
5769 }
5770 } // Protected
5771 ;
5772
5773 _proto.isWithContent = function isWithContent() {
5774 return Boolean(this.getTitle());
5775 };
5776
5777 _proto.addAttachmentClass = function addAttachmentClass(attachment) {
5778 $(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
5779 };
5780
5781 _proto.getTipElement = function getTipElement() {
5782 this.tip = this.tip || $(this.config.template)[0];
5783 return this.tip;
5784 };
5785
5786 _proto.setContent = function setContent() {
5787 var tip = this.getTipElement();
5788 this.setElementContent($(tip.querySelectorAll(Selector$6.TOOLTIP_INNER)), this.getTitle());
5789 $(tip).removeClass(ClassName$6.FADE + " " + ClassName$6.SHOW);
5790 };
5791
5792 _proto.setElementContent = function setElementContent($element, content) {
5793 if (typeof content === 'object' && (content.nodeType || content.jquery)) {
5794 // Content is a DOM node or a jQuery
5795 if (this.config.html) {
5796 if (!$(content).parent().is($element)) {
5797 $element.empty().append(content);
5798 }
5799 } else {
5800 $element.text($(content).text());
5801 }
5802
5803 return;
5804 }
5805
5806 if (this.config.html) {
5807 if (this.config.sanitize) {
5808 content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);
5809 }
5810
5811 $element.html(content);
5812 } else {
5813 $element.text(content);
5814 }
5815 };
5816
5817 _proto.getTitle = function getTitle() {
5818 var title = this.element.getAttribute('data-original-title');
5819
5820 if (!title) {
5821 title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
5822 }
5823
5824 return title;
5825 } // Private
5826 ;
5827
5828 _proto._getPopperConfig = function _getPopperConfig(attachment) {
5829 var _this3 = this;
5830
5831 var defaultBsConfig = {
5832 placement: attachment,
5833 modifiers: {
5834 offset: this._getOffset(),
5835 flip: {
5836 behavior: this.config.fallbackPlacement
5837 },
5838 arrow: {
5839 element: Selector$6.ARROW
5840 },
5841 preventOverflow: {
5842 boundariesElement: this.config.boundary
5843 }
5844 },
5845 onCreate: function onCreate(data) {
5846 if (data.originalPlacement !== data.placement) {
5847 _this3._handlePopperPlacementChange(data);
5848 }
5849 },
5850 onUpdate: function onUpdate(data) {
5851 return _this3._handlePopperPlacementChange(data);
5852 }
5853 };
5854 return _objectSpread2({}, defaultBsConfig, {}, this.config.popperConfig);
5855 };
5856
5857 _proto._getOffset = function _getOffset() {
5858 var _this4 = this;
5859
5860 var offset = {};
5861
5862 if (typeof this.config.offset === 'function') {
5863 offset.fn = function (data) {
5864 data.offsets = _objectSpread2({}, data.offsets, {}, _this4.config.offset(data.offsets, _this4.element) || {});
5865 return data;
5866 };
5867 } else {
5868 offset.offset = this.config.offset;
5869 }
5870
5871 return offset;
5872 };
5873
5874 _proto._getContainer = function _getContainer() {
5875 if (this.config.container === false) {
5876 return document.body;
5877 }
5878
5879 if (Util.isElement(this.config.container)) {
5880 return $(this.config.container);
5881 }
5882
5883 return $(document).find(this.config.container);
5884 };
5885
5886 _proto._getAttachment = function _getAttachment(placement) {
5887 return AttachmentMap$1[placement.toUpperCase()];
5888 };
5889
5890 _proto._setListeners = function _setListeners() {
5891 var _this5 = this;
5892
5893 var triggers = this.config.trigger.split(' ');
5894 triggers.forEach(function (trigger) {
5895 if (trigger === 'click') {
5896 $(_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) {
5897 return _this5.toggle(event);
5898 });
5899 } else if (trigger !== Trigger.MANUAL) {
5900 var eventIn = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN;
5901 var eventOut = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT;
5902 $(_this5.element).on(eventIn, _this5.config.selector, function (event) {
5903 return _this5._enter(event);
5904 }).on(eventOut, _this5.config.selector, function (event) {
5905 return _this5._leave(event);
5906 });
5907 }
5908 });
5909
5910 this._hideModalHandler = function () {
5911 if (_this5.element) {
5912 _this5.hide();
5913 }
5914 };
5915
5916 $(this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler);
5917
5918 if (this.config.selector) {
5919 this.config = _objectSpread2({}, this.config, {
5920 trigger: 'manual',
5921 selector: ''
5922 });
5923 } else {
5924 this._fixTitle();
5925 }
5926 };
5927
5928 _proto._fixTitle = function _fixTitle() {
5929 var titleType = typeof this.element.getAttribute('data-original-title');
5930
5931 if (this.element.getAttribute('title') || titleType !== 'string') {
5932 this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
5933 this.element.setAttribute('title', '');
5934 }
5935 };
5936
5937 _proto._enter = function _enter(event, context) {
5938 var dataKey = this.constructor.DATA_KEY;
5939 context = context || $(event.currentTarget).data(dataKey);
5940
5941 if (!context) {
5942 context = new this.constructor(event.currentTarget, this._getDelegateConfig());
5943 $(event.currentTarget).data(dataKey, context);
5944 }
5945
5946 if (event) {
5947 context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
5948 }
5949
5950 if ($(context.getTipElement()).hasClass(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) {
5951 context._hoverState = HoverState.SHOW;
5952 return;
5953 }
5954
5955 clearTimeout(context._timeout);
5956 context._hoverState = HoverState.SHOW;
5957
5958 if (!context.config.delay || !context.config.delay.show) {
5959 context.show();
5960 return;
5961 }
5962
5963 context._timeout = setTimeout(function () {
5964 if (context._hoverState === HoverState.SHOW) {
5965 context.show();
5966 }
5967 }, context.config.delay.show);
5968 };
5969
5970 _proto._leave = function _leave(event, context) {
5971 var dataKey = this.constructor.DATA_KEY;
5972 context = context || $(event.currentTarget).data(dataKey);
5973
5974 if (!context) {
5975 context = new this.constructor(event.currentTarget, this._getDelegateConfig());
5976 $(event.currentTarget).data(dataKey, context);
5977 }
5978
5979 if (event) {
5980 context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
5981 }
5982
5983 if (context._isWithActiveTrigger()) {
5984 return;
5985 }
5986
5987 clearTimeout(context._timeout);
5988 context._hoverState = HoverState.OUT;
5989
5990 if (!context.config.delay || !context.config.delay.hide) {
5991 context.hide();
5992 return;
5993 }
5994
5995 context._timeout = setTimeout(function () {
5996 if (context._hoverState === HoverState.OUT) {
5997 context.hide();
5998 }
5999 }, context.config.delay.hide);
6000 };
6001
6002 _proto._isWithActiveTrigger = function _isWithActiveTrigger() {
6003 for (var trigger in this._activeTrigger) {
6004 if (this._activeTrigger[trigger]) {
6005 return true;
6006 }
6007 }
6008
6009 return false;
6010 };
6011
6012 _proto._getConfig = function _getConfig(config) {
6013 var dataAttributes = $(this.element).data();
6014 Object.keys(dataAttributes).forEach(function (dataAttr) {
6015 if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
6016 delete dataAttributes[dataAttr];
6017 }
6018 });
6019 config = _objectSpread2({}, this.constructor.Default, {}, dataAttributes, {}, typeof config === 'object' && config ? config : {});
6020
6021 if (typeof config.delay === 'number') {
6022 config.delay = {
6023 show: config.delay,
6024 hide: config.delay
6025 };
6026 }
6027
6028 if (typeof config.title === 'number') {
6029 config.title = config.title.toString();
6030 }
6031
6032 if (typeof config.content === 'number') {
6033 config.content = config.content.toString();
6034 }
6035
6036 Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);
6037
6038 if (config.sanitize) {
6039 config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);
6040 }
6041
6042 return config;
6043 };
6044
6045 _proto._getDelegateConfig = function _getDelegateConfig() {
6046 var config = {};
6047
6048 if (this.config) {
6049 for (var key in this.config) {
6050 if (this.constructor.Default[key] !== this.config[key]) {
6051 config[key] = this.config[key];
6052 }
6053 }
6054 }
6055
6056 return config;
6057 };
6058
6059 _proto._cleanTipClass = function _cleanTipClass() {
6060 var $tip = $(this.getTipElement());
6061 var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
6062
6063 if (tabClass !== null && tabClass.length) {
6064 $tip.removeClass(tabClass.join(''));
6065 }
6066 };
6067
6068 _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
6069 var popperInstance = popperData.instance;
6070 this.tip = popperInstance.popper;
6071
6072 this._cleanTipClass();
6073
6074 this.addAttachmentClass(this._getAttachment(popperData.placement));
6075 };
6076
6077 _proto._fixTransition = function _fixTransition() {
6078 var tip = this.getTipElement();
6079 var initConfigAnimation = this.config.animation;
6080
6081 if (tip.getAttribute('x-placement') !== null) {
6082 return;
6083 }
6084
6085 $(tip).removeClass(ClassName$6.FADE);
6086 this.config.animation = false;
6087 this.hide();
6088 this.show();
6089 this.config.animation = initConfigAnimation;
6090 } // Static
6091 ;
6092
6093 Tooltip._jQueryInterface = function _jQueryInterface(config) {
6094 return this.each(function () {
6095 var data = $(this).data(DATA_KEY$6);
6096
6097 var _config = typeof config === 'object' && config;
6098
6099 if (!data && /dispose|hide/.test(config)) {
6100 return;
6101 }
6102
6103 if (!data) {
6104 data = new Tooltip(this, _config);
6105 $(this).data(DATA_KEY$6, data);
6106 }
6107
6108 if (typeof config === 'string') {
6109 if (typeof data[config] === 'undefined') {
6110 throw new TypeError("No method named \"" + config + "\"");
6111 }
6112
6113 data[config]();
6114 }
6115 });
6116 };
6117
6118 _createClass(Tooltip, null, [{
6119 key: "VERSION",
6120 get: function get() {
6121 return VERSION$6;
6122 }
6123 }, {
6124 key: "Default",
6125 get: function get() {
6126 return Default$4;
6127 }
6128 }, {
6129 key: "NAME",
6130 get: function get() {
6131 return NAME$6;
6132 }
6133 }, {
6134 key: "DATA_KEY",
6135 get: function get() {
6136 return DATA_KEY$6;
6137 }
6138 }, {
6139 key: "Event",
6140 get: function get() {
6141 return Event$6;
6142 }
6143 }, {
6144 key: "EVENT_KEY",
6145 get: function get() {
6146 return EVENT_KEY$6;
6147 }
6148 }, {
6149 key: "DefaultType",
6150 get: function get() {
6151 return DefaultType$4;
6152 }
6153 }]);
6154
6155 return Tooltip;
6156 }();
6157 /**
6158 * ------------------------------------------------------------------------
6159 * jQuery
6160 * ------------------------------------------------------------------------
6161 */
6162
6163
6164 $.fn[NAME$6] = Tooltip._jQueryInterface;
6165 $.fn[NAME$6].Constructor = Tooltip;
6166
6167 $.fn[NAME$6].noConflict = function () {
6168 $.fn[NAME$6] = JQUERY_NO_CONFLICT$6;
6169 return Tooltip._jQueryInterface;
6170 };
6171
6172 /**
6173 * ------------------------------------------------------------------------
6174 * Constants
6175 * ------------------------------------------------------------------------
6176 */
6177
6178 var NAME$7 = 'popover';
6179 var VERSION$7 = '4.4.1';
6180 var DATA_KEY$7 = 'bs.popover';
6181 var EVENT_KEY$7 = "." + DATA_KEY$7;
6182 var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];
6183 var CLASS_PREFIX$1 = 'bs-popover';
6184 var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');
6185
6186 var Default$5 = _objectSpread2({}, Tooltip.Default, {
6187 placement: 'right',
6188 trigger: 'click',
6189 content: '',
6190 template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
6191 });
6192
6193 var DefaultType$5 = _objectSpread2({}, Tooltip.DefaultType, {
6194 content: '(string|element|function)'
6195 });
6196
6197 var ClassName$7 = {
6198 FADE: 'fade',
6199 SHOW: 'show'
6200 };
6201 var Selector$7 = {
6202 TITLE: '.popover-header',
6203 CONTENT: '.popover-body'
6204 };
6205 var Event$7 = {
6206 HIDE: "hide" + EVENT_KEY$7,
6207 HIDDEN: "hidden" + EVENT_KEY$7,
6208 SHOW: "show" + EVENT_KEY$7,
6209 SHOWN: "shown" + EVENT_KEY$7,
6210 INSERTED: "inserted" + EVENT_KEY$7,
6211 CLICK: "click" + EVENT_KEY$7,
6212 FOCUSIN: "focusin" + EVENT_KEY$7,
6213 FOCUSOUT: "focusout" + EVENT_KEY$7,
6214 MOUSEENTER: "mouseenter" + EVENT_KEY$7,
6215 MOUSELEAVE: "mouseleave" + EVENT_KEY$7
6216 };
6217 /**
6218 * ------------------------------------------------------------------------
6219 * Class Definition
6220 * ------------------------------------------------------------------------
6221 */
6222
6223 var Popover =
6224 /*#__PURE__*/
6225 function (_Tooltip) {
6226 _inheritsLoose(Popover, _Tooltip);
6227
6228 function Popover() {
6229 return _Tooltip.apply(this, arguments) || this;
6230 }
6231
6232 var _proto = Popover.prototype;
6233
6234 // Overrides
6235 _proto.isWithContent = function isWithContent() {
6236 return this.getTitle() || this._getContent();
6237 };
6238
6239 _proto.addAttachmentClass = function addAttachmentClass(attachment) {
6240 $(this.getTipElement()).addClass(CLASS_PREFIX$1 + "-" + attachment);
6241 };
6242
6243 _proto.getTipElement = function getTipElement() {
6244 this.tip = this.tip || $(this.config.template)[0];
6245 return this.tip;
6246 };
6247
6248 _proto.setContent = function setContent() {
6249 var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events
6250
6251 this.setElementContent($tip.find(Selector$7.TITLE), this.getTitle());
6252
6253 var content = this._getContent();
6254
6255 if (typeof content === 'function') {
6256 content = content.call(this.element);
6257 }
6258
6259 this.setElementContent($tip.find(Selector$7.CONTENT), content);
6260 $tip.removeClass(ClassName$7.FADE + " " + ClassName$7.SHOW);
6261 } // Private
6262 ;
6263
6264 _proto._getContent = function _getContent() {
6265 return this.element.getAttribute('data-content') || this.config.content;
6266 };
6267
6268 _proto._cleanTipClass = function _cleanTipClass() {
6269 var $tip = $(this.getTipElement());
6270 var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);
6271
6272 if (tabClass !== null && tabClass.length > 0) {
6273 $tip.removeClass(tabClass.join(''));
6274 }
6275 } // Static
6276 ;
6277
6278 Popover._jQueryInterface = function _jQueryInterface(config) {
6279 return this.each(function () {
6280 var data = $(this).data(DATA_KEY$7);
6281
6282 var _config = typeof config === 'object' ? config : null;
6283
6284 if (!data && /dispose|hide/.test(config)) {
6285 return;
6286 }
6287
6288 if (!data) {
6289 data = new Popover(this, _config);
6290 $(this).data(DATA_KEY$7, data);
6291 }
6292
6293 if (typeof config === 'string') {
6294 if (typeof data[config] === 'undefined') {
6295 throw new TypeError("No method named \"" + config + "\"");
6296 }
6297
6298 data[config]();
6299 }
6300 });
6301 };
6302
6303 _createClass(Popover, null, [{
6304 key: "VERSION",
6305 // Getters
6306 get: function get() {
6307 return VERSION$7;
6308 }
6309 }, {
6310 key: "Default",
6311 get: function get() {
6312 return Default$5;
6313 }
6314 }, {
6315 key: "NAME",
6316 get: function get() {
6317 return NAME$7;
6318 }
6319 }, {
6320 key: "DATA_KEY",
6321 get: function get() {
6322 return DATA_KEY$7;
6323 }
6324 }, {
6325 key: "Event",
6326 get: function get() {
6327 return Event$7;
6328 }
6329 }, {
6330 key: "EVENT_KEY",
6331 get: function get() {
6332 return EVENT_KEY$7;
6333 }
6334 }, {
6335 key: "DefaultType",
6336 get: function get() {
6337 return DefaultType$5;
6338 }
6339 }]);
6340
6341 return Popover;
6342 }(Tooltip);
6343 /**
6344 * ------------------------------------------------------------------------
6345 * jQuery
6346 * ------------------------------------------------------------------------
6347 */
6348
6349
6350 $.fn[NAME$7] = Popover._jQueryInterface;
6351 $.fn[NAME$7].Constructor = Popover;
6352
6353 $.fn[NAME$7].noConflict = function () {
6354 $.fn[NAME$7] = JQUERY_NO_CONFLICT$7;
6355 return Popover._jQueryInterface;
6356 };
6357
6358 /**
6359 * ------------------------------------------------------------------------
6360 * Constants
6361 * ------------------------------------------------------------------------
6362 */
6363
6364 var NAME$8 = 'scrollspy';
6365 var VERSION$8 = '4.4.1';
6366 var DATA_KEY$8 = 'bs.scrollspy';
6367 var EVENT_KEY$8 = "." + DATA_KEY$8;
6368 var DATA_API_KEY$6 = '.data-api';
6369 var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8];
6370 var Default$6 = {
6371 offset: 10,
6372 method: 'auto',
6373 target: ''
6374 };
6375 var DefaultType$6 = {
6376 offset: 'number',
6377 method: 'string',
6378 target: '(string|element)'
6379 };
6380 var Event$8 = {
6381 ACTIVATE: "activate" + EVENT_KEY$8,
6382 SCROLL: "scroll" + EVENT_KEY$8,
6383 LOAD_DATA_API: "load" + EVENT_KEY$8 + DATA_API_KEY$6
6384 };
6385 var ClassName$8 = {
6386 DROPDOWN_ITEM: 'dropdown-item',
6387 DROPDOWN_MENU: 'dropdown-menu',
6388 ACTIVE: 'active'
6389 };
6390 var Selector$8 = {
6391 DATA_SPY: '[data-spy="scroll"]',
6392 ACTIVE: '.active',
6393 NAV_LIST_GROUP: '.nav, .list-group',
6394 NAV_LINKS: '.nav-link',
6395 NAV_ITEMS: '.nav-item',
6396 LIST_ITEMS: '.list-group-item',
6397 DROPDOWN: '.dropdown',
6398 DROPDOWN_ITEMS: '.dropdown-item',
6399 DROPDOWN_TOGGLE: '.dropdown-toggle'
6400 };
6401 var OffsetMethod = {
6402 OFFSET: 'offset',
6403 POSITION: 'position'
6404 };
6405 /**
6406 * ------------------------------------------------------------------------
6407 * Class Definition
6408 * ------------------------------------------------------------------------
6409 */
6410
6411 var ScrollSpy =
6412 /*#__PURE__*/
6413 function () {
6414 function ScrollSpy(element, config) {
6415 var _this = this;
6416
6417 this._element = element;
6418 this._scrollElement = element.tagName === 'BODY' ? window : element;
6419 this._config = this._getConfig(config);
6420 this._selector = this._config.target + " " + Selector$8.NAV_LINKS + "," + (this._config.target + " " + Selector$8.LIST_ITEMS + ",") + (this._config.target + " " + Selector$8.DROPDOWN_ITEMS);
6421 this._offsets = [];
6422 this._targets = [];
6423 this._activeTarget = null;
6424 this._scrollHeight = 0;
6425 $(this._scrollElement).on(Event$8.SCROLL, function (event) {
6426 return _this._process(event);
6427 });
6428 this.refresh();
6429
6430 this._process();
6431 } // Getters
6432
6433
6434 var _proto = ScrollSpy.prototype;
6435
6436 // Public
6437 _proto.refresh = function refresh() {
6438 var _this2 = this;
6439
6440 var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;
6441 var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
6442 var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
6443 this._offsets = [];
6444 this._targets = [];
6445 this._scrollHeight = this._getScrollHeight();
6446 var targets = [].slice.call(document.querySelectorAll(this._selector));
6447 targets.map(function (element) {
6448 var target;
6449 var targetSelector = Util.getSelectorFromElement(element);
6450
6451 if (targetSelector) {
6452 target = document.querySelector(targetSelector);
6453 }
6454
6455 if (target) {
6456 var targetBCR = target.getBoundingClientRect();
6457
6458 if (targetBCR.width || targetBCR.height) {
6459 // TODO (fat): remove sketch reliance on jQuery position/offset
6460 return [$(target)[offsetMethod]().top + offsetBase, targetSelector];
6461 }
6462 }
6463
6464 return null;
6465 }).filter(function (item) {
6466 return item;
6467 }).sort(function (a, b) {
6468 return a[0] - b[0];
6469 }).forEach(function (item) {
6470 _this2._offsets.push(item[0]);
6471
6472 _this2._targets.push(item[1]);
6473 });
6474 };
6475
6476 _proto.dispose = function dispose() {
6477 $.removeData(this._element, DATA_KEY$8);
6478 $(this._scrollElement).off(EVENT_KEY$8);
6479 this._element = null;
6480 this._scrollElement = null;
6481 this._config = null;
6482 this._selector = null;
6483 this._offsets = null;
6484 this._targets = null;
6485 this._activeTarget = null;
6486 this._scrollHeight = null;
6487 } // Private
6488 ;
6489
6490 _proto._getConfig = function _getConfig(config) {
6491 config = _objectSpread2({}, Default$6, {}, typeof config === 'object' && config ? config : {});
6492
6493 if (typeof config.target !== 'string') {
6494 var id = $(config.target).attr('id');
6495
6496 if (!id) {
6497 id = Util.getUID(NAME$8);
6498 $(config.target).attr('id', id);
6499 }
6500
6501 config.target = "#" + id;
6502 }
6503
6504 Util.typeCheckConfig(NAME$8, config, DefaultType$6);
6505 return config;
6506 };
6507
6508 _proto._getScrollTop = function _getScrollTop() {
6509 return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
6510 };
6511
6512 _proto._getScrollHeight = function _getScrollHeight() {
6513 return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
6514 };
6515
6516 _proto._getOffsetHeight = function _getOffsetHeight() {
6517 return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
6518 };
6519
6520 _proto._process = function _process() {
6521 var scrollTop = this._getScrollTop() + this._config.offset;
6522
6523 var scrollHeight = this._getScrollHeight();
6524
6525 var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
6526
6527 if (this._scrollHeight !== scrollHeight) {
6528 this.refresh();
6529 }
6530
6531 if (scrollTop >= maxScroll) {
6532 var target = this._targets[this._targets.length - 1];
6533
6534 if (this._activeTarget !== target) {
6535 this._activate(target);
6536 }
6537
6538 return;
6539 }
6540
6541 if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
6542 this._activeTarget = null;
6543
6544 this._clear();
6545
6546 return;
6547 }
6548
6549 var offsetLength = this._offsets.length;
6550
6551 for (var i = offsetLength; i--;) {
6552 var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
6553
6554 if (isActiveTarget) {
6555 this._activate(this._targets[i]);
6556 }
6557 }
6558 };
6559
6560 _proto._activate = function _activate(target) {
6561 this._activeTarget = target;
6562
6563 this._clear();
6564
6565 var queries = this._selector.split(',').map(function (selector) {
6566 return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]";
6567 });
6568
6569 var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));
6570
6571 if ($link.hasClass(ClassName$8.DROPDOWN_ITEM)) {
6572 $link.closest(Selector$8.DROPDOWN).find(Selector$8.DROPDOWN_TOGGLE).addClass(ClassName$8.ACTIVE);
6573 $link.addClass(ClassName$8.ACTIVE);
6574 } else {
6575 // Set triggered link as active
6576 $link.addClass(ClassName$8.ACTIVE); // Set triggered links parents as active
6577 // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
6578
6579 $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_LINKS + ", " + Selector$8.LIST_ITEMS).addClass(ClassName$8.ACTIVE); // Handle special case when .nav-link is inside .nav-item
6580
6581 $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_ITEMS).children(Selector$8.NAV_LINKS).addClass(ClassName$8.ACTIVE);
6582 }
6583
6584 $(this._scrollElement).trigger(Event$8.ACTIVATE, {
6585 relatedTarget: target
6586 });
6587 };
6588
6589 _proto._clear = function _clear() {
6590 [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {
6591 return node.classList.contains(ClassName$8.ACTIVE);
6592 }).forEach(function (node) {
6593 return node.classList.remove(ClassName$8.ACTIVE);
6594 });
6595 } // Static
6596 ;
6597
6598 ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
6599 return this.each(function () {
6600 var data = $(this).data(DATA_KEY$8);
6601
6602 var _config = typeof config === 'object' && config;
6603
6604 if (!data) {
6605 data = new ScrollSpy(this, _config);
6606 $(this).data(DATA_KEY$8, data);
6607 }
6608
6609 if (typeof config === 'string') {
6610 if (typeof data[config] === 'undefined') {
6611 throw new TypeError("No method named \"" + config + "\"");
6612 }
6613
6614 data[config]();
6615 }
6616 });
6617 };
6618
6619 _createClass(ScrollSpy, null, [{
6620 key: "VERSION",
6621 get: function get() {
6622 return VERSION$8;
6623 }
6624 }, {
6625 key: "Default",
6626 get: function get() {
6627 return Default$6;
6628 }
6629 }]);
6630
6631 return ScrollSpy;
6632 }();
6633 /**
6634 * ------------------------------------------------------------------------
6635 * Data Api implementation
6636 * ------------------------------------------------------------------------
6637 */
6638
6639
6640 $(window).on(Event$8.LOAD_DATA_API, function () {
6641 var scrollSpys = [].slice.call(document.querySelectorAll(Selector$8.DATA_SPY));
6642 var scrollSpysLength = scrollSpys.length;
6643
6644 for (var i = scrollSpysLength; i--;) {
6645 var $spy = $(scrollSpys[i]);
6646
6647 ScrollSpy._jQueryInterface.call($spy, $spy.data());
6648 }
6649 });
6650 /**
6651 * ------------------------------------------------------------------------
6652 * jQuery
6653 * ------------------------------------------------------------------------
6654 */
6655
6656 $.fn[NAME$8] = ScrollSpy._jQueryInterface;
6657 $.fn[NAME$8].Constructor = ScrollSpy;
6658
6659 $.fn[NAME$8].noConflict = function () {
6660 $.fn[NAME$8] = JQUERY_NO_CONFLICT$8;
6661 return ScrollSpy._jQueryInterface;
6662 };
6663
6664 /**
6665 * ------------------------------------------------------------------------
6666 * Constants
6667 * ------------------------------------------------------------------------
6668 */
6669
6670 var NAME$9 = 'tab';
6671 var VERSION$9 = '4.4.1';
6672 var DATA_KEY$9 = 'bs.tab';
6673 var EVENT_KEY$9 = "." + DATA_KEY$9;
6674 var DATA_API_KEY$7 = '.data-api';
6675 var JQUERY_NO_CONFLICT$9 = $.fn[NAME$9];
6676 var Event$9 = {
6677 HIDE: "hide" + EVENT_KEY$9,
6678 HIDDEN: "hidden" + EVENT_KEY$9,
6679 SHOW: "show" + EVENT_KEY$9,
6680 SHOWN: "shown" + EVENT_KEY$9,
6681 CLICK_DATA_API: "click" + EVENT_KEY$9 + DATA_API_KEY$7
6682 };
6683 var ClassName$9 = {
6684 DROPDOWN_MENU: 'dropdown-menu',
6685 ACTIVE: 'active',
6686 DISABLED: 'disabled',
6687 FADE: 'fade',
6688 SHOW: 'show'
6689 };
6690 var Selector$9 = {
6691 DROPDOWN: '.dropdown',
6692 NAV_LIST_GROUP: '.nav, .list-group',
6693 ACTIVE: '.active',
6694 ACTIVE_UL: '> li > .active',
6695 DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
6696 DROPDOWN_TOGGLE: '.dropdown-toggle',
6697 DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
6698 };
6699 /**
6700 * ------------------------------------------------------------------------
6701 * Class Definition
6702 * ------------------------------------------------------------------------
6703 */
6704
6705 var Tab =
6706 /*#__PURE__*/
6707 function () {
6708 function Tab(element) {
6709 this._element = element;
6710 } // Getters
6711
6712
6713 var _proto = Tab.prototype;
6714
6715 // Public
6716 _proto.show = function show() {
6717 var _this = this;
6718
6719 if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName$9.ACTIVE) || $(this._element).hasClass(ClassName$9.DISABLED)) {
6720 return;
6721 }
6722
6723 var target;
6724 var previous;
6725 var listElement = $(this._element).closest(Selector$9.NAV_LIST_GROUP)[0];
6726 var selector = Util.getSelectorFromElement(this._element);
6727
6728 if (listElement) {
6729 var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector$9.ACTIVE_UL : Selector$9.ACTIVE;
6730 previous = $.makeArray($(listElement).find(itemSelector));
6731 previous = previous[previous.length - 1];
6732 }
6733
6734 var hideEvent = $.Event(Event$9.HIDE, {
6735 relatedTarget: this._element
6736 });
6737 var showEvent = $.Event(Event$9.SHOW, {
6738 relatedTarget: previous
6739 });
6740
6741 if (previous) {
6742 $(previous).trigger(hideEvent);
6743 }
6744
6745 $(this._element).trigger(showEvent);
6746
6747 if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
6748 return;
6749 }
6750
6751 if (selector) {
6752 target = document.querySelector(selector);
6753 }
6754
6755 this._activate(this._element, listElement);
6756
6757 var complete = function complete() {
6758 var hiddenEvent = $.Event(Event$9.HIDDEN, {
6759 relatedTarget: _this._element
6760 });
6761 var shownEvent = $.Event(Event$9.SHOWN, {
6762 relatedTarget: previous
6763 });
6764 $(previous).trigger(hiddenEvent);
6765 $(_this._element).trigger(shownEvent);
6766 };
6767
6768 if (target) {
6769 this._activate(target, target.parentNode, complete);
6770 } else {
6771 complete();
6772 }
6773 };
6774
6775 _proto.dispose = function dispose() {
6776 $.removeData(this._element, DATA_KEY$9);
6777 this._element = null;
6778 } // Private
6779 ;
6780
6781 _proto._activate = function _activate(element, container, callback) {
6782 var _this2 = this;
6783
6784 var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector$9.ACTIVE_UL) : $(container).children(Selector$9.ACTIVE);
6785 var active = activeElements[0];
6786 var isTransitioning = callback && active && $(active).hasClass(ClassName$9.FADE);
6787
6788 var complete = function complete() {
6789 return _this2._transitionComplete(element, active, callback);
6790 };
6791
6792 if (active && isTransitioning) {
6793 var transitionDuration = Util.getTransitionDurationFromElement(active);
6794 $(active).removeClass(ClassName$9.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
6795 } else {
6796 complete();
6797 }
6798 };
6799
6800 _proto._transitionComplete = function _transitionComplete(element, active, callback) {
6801 if (active) {
6802 $(active).removeClass(ClassName$9.ACTIVE);
6803 var dropdownChild = $(active.parentNode).find(Selector$9.DROPDOWN_ACTIVE_CHILD)[0];
6804
6805 if (dropdownChild) {
6806 $(dropdownChild).removeClass(ClassName$9.ACTIVE);
6807 }
6808
6809 if (active.getAttribute('role') === 'tab') {
6810 active.setAttribute('aria-selected', false);
6811 }
6812 }
6813
6814 $(element).addClass(ClassName$9.ACTIVE);
6815
6816 if (element.getAttribute('role') === 'tab') {
6817 element.setAttribute('aria-selected', true);
6818 }
6819
6820 Util.reflow(element);
6821
6822 if (element.classList.contains(ClassName$9.FADE)) {
6823 element.classList.add(ClassName$9.SHOW);
6824 }
6825
6826 if (element.parentNode && $(element.parentNode).hasClass(ClassName$9.DROPDOWN_MENU)) {
6827 var dropdownElement = $(element).closest(Selector$9.DROPDOWN)[0];
6828
6829 if (dropdownElement) {
6830 var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector$9.DROPDOWN_TOGGLE));
6831 $(dropdownToggleList).addClass(ClassName$9.ACTIVE);
6832 }
6833
6834 element.setAttribute('aria-expanded', true);
6835 }
6836
6837 if (callback) {
6838 callback();
6839 }
6840 } // Static
6841 ;
6842
6843 Tab._jQueryInterface = function _jQueryInterface(config) {
6844 return this.each(function () {
6845 var $this = $(this);
6846 var data = $this.data(DATA_KEY$9);
6847
6848 if (!data) {
6849 data = new Tab(this);
6850 $this.data(DATA_KEY$9, data);
6851 }
6852
6853 if (typeof config === 'string') {
6854 if (typeof data[config] === 'undefined') {
6855 throw new TypeError("No method named \"" + config + "\"");
6856 }
6857
6858 data[config]();
6859 }
6860 });
6861 };
6862
6863 _createClass(Tab, null, [{
6864 key: "VERSION",
6865 get: function get() {
6866 return VERSION$9;
6867 }
6868 }]);
6869
6870 return Tab;
6871 }();
6872 /**
6873 * ------------------------------------------------------------------------
6874 * Data Api implementation
6875 * ------------------------------------------------------------------------
6876 */
6877
6878
6879 $(document).on(Event$9.CLICK_DATA_API, Selector$9.DATA_TOGGLE, function (event) {
6880 event.preventDefault();
6881
6882 Tab._jQueryInterface.call($(this), 'show');
6883 });
6884 /**
6885 * ------------------------------------------------------------------------
6886 * jQuery
6887 * ------------------------------------------------------------------------
6888 */
6889
6890 $.fn[NAME$9] = Tab._jQueryInterface;
6891 $.fn[NAME$9].Constructor = Tab;
6892
6893 $.fn[NAME$9].noConflict = function () {
6894 $.fn[NAME$9] = JQUERY_NO_CONFLICT$9;
6895 return Tab._jQueryInterface;
6896 };
6897
6898 /**
6899 * ------------------------------------------------------------------------
6900 * Constants
6901 * ------------------------------------------------------------------------
6902 */
6903
6904 var NAME$a = 'toast';
6905 var VERSION$a = '4.4.1';
6906 var DATA_KEY$a = 'bs.toast';
6907 var EVENT_KEY$a = "." + DATA_KEY$a;
6908 var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];
6909 var Event$a = {
6910 CLICK_DISMISS: "click.dismiss" + EVENT_KEY$a,
6911 HIDE: "hide" + EVENT_KEY$a,
6912 HIDDEN: "hidden" + EVENT_KEY$a,
6913 SHOW: "show" + EVENT_KEY$a,
6914 SHOWN: "shown" + EVENT_KEY$a
6915 };
6916 var ClassName$a = {
6917 FADE: 'fade',
6918 HIDE: 'hide',
6919 SHOW: 'show',
6920 SHOWING: 'showing'
6921 };
6922 var DefaultType$7 = {
6923 animation: 'boolean',
6924 autohide: 'boolean',
6925 delay: 'number'
6926 };
6927 var Default$7 = {
6928 animation: true,
6929 autohide: true,
6930 delay: 500
6931 };
6932 var Selector$a = {
6933 DATA_DISMISS: '[data-dismiss="toast"]'
6934 };
6935 /**
6936 * ------------------------------------------------------------------------
6937 * Class Definition
6938 * ------------------------------------------------------------------------
6939 */
6940
6941 var Toast =
6942 /*#__PURE__*/
6943 function () {
6944 function Toast(element, config) {
6945 this._element = element;
6946 this._config = this._getConfig(config);
6947 this._timeout = null;
6948
6949 this._setListeners();
6950 } // Getters
6951
6952
6953 var _proto = Toast.prototype;
6954
6955 // Public
6956 _proto.show = function show() {
6957 var _this = this;
6958
6959 var showEvent = $.Event(Event$a.SHOW);
6960 $(this._element).trigger(showEvent);
6961
6962 if (showEvent.isDefaultPrevented()) {
6963 return;
6964 }
6965
6966 if (this._config.animation) {
6967 this._element.classList.add(ClassName$a.FADE);
6968 }
6969
6970 var complete = function complete() {
6971 _this._element.classList.remove(ClassName$a.SHOWING);
6972
6973 _this._element.classList.add(ClassName$a.SHOW);
6974
6975 $(_this._element).trigger(Event$a.SHOWN);
6976
6977 if (_this._config.autohide) {
6978 _this._timeout = setTimeout(function () {
6979 _this.hide();
6980 }, _this._config.delay);
6981 }
6982 };
6983
6984 this._element.classList.remove(ClassName$a.HIDE);
6985
6986 Util.reflow(this._element);
6987
6988 this._element.classList.add(ClassName$a.SHOWING);
6989
6990 if (this._config.animation) {
6991 var transitionDuration = Util.getTransitionDurationFromElement(this._element);
6992 $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
6993 } else {
6994 complete();
6995 }
6996 };
6997
6998 _proto.hide = function hide() {
6999 if (!this._element.classList.contains(ClassName$a.SHOW)) {
7000 return;
7001 }
7002
7003 var hideEvent = $.Event(Event$a.HIDE);
7004 $(this._element).trigger(hideEvent);
7005
7006 if (hideEvent.isDefaultPrevented()) {
7007 return;
7008 }
7009
7010 this._close();
7011 };
7012
7013 _proto.dispose = function dispose() {
7014 clearTimeout(this._timeout);
7015 this._timeout = null;
7016
7017 if (this._element.classList.contains(ClassName$a.SHOW)) {
7018 this._element.classList.remove(ClassName$a.SHOW);
7019 }
7020
7021 $(this._element).off(Event$a.CLICK_DISMISS);
7022 $.removeData(this._element, DATA_KEY$a);
7023 this._element = null;
7024 this._config = null;
7025 } // Private
7026 ;
7027
7028 _proto._getConfig = function _getConfig(config) {
7029 config = _objectSpread2({}, Default$7, {}, $(this._element).data(), {}, typeof config === 'object' && config ? config : {});
7030 Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);
7031 return config;
7032 };
7033
7034 _proto._setListeners = function _setListeners() {
7035 var _this2 = this;
7036
7037 $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {
7038 return _this2.hide();
7039 });
7040 };
7041
7042 _proto._close = function _close() {
7043 var _this3 = this;
7044
7045 var complete = function complete() {
7046 _this3._element.classList.add(ClassName$a.HIDE);
7047
7048 $(_this3._element).trigger(Event$a.HIDDEN);
7049 };
7050
7051 this._element.classList.remove(ClassName$a.SHOW);
7052
7053 if (this._config.animation) {
7054 var transitionDuration = Util.getTransitionDurationFromElement(this._element);
7055 $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
7056 } else {
7057 complete();
7058 }
7059 } // Static
7060 ;
7061
7062 Toast._jQueryInterface = function _jQueryInterface(config) {
7063 return this.each(function () {
7064 var $element = $(this);
7065 var data = $element.data(DATA_KEY$a);
7066
7067 var _config = typeof config === 'object' && config;
7068
7069 if (!data) {
7070 data = new Toast(this, _config);
7071 $element.data(DATA_KEY$a, data);
7072 }
7073
7074 if (typeof config === 'string') {
7075 if (typeof data[config] === 'undefined') {
7076 throw new TypeError("No method named \"" + config + "\"");
7077 }
7078
7079 data[config](this);
7080 }
7081 });
7082 };
7083
7084 _createClass(Toast, null, [{
7085 key: "VERSION",
7086 get: function get() {
7087 return VERSION$a;
7088 }
7089 }, {
7090 key: "DefaultType",
7091 get: function get() {
7092 return DefaultType$7;
7093 }
7094 }, {
7095 key: "Default",
7096 get: function get() {
7097 return Default$7;
7098 }
7099 }]);
7100
7101 return Toast;
7102 }();
7103 /**
7104 * ------------------------------------------------------------------------
7105 * jQuery
7106 * ------------------------------------------------------------------------
7107 */
7108
7109
7110 $.fn[NAME$a] = Toast._jQueryInterface;
7111 $.fn[NAME$a].Constructor = Toast;
7112
7113 $.fn[NAME$a].noConflict = function () {
7114 $.fn[NAME$a] = JQUERY_NO_CONFLICT$a;
7115 return Toast._jQueryInterface;
7116 };
7117
7118 exports.Alert = Alert;
7119 exports.Button = Button;
7120 exports.Carousel = Carousel;
7121 exports.Collapse = Collapse;
7122 exports.Dropdown = Dropdown;
7123 exports.Modal = Modal;
7124 exports.Popover = Popover;
7125 exports.Scrollspy = ScrollSpy;
7126 exports.Tab = Tab;
7127 exports.Toast = Toast;
7128 exports.Tooltip = Tooltip;
7129 exports.Util = Util;
7130
7131 Object.defineProperty(exports, '__esModule', { value: true });
7132
7133})));
7134//# sourceMappingURL=bootstrap.bundle.js.map
Note: See TracBrowser for help on using the repository browser.