bootstrap 4.4.1 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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