bootstrap 4.4.1 → 5.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +13 -2
  3. data/README.md +7 -4
  4. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  5. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  6. data/assets/javascripts/bootstrap-sprockets.js +15 -8
  7. data/assets/javascripts/bootstrap.js +3244 -2770
  8. data/assets/javascripts/bootstrap.min.js +4 -4
  9. data/assets/javascripts/bootstrap/alert.js +130 -124
  10. data/assets/javascripts/bootstrap/base-component.js +168 -0
  11. data/assets/javascripts/bootstrap/button.js +85 -179
  12. data/assets/javascripts/bootstrap/carousel.js +430 -405
  13. data/assets/javascripts/bootstrap/collapse.js +325 -264
  14. data/assets/javascripts/bootstrap/dom/data.js +68 -0
  15. data/assets/javascripts/bootstrap/dom/event-handler.js +315 -0
  16. data/assets/javascripts/bootstrap/dom/manipulator.js +88 -0
  17. data/assets/javascripts/bootstrap/dom/selector-engine.js +85 -0
  18. data/assets/javascripts/bootstrap/dropdown.js +464 -400
  19. data/assets/javascripts/bootstrap/modal.js +604 -464
  20. data/assets/javascripts/bootstrap/offcanvas.js +671 -0
  21. data/assets/javascripts/bootstrap/popover.js +119 -192
  22. data/assets/javascripts/bootstrap/scrollspy.js +250 -238
  23. data/assets/javascripts/bootstrap/tab.js +189 -151
  24. data/assets/javascripts/bootstrap/toast.js +215 -192
  25. data/assets/javascripts/bootstrap/tooltip.js +604 -544
  26. data/assets/stylesheets/_bootstrap-grid.scss +54 -18
  27. data/assets/stylesheets/_bootstrap-reboot.scss +7 -4
  28. data/assets/stylesheets/_bootstrap.scss +19 -11
  29. data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
  30. data/assets/stylesheets/bootstrap/_alert.scss +15 -9
  31. data/assets/stylesheets/bootstrap/_badge.scss +2 -27
  32. data/assets/stylesheets/bootstrap/_breadcrumb.scss +4 -18
  33. data/assets/stylesheets/bootstrap/_button-group.scss +21 -45
  34. data/assets/stylesheets/bootstrap/_buttons.scss +27 -55
  35. data/assets/stylesheets/bootstrap/_card.scss +43 -106
  36. data/assets/stylesheets/bootstrap/_carousel.scss +65 -33
  37. data/assets/stylesheets/bootstrap/_close.scss +30 -31
  38. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  39. data/assets/stylesheets/bootstrap/_dropdown.scss +87 -38
  40. data/assets/stylesheets/bootstrap/_forms.scss +9 -338
  41. data/assets/stylesheets/bootstrap/_functions.scss +99 -28
  42. data/assets/stylesheets/bootstrap/_grid.scss +3 -50
  43. data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
  44. data/assets/stylesheets/bootstrap/_list-group.scss +38 -22
  45. data/assets/stylesheets/bootstrap/_mixins.scss +8 -13
  46. data/assets/stylesheets/bootstrap/_modal.scss +45 -65
  47. data/assets/stylesheets/bootstrap/_nav.scss +28 -9
  48. data/assets/stylesheets/bootstrap/_navbar.scss +51 -69
  49. data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
  50. data/assets/stylesheets/bootstrap/_pagination.scss +11 -20
  51. data/assets/stylesheets/bootstrap/_popover.scss +15 -27
  52. data/assets/stylesheets/bootstrap/_progress.scss +6 -4
  53. data/assets/stylesheets/bootstrap/_reboot.scss +339 -200
  54. data/assets/stylesheets/bootstrap/_root.scss +5 -9
  55. data/assets/stylesheets/bootstrap/_spinners.scss +21 -7
  56. data/assets/stylesheets/bootstrap/_tables.scss +80 -114
  57. data/assets/stylesheets/bootstrap/_toasts.scss +21 -14
  58. data/assets/stylesheets/bootstrap/_tooltip.scss +17 -17
  59. data/assets/stylesheets/bootstrap/_transitions.scss +2 -1
  60. data/assets/stylesheets/bootstrap/_type.scss +38 -59
  61. data/assets/stylesheets/bootstrap/_utilities.scss +594 -17
  62. data/assets/stylesheets/bootstrap/_variables.scss +810 -489
  63. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
  64. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
  65. data/assets/stylesheets/bootstrap/forms/_form-check.scss +152 -0
  66. data/assets/stylesheets/bootstrap/forms/_form-control.scss +219 -0
  67. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  68. data/assets/stylesheets/bootstrap/forms/_form-select.scss +67 -0
  69. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  70. data/assets/stylesheets/bootstrap/forms/_input-group.scss +121 -0
  71. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  72. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  73. data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
  74. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
  75. data/assets/stylesheets/bootstrap/helpers/_position.scss +30 -0
  76. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  77. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  78. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  79. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  80. data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -5
  81. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +37 -22
  82. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
  83. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +14 -10
  84. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +75 -52
  85. data/assets/stylesheets/bootstrap/mixins/_caret.scss +10 -8
  86. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  87. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  88. data/assets/stylesheets/bootstrap/mixins/_container.scss +9 -0
  89. data/assets/stylesheets/bootstrap/mixins/_forms.scss +42 -75
  90. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  91. data/assets/stylesheets/bootstrap/mixins/_grid.scss +90 -34
  92. data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -21
  93. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
  94. data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
  95. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +17 -8
  96. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  97. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
  98. data/assets/stylesheets/bootstrap/mixins/_transition.scss +18 -8
  99. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +68 -0
  100. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
  101. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  102. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +234 -126
  103. data/bootstrap.gemspec +1 -3
  104. data/lib/bootstrap/version.rb +2 -2
  105. data/tasks/updater/js.rb +20 -5
  106. data/tasks/updater/network.rb +8 -2
  107. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  108. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  109. data/test/dummy_rails/app/views/pages/root.html +89 -0
  110. data/test/dummy_rails/config/application.rb +0 -3
  111. data/test/gemfiles/rails_6_0.gemfile +7 -0
  112. data/test/gemfiles/rails_6_1.gemfile +7 -0
  113. metadata +48 -73
  114. data/assets/javascripts/bootstrap/util.js +0 -188
  115. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  116. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -521
  117. data/assets/stylesheets/bootstrap/_input-group.scss +0 -191
  118. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  119. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  120. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  121. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -22
  122. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  123. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  124. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -71
  125. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  126. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -11
  127. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -34
  128. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  129. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  130. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -17
  131. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  132. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  133. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  134. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  135. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  136. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  137. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  138. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  139. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  140. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  141. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  142. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  143. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  144. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  145. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  146. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  147. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  148. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  149. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
@@ -0,0 +1,85 @@
1
+ /*!
2
+ * Bootstrap selector-engine.js v5.0.1 (https://getbootstrap.com/)
3
+ * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ */
6
+ (function (global, factory) {
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
8
+ typeof define === 'function' && define.amd ? define(factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SelectorEngine = factory());
10
+ }(this, (function () { 'use strict';
11
+
12
+ /**
13
+ * --------------------------------------------------------------------------
14
+ * Bootstrap (v5.0.1): dom/selector-engine.js
15
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
+ * --------------------------------------------------------------------------
17
+ */
18
+
19
+ /**
20
+ * ------------------------------------------------------------------------
21
+ * Constants
22
+ * ------------------------------------------------------------------------
23
+ */
24
+ const NODE_TEXT = 3;
25
+ const SelectorEngine = {
26
+ find(selector, element = document.documentElement) {
27
+ return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
28
+ },
29
+
30
+ findOne(selector, element = document.documentElement) {
31
+ return Element.prototype.querySelector.call(element, selector);
32
+ },
33
+
34
+ children(element, selector) {
35
+ return [].concat(...element.children).filter(child => child.matches(selector));
36
+ },
37
+
38
+ parents(element, selector) {
39
+ const parents = [];
40
+ let ancestor = element.parentNode;
41
+
42
+ while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
43
+ if (ancestor.matches(selector)) {
44
+ parents.push(ancestor);
45
+ }
46
+
47
+ ancestor = ancestor.parentNode;
48
+ }
49
+
50
+ return parents;
51
+ },
52
+
53
+ prev(element, selector) {
54
+ let previous = element.previousElementSibling;
55
+
56
+ while (previous) {
57
+ if (previous.matches(selector)) {
58
+ return [previous];
59
+ }
60
+
61
+ previous = previous.previousElementSibling;
62
+ }
63
+
64
+ return [];
65
+ },
66
+
67
+ next(element, selector) {
68
+ let next = element.nextElementSibling;
69
+
70
+ while (next) {
71
+ if (next.matches(selector)) {
72
+ return [next];
73
+ }
74
+
75
+ next = next.nextElementSibling;
76
+ }
77
+
78
+ return [];
79
+ }
80
+
81
+ };
82
+
83
+ return SelectorEngine;
84
+
85
+ })));
@@ -1,160 +1,252 @@
1
1
  /*!
2
- * Bootstrap dropdown.js 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)
2
+ * Bootstrap dropdown.js v5.0.1 (https://getbootstrap.com/)
3
+ * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
7
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('popper.js'), require('./util.js')) :
8
- typeof define === 'function' && define.amd ? define(['jquery', 'popper.js', './util.js'], factory) :
9
- (global = global || self, global.Dropdown = factory(global.jQuery, global.Popper, global.Util));
10
- }(this, (function ($, Popper, Util) { 'use strict';
11
-
12
- $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
13
- Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
14
- Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
15
-
16
- function _defineProperties(target, props) {
17
- for (var i = 0; i < props.length; i++) {
18
- var descriptor = props[i];
19
- descriptor.enumerable = descriptor.enumerable || false;
20
- descriptor.configurable = true;
21
- if ("value" in descriptor) descriptor.writable = true;
22
- Object.defineProperty(target, descriptor.key, descriptor);
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./dom/selector-engine.js'), require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./base-component.js')) :
8
+ typeof define === 'function' && define.amd ? define(['@popperjs/core', './dom/selector-engine', './dom/data', './dom/event-handler', './dom/manipulator', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global.Popper, global.SelectorEngine, global.Data, global.EventHandler, global.Manipulator, global.Base));
10
+ }(this, (function (Popper, SelectorEngine, Data, EventHandler, Manipulator, BaseComponent) { 'use strict';
11
+
12
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
+
14
+ function _interopNamespace(e) {
15
+ if (e && e.__esModule) return e;
16
+ var n = Object.create(null);
17
+ if (e) {
18
+ Object.keys(e).forEach(function (k) {
19
+ if (k !== 'default') {
20
+ var d = Object.getOwnPropertyDescriptor(e, k);
21
+ Object.defineProperty(n, k, d.get ? d : {
22
+ enumerable: true,
23
+ get: function () {
24
+ return e[k];
25
+ }
26
+ });
27
+ }
28
+ });
23
29
  }
30
+ n['default'] = e;
31
+ return Object.freeze(n);
24
32
  }
25
33
 
26
- function _createClass(Constructor, protoProps, staticProps) {
27
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
28
- if (staticProps) _defineProperties(Constructor, staticProps);
29
- return Constructor;
30
- }
34
+ var Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
35
+ var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
36
+ var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
37
+ var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
38
+ var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
39
+ var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
31
40
 
32
- function _defineProperty(obj, key, value) {
33
- if (key in obj) {
34
- Object.defineProperty(obj, key, {
35
- value: value,
36
- enumerable: true,
37
- configurable: true,
38
- writable: true
39
- });
40
- } else {
41
- obj[key] = value;
41
+ const toType = obj => {
42
+ if (obj === null || obj === undefined) {
43
+ return `${obj}`;
42
44
  }
43
45
 
44
- return obj;
45
- }
46
+ return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
47
+ };
46
48
 
47
- function ownKeys(object, enumerableOnly) {
48
- var keys = Object.keys(object);
49
+ const getSelector = element => {
50
+ let selector = element.getAttribute('data-bs-target');
49
51
 
50
- if (Object.getOwnPropertySymbols) {
51
- var symbols = Object.getOwnPropertySymbols(object);
52
- if (enumerableOnly) symbols = symbols.filter(function (sym) {
53
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
54
- });
55
- keys.push.apply(keys, symbols);
56
- }
52
+ if (!selector || selector === '#') {
53
+ let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
54
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
55
+ // `document.querySelector` will rightfully complain it is invalid.
56
+ // See https://github.com/twbs/bootstrap/issues/32273
57
57
 
58
- return keys;
59
- }
58
+ if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
59
+ return null;
60
+ } // Just in case some CMS puts out a full URL with the anchor appended
60
61
 
61
- function _objectSpread2(target) {
62
- for (var i = 1; i < arguments.length; i++) {
63
- var source = arguments[i] != null ? arguments[i] : {};
64
62
 
65
- if (i % 2) {
66
- ownKeys(Object(source), true).forEach(function (key) {
67
- _defineProperty(target, key, source[key]);
68
- });
69
- } else if (Object.getOwnPropertyDescriptors) {
70
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
71
- } else {
72
- ownKeys(Object(source)).forEach(function (key) {
73
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
74
- });
63
+ if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
64
+ hrefAttr = `#${hrefAttr.split('#')[1]}`;
75
65
  }
66
+
67
+ selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
76
68
  }
77
69
 
78
- return target;
79
- }
70
+ return selector;
71
+ };
80
72
 
81
- /**
82
- * ------------------------------------------------------------------------
83
- * Constants
84
- * ------------------------------------------------------------------------
85
- */
73
+ const getElementFromSelector = element => {
74
+ const selector = getSelector(element);
75
+ return selector ? document.querySelector(selector) : null;
76
+ };
77
+
78
+ const isElement = obj => {
79
+ if (!obj || typeof obj !== 'object') {
80
+ return false;
81
+ }
82
+
83
+ if (typeof obj.jquery !== 'undefined') {
84
+ obj = obj[0];
85
+ }
86
+
87
+ return typeof obj.nodeType !== 'undefined';
88
+ };
86
89
 
87
- var NAME = 'dropdown';
88
- var VERSION = '4.4.1';
89
- var DATA_KEY = 'bs.dropdown';
90
- var EVENT_KEY = "." + DATA_KEY;
91
- var DATA_API_KEY = '.data-api';
92
- var JQUERY_NO_CONFLICT = $.fn[NAME];
93
- var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
90
+ const getElement = obj => {
91
+ if (isElement(obj)) {
92
+ // it's a jQuery object or a node element
93
+ return obj.jquery ? obj[0] : obj;
94
+ }
94
95
 
95
- var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
96
+ if (typeof obj === 'string' && obj.length > 0) {
97
+ return SelectorEngine__default['default'].findOne(obj);
98
+ }
96
99
 
97
- var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
100
+ return null;
101
+ };
98
102
 
99
- var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
103
+ const typeCheckConfig = (componentName, config, configTypes) => {
104
+ Object.keys(configTypes).forEach(property => {
105
+ const expectedTypes = configTypes[property];
106
+ const value = config[property];
107
+ const valueType = value && isElement(value) ? 'element' : toType(value);
100
108
 
101
- var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
109
+ if (!new RegExp(expectedTypes).test(valueType)) {
110
+ throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
111
+ }
112
+ });
113
+ };
102
114
 
103
- var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
115
+ const isVisible = element => {
116
+ if (!element) {
117
+ return false;
118
+ }
104
119
 
105
- var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
106
- var Event = {
107
- HIDE: "hide" + EVENT_KEY,
108
- HIDDEN: "hidden" + EVENT_KEY,
109
- SHOW: "show" + EVENT_KEY,
110
- SHOWN: "shown" + EVENT_KEY,
111
- CLICK: "click" + EVENT_KEY,
112
- CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
113
- KEYDOWN_DATA_API: "keydown" + EVENT_KEY + DATA_API_KEY,
114
- KEYUP_DATA_API: "keyup" + EVENT_KEY + DATA_API_KEY
120
+ if (element.style && element.parentNode && element.parentNode.style) {
121
+ const elementStyle = getComputedStyle(element);
122
+ const parentNodeStyle = getComputedStyle(element.parentNode);
123
+ return elementStyle.display !== 'none' && parentNodeStyle.display !== 'none' && elementStyle.visibility !== 'hidden';
124
+ }
125
+
126
+ return false;
115
127
  };
116
- var ClassName = {
117
- DISABLED: 'disabled',
118
- SHOW: 'show',
119
- DROPUP: 'dropup',
120
- DROPRIGHT: 'dropright',
121
- DROPLEFT: 'dropleft',
122
- MENURIGHT: 'dropdown-menu-right',
123
- MENULEFT: 'dropdown-menu-left',
124
- POSITION_STATIC: 'position-static'
128
+
129
+ const isDisabled = element => {
130
+ if (!element || element.nodeType !== Node.ELEMENT_NODE) {
131
+ return true;
132
+ }
133
+
134
+ if (element.classList.contains('disabled')) {
135
+ return true;
136
+ }
137
+
138
+ if (typeof element.disabled !== 'undefined') {
139
+ return element.disabled;
140
+ }
141
+
142
+ return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
125
143
  };
126
- var Selector = {
127
- DATA_TOGGLE: '[data-toggle="dropdown"]',
128
- FORM_CHILD: '.dropdown form',
129
- MENU: '.dropdown-menu',
130
- NAVBAR_NAV: '.navbar-nav',
131
- VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
144
+
145
+ const noop = () => {};
146
+
147
+ const getjQuery = () => {
148
+ const {
149
+ jQuery
150
+ } = window;
151
+
152
+ if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
153
+ return jQuery;
154
+ }
155
+
156
+ return null;
132
157
  };
133
- var AttachmentMap = {
134
- TOP: 'top-start',
135
- TOPEND: 'top-end',
136
- BOTTOM: 'bottom-start',
137
- BOTTOMEND: 'bottom-end',
138
- RIGHT: 'right-start',
139
- RIGHTEND: 'right-end',
140
- LEFT: 'left-start',
141
- LEFTEND: 'left-end'
158
+
159
+ const onDOMContentLoaded = callback => {
160
+ if (document.readyState === 'loading') {
161
+ document.addEventListener('DOMContentLoaded', callback);
162
+ } else {
163
+ callback();
164
+ }
142
165
  };
143
- var Default = {
144
- offset: 0,
145
- flip: true,
146
- boundary: 'scrollParent',
166
+
167
+ const isRTL = () => document.documentElement.dir === 'rtl';
168
+
169
+ const defineJQueryPlugin = plugin => {
170
+ onDOMContentLoaded(() => {
171
+ const $ = getjQuery();
172
+ /* istanbul ignore if */
173
+
174
+ if ($) {
175
+ const name = plugin.NAME;
176
+ const JQUERY_NO_CONFLICT = $.fn[name];
177
+ $.fn[name] = plugin.jQueryInterface;
178
+ $.fn[name].Constructor = plugin;
179
+
180
+ $.fn[name].noConflict = () => {
181
+ $.fn[name] = JQUERY_NO_CONFLICT;
182
+ return plugin.jQueryInterface;
183
+ };
184
+ }
185
+ });
186
+ };
187
+
188
+ /**
189
+ * --------------------------------------------------------------------------
190
+ * Bootstrap (v5.0.1): dropdown.js
191
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
192
+ * --------------------------------------------------------------------------
193
+ */
194
+ /**
195
+ * ------------------------------------------------------------------------
196
+ * Constants
197
+ * ------------------------------------------------------------------------
198
+ */
199
+
200
+ const NAME = 'dropdown';
201
+ const DATA_KEY = 'bs.dropdown';
202
+ const EVENT_KEY = `.${DATA_KEY}`;
203
+ const DATA_API_KEY = '.data-api';
204
+ const ESCAPE_KEY = 'Escape';
205
+ const SPACE_KEY = 'Space';
206
+ const TAB_KEY = 'Tab';
207
+ const ARROW_UP_KEY = 'ArrowUp';
208
+ const ARROW_DOWN_KEY = 'ArrowDown';
209
+ const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
210
+
211
+ const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`);
212
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
213
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
214
+ const EVENT_SHOW = `show${EVENT_KEY}`;
215
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
216
+ const EVENT_CLICK = `click${EVENT_KEY}`;
217
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
218
+ const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`;
219
+ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`;
220
+ const CLASS_NAME_SHOW = 'show';
221
+ const CLASS_NAME_DROPUP = 'dropup';
222
+ const CLASS_NAME_DROPEND = 'dropend';
223
+ const CLASS_NAME_DROPSTART = 'dropstart';
224
+ const CLASS_NAME_NAVBAR = 'navbar';
225
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]';
226
+ const SELECTOR_MENU = '.dropdown-menu';
227
+ const SELECTOR_NAVBAR_NAV = '.navbar-nav';
228
+ const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
229
+ const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
230
+ const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
231
+ const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
232
+ const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
233
+ const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
234
+ const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
235
+ const Default = {
236
+ offset: [0, 2],
237
+ boundary: 'clippingParents',
147
238
  reference: 'toggle',
148
239
  display: 'dynamic',
149
- popperConfig: null
240
+ popperConfig: null,
241
+ autoClose: true
150
242
  };
151
- var DefaultType = {
152
- offset: '(number|string|function)',
153
- flip: 'boolean',
243
+ const DefaultType = {
244
+ offset: '(array|string|function)',
154
245
  boundary: '(string|element)',
155
- reference: '(string|element)',
246
+ reference: '(string|element|object)',
156
247
  display: 'string',
157
- popperConfig: '(null|object)'
248
+ popperConfig: '(null|object|function)',
249
+ autoClose: '(boolean|string)'
158
250
  };
159
251
  /**
160
252
  * ------------------------------------------------------------------------
@@ -162,11 +254,9 @@
162
254
  * ------------------------------------------------------------------------
163
255
  */
164
256
 
165
- var Dropdown =
166
- /*#__PURE__*/
167
- function () {
168
- function Dropdown(element, config) {
169
- this._element = element;
257
+ class Dropdown extends BaseComponent__default['default'] {
258
+ constructor(element, config) {
259
+ super(element);
170
260
  this._popper = null;
171
261
  this._config = this._getConfig(config);
172
262
  this._menu = this._getMenuElement();
@@ -176,329 +266,344 @@
176
266
  } // Getters
177
267
 
178
268
 
179
- var _proto = Dropdown.prototype;
269
+ static get Default() {
270
+ return Default;
271
+ }
180
272
 
181
- // Public
182
- _proto.toggle = function toggle() {
183
- if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {
184
- return;
185
- }
273
+ static get DefaultType() {
274
+ return DefaultType;
275
+ }
186
276
 
187
- var isActive = $(this._menu).hasClass(ClassName.SHOW);
277
+ static get NAME() {
278
+ return NAME;
279
+ } // Public
188
280
 
189
- Dropdown._clearMenus();
190
281
 
191
- if (isActive) {
282
+ toggle() {
283
+ if (isDisabled(this._element)) {
192
284
  return;
193
285
  }
194
286
 
195
- this.show(true);
196
- };
287
+ const isActive = this._element.classList.contains(CLASS_NAME_SHOW);
197
288
 
198
- _proto.show = function show(usePopper) {
199
- if (usePopper === void 0) {
200
- usePopper = false;
289
+ if (isActive) {
290
+ this.hide();
291
+ return;
201
292
  }
202
293
 
203
- if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {
294
+ this.show();
295
+ }
296
+
297
+ show() {
298
+ if (isDisabled(this._element) || this._menu.classList.contains(CLASS_NAME_SHOW)) {
204
299
  return;
205
300
  }
206
301
 
207
- var relatedTarget = {
302
+ const parent = Dropdown.getParentFromElement(this._element);
303
+ const relatedTarget = {
208
304
  relatedTarget: this._element
209
305
  };
210
- var showEvent = $.Event(Event.SHOW, relatedTarget);
211
-
212
- var parent = Dropdown._getParentFromElement(this._element);
306
+ const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, relatedTarget);
213
307
 
214
- $(parent).trigger(showEvent);
215
-
216
- if (showEvent.isDefaultPrevented()) {
308
+ if (showEvent.defaultPrevented) {
217
309
  return;
218
- } // Disable totally Popper.js for Dropdown in Navbar
310
+ } // Totally disable Popper for Dropdowns in Navbar
219
311
 
220
312
 
221
- if (!this._inNavbar && usePopper) {
222
- /**
223
- * Check for Popper dependency
224
- * Popper - https://popper.js.org
225
- */
226
- if (typeof Popper === 'undefined') {
227
- throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)');
313
+ if (this._inNavbar) {
314
+ Manipulator__default['default'].setDataAttribute(this._menu, 'popper', 'none');
315
+ } else {
316
+ if (typeof Popper__namespace === 'undefined') {
317
+ throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
228
318
  }
229
319
 
230
- var referenceElement = this._element;
320
+ let referenceElement = this._element;
231
321
 
232
322
  if (this._config.reference === 'parent') {
233
323
  referenceElement = parent;
234
- } else if (Util.isElement(this._config.reference)) {
235
- referenceElement = this._config.reference; // Check if it's jQuery element
324
+ } else if (isElement(this._config.reference)) {
325
+ referenceElement = getElement(this._config.reference);
326
+ } else if (typeof this._config.reference === 'object') {
327
+ referenceElement = this._config.reference;
328
+ }
236
329
 
237
- if (typeof this._config.reference.jquery !== 'undefined') {
238
- referenceElement = this._config.reference[0];
239
- }
240
- } // If boundary is not `scrollParent`, then set position to `static`
241
- // to allow the menu to "escape" the scroll parent's boundaries
242
- // https://github.com/twbs/bootstrap/issues/24251
330
+ const popperConfig = this._getPopperConfig();
243
331
 
332
+ const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);
333
+ this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
244
334
 
245
- if (this._config.boundary !== 'scrollParent') {
246
- $(parent).addClass(ClassName.POSITION_STATIC);
335
+ if (isDisplayStatic) {
336
+ Manipulator__default['default'].setDataAttribute(this._menu, 'popper', 'static');
247
337
  }
248
-
249
- this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());
250
338
  } // If this is a touch-enabled device we add extra
251
339
  // empty mouseover listeners to the body's immediate children;
252
340
  // only needed because of broken event delegation on iOS
253
341
  // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
254
342
 
255
343
 
256
- if ('ontouchstart' in document.documentElement && $(parent).closest(Selector.NAVBAR_NAV).length === 0) {
257
- $(document.body).children().on('mouseover', null, $.noop);
344
+ if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
345
+ [].concat(...document.body.children).forEach(elem => EventHandler__default['default'].on(elem, 'mouseover', noop));
258
346
  }
259
347
 
260
348
  this._element.focus();
261
349
 
262
350
  this._element.setAttribute('aria-expanded', true);
263
351
 
264
- $(this._menu).toggleClass(ClassName.SHOW);
265
- $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget));
266
- };
352
+ this._menu.classList.toggle(CLASS_NAME_SHOW);
353
+
354
+ this._element.classList.toggle(CLASS_NAME_SHOW);
267
355
 
268
- _proto.hide = function hide() {
269
- if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {
356
+ EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, relatedTarget);
357
+ }
358
+
359
+ hide() {
360
+ if (isDisabled(this._element) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
270
361
  return;
271
362
  }
272
363
 
273
- var relatedTarget = {
364
+ const relatedTarget = {
274
365
  relatedTarget: this._element
275
366
  };
276
- var hideEvent = $.Event(Event.HIDE, relatedTarget);
277
-
278
- var parent = Dropdown._getParentFromElement(this._element);
279
367
 
280
- $(parent).trigger(hideEvent);
368
+ this._completeHide(relatedTarget);
369
+ }
281
370
 
282
- if (hideEvent.isDefaultPrevented()) {
283
- return;
371
+ dispose() {
372
+ if (this._popper) {
373
+ this._popper.destroy();
284
374
  }
285
375
 
376
+ super.dispose();
377
+ }
378
+
379
+ update() {
380
+ this._inNavbar = this._detectNavbar();
381
+
286
382
  if (this._popper) {
287
- this._popper.destroy();
383
+ this._popper.update();
288
384
  }
385
+ } // Private
289
386
 
290
- $(this._menu).toggleClass(ClassName.SHOW);
291
- $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
292
- };
293
387
 
294
- _proto.dispose = function dispose() {
295
- $.removeData(this._element, DATA_KEY);
296
- $(this._element).off(EVENT_KEY);
297
- this._element = null;
298
- this._menu = null;
388
+ _addEventListeners() {
389
+ EventHandler__default['default'].on(this._element, EVENT_CLICK, event => {
390
+ event.preventDefault();
391
+ this.toggle();
392
+ });
393
+ }
299
394
 
300
- if (this._popper !== null) {
301
- this._popper.destroy();
395
+ _completeHide(relatedTarget) {
396
+ const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE, relatedTarget);
302
397
 
303
- this._popper = null;
304
- }
305
- };
398
+ if (hideEvent.defaultPrevented) {
399
+ return;
400
+ } // If this is a touch-enabled device we remove the extra
401
+ // empty mouseover listeners we added for iOS support
306
402
 
307
- _proto.update = function update() {
308
- this._inNavbar = this._detectNavbar();
309
403
 
310
- if (this._popper !== null) {
311
- this._popper.scheduleUpdate();
404
+ if ('ontouchstart' in document.documentElement) {
405
+ [].concat(...document.body.children).forEach(elem => EventHandler__default['default'].off(elem, 'mouseover', noop));
312
406
  }
313
- } // Private
314
- ;
315
407
 
316
- _proto._addEventListeners = function _addEventListeners() {
317
- var _this = this;
408
+ if (this._popper) {
409
+ this._popper.destroy();
410
+ }
318
411
 
319
- $(this._element).on(Event.CLICK, function (event) {
320
- event.preventDefault();
321
- event.stopPropagation();
412
+ this._menu.classList.remove(CLASS_NAME_SHOW);
322
413
 
323
- _this.toggle();
324
- });
325
- };
414
+ this._element.classList.remove(CLASS_NAME_SHOW);
415
+
416
+ this._element.setAttribute('aria-expanded', 'false');
417
+
418
+ Manipulator__default['default'].removeDataAttribute(this._menu, 'popper');
419
+ EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN, relatedTarget);
420
+ }
421
+
422
+ _getConfig(config) {
423
+ config = { ...this.constructor.Default,
424
+ ...Manipulator__default['default'].getDataAttributes(this._element),
425
+ ...config
426
+ };
427
+ typeCheckConfig(NAME, config, this.constructor.DefaultType);
428
+
429
+ if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
430
+ // Popper virtual elements require a getBoundingClientRect method
431
+ throw new TypeError(`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
432
+ }
326
433
 
327
- _proto._getConfig = function _getConfig(config) {
328
- config = _objectSpread2({}, this.constructor.Default, {}, $(this._element).data(), {}, config);
329
- Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
330
434
  return config;
331
- };
435
+ }
332
436
 
333
- _proto._getMenuElement = function _getMenuElement() {
334
- if (!this._menu) {
335
- var parent = Dropdown._getParentFromElement(this._element);
437
+ _getMenuElement() {
438
+ return SelectorEngine__default['default'].next(this._element, SELECTOR_MENU)[0];
439
+ }
336
440
 
337
- if (parent) {
338
- this._menu = parent.querySelector(Selector.MENU);
339
- }
441
+ _getPlacement() {
442
+ const parentDropdown = this._element.parentNode;
443
+
444
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
445
+ return PLACEMENT_RIGHT;
340
446
  }
341
447
 
342
- return this._menu;
343
- };
448
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
449
+ return PLACEMENT_LEFT;
450
+ } // We need to trim the value because custom properties can also include spaces
344
451
 
345
- _proto._getPlacement = function _getPlacement() {
346
- var $parentDropdown = $(this._element.parentNode);
347
- var placement = AttachmentMap.BOTTOM; // Handle dropup
348
452
 
349
- if ($parentDropdown.hasClass(ClassName.DROPUP)) {
350
- placement = AttachmentMap.TOP;
453
+ const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
351
454
 
352
- if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
353
- placement = AttachmentMap.TOPEND;
354
- }
355
- } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {
356
- placement = AttachmentMap.RIGHT;
357
- } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {
358
- placement = AttachmentMap.LEFT;
359
- } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
360
- placement = AttachmentMap.BOTTOMEND;
455
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
456
+ return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
361
457
  }
362
458
 
363
- return placement;
364
- };
459
+ return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
460
+ }
365
461
 
366
- _proto._detectNavbar = function _detectNavbar() {
367
- return $(this._element).closest('.navbar').length > 0;
368
- };
462
+ _detectNavbar() {
463
+ return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;
464
+ }
369
465
 
370
- _proto._getOffset = function _getOffset() {
371
- var _this2 = this;
466
+ _getOffset() {
467
+ const {
468
+ offset
469
+ } = this._config;
372
470
 
373
- var offset = {};
471
+ if (typeof offset === 'string') {
472
+ return offset.split(',').map(val => Number.parseInt(val, 10));
473
+ }
374
474
 
375
- if (typeof this._config.offset === 'function') {
376
- offset.fn = function (data) {
377
- data.offsets = _objectSpread2({}, data.offsets, {}, _this2._config.offset(data.offsets, _this2._element) || {});
378
- return data;
379
- };
380
- } else {
381
- offset.offset = this._config.offset;
475
+ if (typeof offset === 'function') {
476
+ return popperData => offset(popperData, this._element);
382
477
  }
383
478
 
384
479
  return offset;
385
- };
480
+ }
386
481
 
387
- _proto._getPopperConfig = function _getPopperConfig() {
388
- var popperConfig = {
482
+ _getPopperConfig() {
483
+ const defaultBsPopperConfig = {
389
484
  placement: this._getPlacement(),
390
- modifiers: {
391
- offset: this._getOffset(),
392
- flip: {
393
- enabled: this._config.flip
394
- },
395
- preventOverflow: {
396
- boundariesElement: this._config.boundary
485
+ modifiers: [{
486
+ name: 'preventOverflow',
487
+ options: {
488
+ boundary: this._config.boundary
397
489
  }
398
- }
399
- }; // Disable Popper.js if we have a static display
490
+ }, {
491
+ name: 'offset',
492
+ options: {
493
+ offset: this._getOffset()
494
+ }
495
+ }]
496
+ }; // Disable Popper if we have a static display
400
497
 
401
498
  if (this._config.display === 'static') {
402
- popperConfig.modifiers.applyStyle = {
499
+ defaultBsPopperConfig.modifiers = [{
500
+ name: 'applyStyles',
403
501
  enabled: false
404
- };
502
+ }];
405
503
  }
406
504
 
407
- return _objectSpread2({}, popperConfig, {}, this._config.popperConfig);
408
- } // Static
409
- ;
505
+ return { ...defaultBsPopperConfig,
506
+ ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
507
+ };
508
+ }
410
509
 
411
- Dropdown._jQueryInterface = function _jQueryInterface(config) {
412
- return this.each(function () {
413
- var data = $(this).data(DATA_KEY);
510
+ _selectMenuItem(event) {
511
+ const items = SelectorEngine__default['default'].find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);
414
512
 
415
- var _config = typeof config === 'object' ? config : null;
513
+ if (!items.length) {
514
+ return;
515
+ }
416
516
 
417
- if (!data) {
418
- data = new Dropdown(this, _config);
419
- $(this).data(DATA_KEY, data);
420
- }
517
+ let index = items.indexOf(event.target); // Up
421
518
 
422
- if (typeof config === 'string') {
423
- if (typeof data[config] === 'undefined') {
424
- throw new TypeError("No method named \"" + config + "\"");
425
- }
519
+ if (event.key === ARROW_UP_KEY && index > 0) {
520
+ index--;
521
+ } // Down
426
522
 
427
- data[config]();
428
- }
429
- });
430
- };
431
523
 
432
- Dropdown._clearMenus = function _clearMenus(event) {
433
- if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
434
- return;
435
- }
524
+ if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
525
+ index++;
526
+ } // index is -1 if the first keydown is an ArrowUp
436
527
 
437
- var toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
438
528
 
439
- for (var i = 0, len = toggles.length; i < len; i++) {
440
- var parent = Dropdown._getParentFromElement(toggles[i]);
529
+ index = index === -1 ? 0 : index;
530
+ items[index].focus();
531
+ } // Static
441
532
 
442
- var context = $(toggles[i]).data(DATA_KEY);
443
- var relatedTarget = {
444
- relatedTarget: toggles[i]
445
- };
446
533
 
447
- if (event && event.type === 'click') {
448
- relatedTarget.clickEvent = event;
449
- }
534
+ static dropdownInterface(element, config) {
535
+ let data = Data__default['default'].get(element, DATA_KEY);
450
536
 
451
- if (!context) {
452
- continue;
537
+ const _config = typeof config === 'object' ? config : null;
538
+
539
+ if (!data) {
540
+ data = new Dropdown(element, _config);
541
+ }
542
+
543
+ if (typeof config === 'string') {
544
+ if (typeof data[config] === 'undefined') {
545
+ throw new TypeError(`No method named "${config}"`);
453
546
  }
454
547
 
455
- var dropdownMenu = context._menu;
548
+ data[config]();
549
+ }
550
+ }
551
+
552
+ static jQueryInterface(config) {
553
+ return this.each(function () {
554
+ Dropdown.dropdownInterface(this, config);
555
+ });
556
+ }
557
+
558
+ static clearMenus(event) {
559
+ if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY)) {
560
+ return;
561
+ }
562
+
563
+ const toggles = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
564
+
565
+ for (let i = 0, len = toggles.length; i < len; i++) {
566
+ const context = Data__default['default'].get(toggles[i], DATA_KEY);
456
567
 
457
- if (!$(parent).hasClass(ClassName.SHOW)) {
568
+ if (!context || context._config.autoClose === false) {
458
569
  continue;
459
570
  }
460
571
 
461
- if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {
572
+ if (!context._element.classList.contains(CLASS_NAME_SHOW)) {
462
573
  continue;
463
574
  }
464
575
 
465
- var hideEvent = $.Event(Event.HIDE, relatedTarget);
466
- $(parent).trigger(hideEvent);
576
+ const relatedTarget = {
577
+ relatedTarget: context._element
578
+ };
467
579
 
468
- if (hideEvent.isDefaultPrevented()) {
469
- continue;
470
- } // If this is a touch-enabled device we remove the extra
471
- // empty mouseover listeners we added for iOS support
580
+ if (event) {
581
+ const composedPath = event.composedPath();
582
+ const isMenuTarget = composedPath.includes(context._menu);
472
583
 
584
+ if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
585
+ continue;
586
+ } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
473
587
 
474
- if ('ontouchstart' in document.documentElement) {
475
- $(document.body).children().off('mouseover', null, $.noop);
476
- }
477
588
 
478
- toggles[i].setAttribute('aria-expanded', 'false');
589
+ if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY || /input|select|option|textarea|form/i.test(event.target.tagName))) {
590
+ continue;
591
+ }
479
592
 
480
- if (context._popper) {
481
- context._popper.destroy();
593
+ if (event.type === 'click') {
594
+ relatedTarget.clickEvent = event;
595
+ }
482
596
  }
483
597
 
484
- $(dropdownMenu).removeClass(ClassName.SHOW);
485
- $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
486
- }
487
- };
488
-
489
- Dropdown._getParentFromElement = function _getParentFromElement(element) {
490
- var parent;
491
- var selector = Util.getSelectorFromElement(element);
492
-
493
- if (selector) {
494
- parent = document.querySelector(selector);
598
+ context._completeHide(relatedTarget);
495
599
  }
600
+ }
496
601
 
497
- return parent || element.parentNode;
498
- } // eslint-disable-next-line complexity
499
- ;
602
+ static getParentFromElement(element) {
603
+ return getElementFromSelector(element) || element.parentNode;
604
+ }
500
605
 
501
- Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
606
+ static dataApiKeydownHandler(event) {
502
607
  // If not input/textarea:
503
608
  // - And not a key in REGEXP_KEYDOWN => not a dropdown command
504
609
  // If input/textarea:
@@ -506,81 +611,45 @@
506
611
  // - If key is other than escape
507
612
  // - If key is not up or down => not a dropdown command
508
613
  // - If trigger inside the menu => not a dropdown command
509
- 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.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
614
+ if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) {
510
615
  return;
511
616
  }
512
617
 
513
- event.preventDefault();
514
- event.stopPropagation();
618
+ const isActive = this.classList.contains(CLASS_NAME_SHOW);
515
619
 
516
- if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
620
+ if (!isActive && event.key === ESCAPE_KEY) {
517
621
  return;
518
622
  }
519
623
 
520
- var parent = Dropdown._getParentFromElement(this);
521
-
522
- var isActive = $(parent).hasClass(ClassName.SHOW);
624
+ event.preventDefault();
625
+ event.stopPropagation();
523
626
 
524
- if (!isActive && event.which === ESCAPE_KEYCODE) {
627
+ if (isDisabled(this)) {
525
628
  return;
526
629
  }
527
630
 
528
- if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
529
- if (event.which === ESCAPE_KEYCODE) {
530
- var toggle = parent.querySelector(Selector.DATA_TOGGLE);
531
- $(toggle).trigger('focus');
532
- }
631
+ const getToggleButton = () => this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine__default['default'].prev(this, SELECTOR_DATA_TOGGLE)[0];
533
632
 
534
- $(this).trigger('click');
633
+ if (event.key === ESCAPE_KEY) {
634
+ getToggleButton().focus();
635
+ Dropdown.clearMenus();
535
636
  return;
536
637
  }
537
638
 
538
- var items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS)).filter(function (item) {
539
- return $(item).is(':visible');
540
- });
541
-
542
- if (items.length === 0) {
639
+ if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) {
640
+ getToggleButton().click();
543
641
  return;
544
642
  }
545
643
 
546
- var index = items.indexOf(event.target);
547
-
548
- if (event.which === ARROW_UP_KEYCODE && index > 0) {
549
- // Up
550
- index--;
551
- }
552
-
553
- if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
554
- // Down
555
- index++;
556
- }
557
-
558
- if (index < 0) {
559
- index = 0;
644
+ if (!isActive || event.key === SPACE_KEY) {
645
+ Dropdown.clearMenus();
646
+ return;
560
647
  }
561
648
 
562
- items[index].focus();
563
- };
564
-
565
- _createClass(Dropdown, null, [{
566
- key: "VERSION",
567
- get: function get() {
568
- return VERSION;
569
- }
570
- }, {
571
- key: "Default",
572
- get: function get() {
573
- return Default;
574
- }
575
- }, {
576
- key: "DefaultType",
577
- get: function get() {
578
- return DefaultType;
579
- }
580
- }]);
649
+ Dropdown.getInstance(getToggleButton())._selectMenuItem(event);
650
+ }
581
651
 
582
- return Dropdown;
583
- }();
652
+ }
584
653
  /**
585
654
  * ------------------------------------------------------------------------
586
655
  * Data Api implementation
@@ -588,27 +657,22 @@
588
657
  */
589
658
 
590
659
 
591
- $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + " " + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
660
+ EventHandler__default['default'].on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler);
661
+ EventHandler__default['default'].on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
662
+ EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus);
663
+ EventHandler__default['default'].on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
664
+ EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
592
665
  event.preventDefault();
593
- event.stopPropagation();
594
-
595
- Dropdown._jQueryInterface.call($(this), 'toggle');
596
- }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
597
- e.stopPropagation();
666
+ Dropdown.dropdownInterface(this);
598
667
  });
599
668
  /**
600
669
  * ------------------------------------------------------------------------
601
670
  * jQuery
602
671
  * ------------------------------------------------------------------------
672
+ * add .Dropdown to jQuery only if jQuery is present
603
673
  */
604
674
 
605
- $.fn[NAME] = Dropdown._jQueryInterface;
606
- $.fn[NAME].Constructor = Dropdown;
607
-
608
- $.fn[NAME].noConflict = function () {
609
- $.fn[NAME] = JQUERY_NO_CONFLICT;
610
- return Dropdown._jQueryInterface;
611
- };
675
+ defineJQueryPlugin(Dropdown);
612
676
 
613
677
  return Dropdown;
614
678