bootstrap 5.2.3 → 5.3.2

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 (100) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +11 -5
  3. data/Gemfile +1 -0
  4. data/README.md +6 -2
  5. data/Rakefile +10 -1
  6. data/assets/javascripts/bootstrap/alert.js +22 -32
  7. data/assets/javascripts/bootstrap/base-component.js +22 -38
  8. data/assets/javascripts/bootstrap/button.js +19 -22
  9. data/assets/javascripts/bootstrap/carousel.js +52 -135
  10. data/assets/javascripts/bootstrap/collapse.js +40 -102
  11. data/assets/javascripts/bootstrap/dom/data.js +8 -12
  12. data/assets/javascripts/bootstrap/dom/event-handler.js +19 -66
  13. data/assets/javascripts/bootstrap/dom/manipulator.js +4 -17
  14. data/assets/javascripts/bootstrap/dom/selector-engine.js +42 -24
  15. data/assets/javascripts/bootstrap/dropdown.js +74 -145
  16. data/assets/javascripts/bootstrap/modal.js +53 -133
  17. data/assets/javascripts/bootstrap/offcanvas.js +50 -102
  18. data/assets/javascripts/bootstrap/popover.js +23 -29
  19. data/assets/javascripts/bootstrap/scrollspy.js +53 -90
  20. data/assets/javascripts/bootstrap/tab.js +63 -112
  21. data/assets/javascripts/bootstrap/toast.js +31 -73
  22. data/assets/javascripts/bootstrap/tooltip.js +75 -177
  23. data/assets/javascripts/bootstrap/util/backdrop.js +28 -54
  24. data/assets/javascripts/bootstrap/util/component-functions.js +13 -18
  25. data/assets/javascripts/bootstrap/util/config.js +15 -27
  26. data/assets/javascripts/bootstrap/util/focustrap.js +20 -36
  27. data/assets/javascripts/bootstrap/util/index.js +42 -111
  28. data/assets/javascripts/bootstrap/util/sanitizer.js +30 -42
  29. data/assets/javascripts/bootstrap/util/scrollbar.js +24 -50
  30. data/assets/javascripts/bootstrap/util/swipe.js +27 -48
  31. data/assets/javascripts/bootstrap/util/template-factory.js +25 -52
  32. data/assets/javascripts/bootstrap-sprockets.js +10 -10
  33. data/assets/javascripts/bootstrap.js +689 -1444
  34. data/assets/javascripts/bootstrap.min.js +3 -3
  35. data/assets/stylesheets/_bootstrap-grid.scss +1 -3
  36. data/assets/stylesheets/_bootstrap-reboot.scss +1 -0
  37. data/assets/stylesheets/_bootstrap-utilities.scss +19 -0
  38. data/assets/stylesheets/_bootstrap.scss +1 -0
  39. data/assets/stylesheets/bootstrap/_accordion.scss +9 -0
  40. data/assets/stylesheets/bootstrap/_alert.scss +8 -11
  41. data/assets/stylesheets/bootstrap/_button-group.scss +2 -2
  42. data/assets/stylesheets/bootstrap/_buttons.scss +3 -3
  43. data/assets/stylesheets/bootstrap/_card.scss +5 -0
  44. data/assets/stylesheets/bootstrap/_carousel.scss +20 -2
  45. data/assets/stylesheets/bootstrap/_close.scss +32 -9
  46. data/assets/stylesheets/bootstrap/_dropdown.scss +1 -0
  47. data/assets/stylesheets/bootstrap/_functions.scss +1 -1
  48. data/assets/stylesheets/bootstrap/_grid.scss +6 -0
  49. data/assets/stylesheets/bootstrap/_helpers.scss +2 -0
  50. data/assets/stylesheets/bootstrap/_list-group.scss +12 -7
  51. data/assets/stylesheets/bootstrap/_maps.scss +120 -0
  52. data/assets/stylesheets/bootstrap/_mixins.scss +1 -2
  53. data/assets/stylesheets/bootstrap/_nav.scss +42 -17
  54. data/assets/stylesheets/bootstrap/_navbar.scss +15 -4
  55. data/assets/stylesheets/bootstrap/_offcanvas.scss +4 -2
  56. data/assets/stylesheets/bootstrap/_pagination.scss +1 -1
  57. data/assets/stylesheets/bootstrap/_progress.scss +10 -1
  58. data/assets/stylesheets/bootstrap/_reboot.scss +8 -7
  59. data/assets/stylesheets/bootstrap/_root.scss +124 -10
  60. data/assets/stylesheets/bootstrap/_tables.scss +18 -11
  61. data/assets/stylesheets/bootstrap/_tooltip.scss +4 -5
  62. data/assets/stylesheets/bootstrap/_utilities.scss +175 -16
  63. data/assets/stylesheets/bootstrap/_variables-dark.scss +87 -0
  64. data/assets/stylesheets/bootstrap/_variables.scss +282 -169
  65. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +23 -3
  66. data/assets/stylesheets/bootstrap/forms/_form-check.scss +26 -12
  67. data/assets/stylesheets/bootstrap/forms/_form-control.scss +24 -4
  68. data/assets/stylesheets/bootstrap/forms/_form-range.scss +3 -3
  69. data/assets/stylesheets/bootstrap/forms/_form-select.scss +12 -3
  70. data/assets/stylesheets/bootstrap/forms/_input-group.scss +1 -1
  71. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +1 -4
  72. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +20 -2
  73. data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
  74. data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
  75. data/assets/stylesheets/bootstrap/helpers/_vr.scss +1 -1
  76. data/assets/stylesheets/bootstrap/mixins/_alert.scss +4 -1
  77. data/assets/stylesheets/bootstrap/mixins/_banner.scss +2 -4
  78. data/assets/stylesheets/bootstrap/mixins/_caret.scss +30 -25
  79. data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
  80. data/assets/stylesheets/bootstrap/mixins/_forms.scss +8 -7
  81. data/assets/stylesheets/bootstrap/mixins/_grid.scss +1 -1
  82. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +2 -0
  83. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +1 -1
  84. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +5 -1
  85. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +23 -29
  86. data/bootstrap.gemspec +4 -3
  87. data/lib/bootstrap/engine.rb +7 -1
  88. data/lib/bootstrap/version.rb +2 -2
  89. data/tasks/updater/js.rb +1 -1
  90. data/tasks/updater/scss.rb +2 -2
  91. data/test/gemfiles/rails_4_2.gemfile +1 -1
  92. data/test/gemfiles/rails_5_0.gemfile +1 -1
  93. data/test/gemfiles/rails_5_1.gemfile +1 -1
  94. data/test/gemfiles/rails_5_2.gemfile +1 -1
  95. data/test/gemfiles/rails_6_0.gemfile +1 -0
  96. data/test/gemfiles/rails_6_1.gemfile +1 -0
  97. data/test/gemfiles/rails_7_0_dartsass.gemfile +8 -0
  98. data/test/gemfiles/{rails_7_0.gemfile → rails_7_0_sassc.gemfile} +1 -0
  99. metadata +35 -15
  100. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +0 -18
@@ -1,26 +1,22 @@
1
1
  /*!
2
- * Bootstrap collapse.js v5.2.3 (https://getbootstrap.com/)
3
- * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap collapse.js v5.3.2 (https://getbootstrap.com/)
3
+ * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
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('./util/index'), require('./dom/event-handler'), require('./dom/selector-engine'), require('./base-component')) :
8
- typeof define === 'function' && define.amd ? define(['./util/index', './dom/event-handler', './dom/selector-engine', './base-component'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Collapse = factory(global.Index, global.EventHandler, global.SelectorEngine, global.BaseComponent));
10
- })(this, (function (index, EventHandler, SelectorEngine, BaseComponent) { 'use strict';
11
-
12
- const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
13
-
14
- const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
15
- const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
16
- const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/index.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/selector-engine', './util/index'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Collapse = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Index));
10
+ })(this, (function (BaseComponent, EventHandler, SelectorEngine, index_js) { 'use strict';
17
11
 
18
12
  /**
19
13
  * --------------------------------------------------------------------------
20
- * Bootstrap (v5.2.3): collapse.js
14
+ * Bootstrap collapse.js
21
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
22
16
  * --------------------------------------------------------------------------
23
17
  */
18
+
19
+
24
20
  /**
25
21
  * Constants
26
22
  */
@@ -52,51 +48,45 @@
52
48
  parent: '(null|element)',
53
49
  toggle: 'boolean'
54
50
  };
51
+
55
52
  /**
56
53
  * Class definition
57
54
  */
58
55
 
59
- class Collapse extends BaseComponent__default.default {
56
+ class Collapse extends BaseComponent {
60
57
  constructor(element, config) {
61
58
  super(element, config);
62
59
  this._isTransitioning = false;
63
60
  this._triggerArray = [];
64
- const toggleList = SelectorEngine__default.default.find(SELECTOR_DATA_TOGGLE);
65
-
61
+ const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE);
66
62
  for (const elem of toggleList) {
67
- const selector = index.getSelectorFromElement(elem);
68
- const filterElement = SelectorEngine__default.default.find(selector).filter(foundElement => foundElement === this._element);
69
-
63
+ const selector = SelectorEngine.getSelectorFromElement(elem);
64
+ const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);
70
65
  if (selector !== null && filterElement.length) {
71
66
  this._triggerArray.push(elem);
72
67
  }
73
68
  }
74
-
75
69
  this._initializeChildren();
76
-
77
70
  if (!this._config.parent) {
78
71
  this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
79
72
  }
80
-
81
73
  if (this._config.toggle) {
82
74
  this.toggle();
83
75
  }
84
- } // Getters
85
-
76
+ }
86
77
 
78
+ // Getters
87
79
  static get Default() {
88
80
  return Default;
89
81
  }
90
-
91
82
  static get DefaultType() {
92
83
  return DefaultType;
93
84
  }
94
-
95
85
  static get NAME() {
96
86
  return NAME;
97
- } // Public
98
-
87
+ }
99
88
 
89
+ // Public
100
90
  toggle() {
101
91
  if (this._isShown()) {
102
92
  this.hide();
@@ -104,206 +94,154 @@
104
94
  this.show();
105
95
  }
106
96
  }
107
-
108
97
  show() {
109
98
  if (this._isTransitioning || this._isShown()) {
110
99
  return;
111
100
  }
101
+ let activeChildren = [];
112
102
 
113
- let activeChildren = []; // find active children
114
-
103
+ // find active children
115
104
  if (this._config.parent) {
116
105
  activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {
117
106
  toggle: false
118
107
  }));
119
108
  }
120
-
121
109
  if (activeChildren.length && activeChildren[0]._isTransitioning) {
122
110
  return;
123
111
  }
124
-
125
- const startEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW);
126
-
112
+ const startEvent = EventHandler.trigger(this._element, EVENT_SHOW);
127
113
  if (startEvent.defaultPrevented) {
128
114
  return;
129
115
  }
130
-
131
116
  for (const activeInstance of activeChildren) {
132
117
  activeInstance.hide();
133
118
  }
134
-
135
119
  const dimension = this._getDimension();
136
-
137
120
  this._element.classList.remove(CLASS_NAME_COLLAPSE);
138
-
139
121
  this._element.classList.add(CLASS_NAME_COLLAPSING);
140
-
141
122
  this._element.style[dimension] = 0;
142
-
143
123
  this._addAriaAndCollapsedClass(this._triggerArray, true);
144
-
145
124
  this._isTransitioning = true;
146
-
147
125
  const complete = () => {
148
126
  this._isTransitioning = false;
149
-
150
127
  this._element.classList.remove(CLASS_NAME_COLLAPSING);
151
-
152
128
  this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
153
-
154
129
  this._element.style[dimension] = '';
155
- EventHandler__default.default.trigger(this._element, EVENT_SHOWN);
130
+ EventHandler.trigger(this._element, EVENT_SHOWN);
156
131
  };
157
-
158
132
  const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
159
133
  const scrollSize = `scroll${capitalizedDimension}`;
160
-
161
134
  this._queueCallback(complete, this._element, true);
162
-
163
135
  this._element.style[dimension] = `${this._element[scrollSize]}px`;
164
136
  }
165
-
166
137
  hide() {
167
138
  if (this._isTransitioning || !this._isShown()) {
168
139
  return;
169
140
  }
170
-
171
- const startEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
172
-
141
+ const startEvent = EventHandler.trigger(this._element, EVENT_HIDE);
173
142
  if (startEvent.defaultPrevented) {
174
143
  return;
175
144
  }
176
-
177
145
  const dimension = this._getDimension();
178
-
179
146
  this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
180
- index.reflow(this._element);
181
-
147
+ index_js.reflow(this._element);
182
148
  this._element.classList.add(CLASS_NAME_COLLAPSING);
183
-
184
149
  this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
185
-
186
150
  for (const trigger of this._triggerArray) {
187
- const element = index.getElementFromSelector(trigger);
188
-
151
+ const element = SelectorEngine.getElementFromSelector(trigger);
189
152
  if (element && !this._isShown(element)) {
190
153
  this._addAriaAndCollapsedClass([trigger], false);
191
154
  }
192
155
  }
193
-
194
156
  this._isTransitioning = true;
195
-
196
157
  const complete = () => {
197
158
  this._isTransitioning = false;
198
-
199
159
  this._element.classList.remove(CLASS_NAME_COLLAPSING);
200
-
201
160
  this._element.classList.add(CLASS_NAME_COLLAPSE);
202
-
203
- EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
161
+ EventHandler.trigger(this._element, EVENT_HIDDEN);
204
162
  };
205
-
206
163
  this._element.style[dimension] = '';
207
-
208
164
  this._queueCallback(complete, this._element, true);
209
165
  }
210
-
211
166
  _isShown(element = this._element) {
212
167
  return element.classList.contains(CLASS_NAME_SHOW);
213
- } // Private
214
-
168
+ }
215
169
 
170
+ // Private
216
171
  _configAfterMerge(config) {
217
172
  config.toggle = Boolean(config.toggle); // Coerce string values
218
-
219
- config.parent = index.getElement(config.parent);
173
+ config.parent = index_js.getElement(config.parent);
220
174
  return config;
221
175
  }
222
-
223
176
  _getDimension() {
224
177
  return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
225
178
  }
226
-
227
179
  _initializeChildren() {
228
180
  if (!this._config.parent) {
229
181
  return;
230
182
  }
231
-
232
183
  const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE);
233
-
234
184
  for (const element of children) {
235
- const selected = index.getElementFromSelector(element);
236
-
185
+ const selected = SelectorEngine.getElementFromSelector(element);
237
186
  if (selected) {
238
187
  this._addAriaAndCollapsedClass([element], this._isShown(selected));
239
188
  }
240
189
  }
241
190
  }
242
-
243
191
  _getFirstLevelChildren(selector) {
244
- const children = SelectorEngine__default.default.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); // remove children if greater depth
245
-
246
- return SelectorEngine__default.default.find(selector, this._config.parent).filter(element => !children.includes(element));
192
+ const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
193
+ // remove children if greater depth
194
+ return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));
247
195
  }
248
-
249
196
  _addAriaAndCollapsedClass(triggerArray, isOpen) {
250
197
  if (!triggerArray.length) {
251
198
  return;
252
199
  }
253
-
254
200
  for (const element of triggerArray) {
255
201
  element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);
256
202
  element.setAttribute('aria-expanded', isOpen);
257
203
  }
258
- } // Static
259
-
204
+ }
260
205
 
206
+ // Static
261
207
  static jQueryInterface(config) {
262
208
  const _config = {};
263
-
264
209
  if (typeof config === 'string' && /show|hide/.test(config)) {
265
210
  _config.toggle = false;
266
211
  }
267
-
268
212
  return this.each(function () {
269
213
  const data = Collapse.getOrCreateInstance(this, _config);
270
-
271
214
  if (typeof config === 'string') {
272
215
  if (typeof data[config] === 'undefined') {
273
216
  throw new TypeError(`No method named "${config}"`);
274
217
  }
275
-
276
218
  data[config]();
277
219
  }
278
220
  });
279
221
  }
280
-
281
222
  }
223
+
282
224
  /**
283
225
  * Data API implementation
284
226
  */
285
227
 
286
-
287
- EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
228
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
288
229
  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
289
230
  if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
290
231
  event.preventDefault();
291
232
  }
292
-
293
- const selector = index.getSelectorFromElement(this);
294
- const selectorElements = SelectorEngine__default.default.find(selector);
295
-
296
- for (const element of selectorElements) {
233
+ for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {
297
234
  Collapse.getOrCreateInstance(element, {
298
235
  toggle: false
299
236
  }).toggle();
300
237
  }
301
238
  });
239
+
302
240
  /**
303
241
  * jQuery
304
242
  */
305
243
 
306
- index.defineJQueryPlugin(Collapse);
244
+ index_js.defineJQueryPlugin(Collapse);
307
245
 
308
246
  return Collapse;
309
247
 
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Bootstrap data.js v5.2.3 (https://getbootstrap.com/)
3
- * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap data.js v5.3.2 (https://getbootstrap.com/)
3
+ * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
@@ -11,7 +11,7 @@
11
11
 
12
12
  /**
13
13
  * --------------------------------------------------------------------------
14
- * Bootstrap (v5.2.3): dom/data.js
14
+ * Bootstrap dom/data.js
15
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
16
  * --------------------------------------------------------------------------
17
17
  */
@@ -19,46 +19,42 @@
19
19
  /**
20
20
  * Constants
21
21
  */
22
+
22
23
  const elementMap = new Map();
23
24
  const data = {
24
25
  set(element, key, instance) {
25
26
  if (!elementMap.has(element)) {
26
27
  elementMap.set(element, new Map());
27
28
  }
29
+ const instanceMap = elementMap.get(element);
28
30
 
29
- const instanceMap = elementMap.get(element); // make it clear we only want one instance per element
31
+ // make it clear we only want one instance per element
30
32
  // can be removed later when multiple key/instances are fine to be used
31
-
32
33
  if (!instanceMap.has(key) && instanceMap.size !== 0) {
33
34
  // eslint-disable-next-line no-console
34
35
  console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
35
36
  return;
36
37
  }
37
-
38
38
  instanceMap.set(key, instance);
39
39
  },
40
-
41
40
  get(element, key) {
42
41
  if (elementMap.has(element)) {
43
42
  return elementMap.get(element).get(key) || null;
44
43
  }
45
-
46
44
  return null;
47
45
  },
48
-
49
46
  remove(element, key) {
50
47
  if (!elementMap.has(element)) {
51
48
  return;
52
49
  }
53
-
54
50
  const instanceMap = elementMap.get(element);
55
- instanceMap.delete(key); // free up element references if there are no instances left for an element
51
+ instanceMap.delete(key);
56
52
 
53
+ // free up element references if there are no instances left for an element
57
54
  if (instanceMap.size === 0) {
58
55
  elementMap.delete(element);
59
56
  }
60
57
  }
61
-
62
58
  };
63
59
 
64
60
  return data;
@@ -1,20 +1,22 @@
1
1
  /*!
2
- * Bootstrap event-handler.js v5.2.3 (https://getbootstrap.com/)
3
- * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap event-handler.js v5.3.2 (https://getbootstrap.com/)
3
+ * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
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('../util/index')) :
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../util/index.js')) :
8
8
  typeof define === 'function' && define.amd ? define(['../util/index'], factory) :
9
9
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EventHandler = factory(global.Index));
10
- })(this, (function (index) { 'use strict';
10
+ })(this, (function (index_js) { 'use strict';
11
11
 
12
12
  /**
13
13
  * --------------------------------------------------------------------------
14
- * Bootstrap (v5.2.3): dom/event-handler.js
14
+ * Bootstrap dom/event-handler.js
15
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
16
  * --------------------------------------------------------------------------
17
17
  */
18
+
19
+
18
20
  /**
19
21
  * Constants
20
22
  */
@@ -23,13 +25,13 @@
23
25
  const stripNameRegex = /\..*/;
24
26
  const stripUidRegex = /::\d+$/;
25
27
  const eventRegistry = {}; // Events storage
26
-
27
28
  let uidEvent = 1;
28
29
  const customEvents = {
29
30
  mouseenter: 'mouseover',
30
31
  mouseleave: 'mouseout'
31
32
  };
32
33
  const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);
34
+
33
35
  /**
34
36
  * Private methods
35
37
  */
@@ -37,32 +39,26 @@
37
39
  function makeEventUid(element, uid) {
38
40
  return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
39
41
  }
40
-
41
42
  function getElementEvents(element) {
42
43
  const uid = makeEventUid(element);
43
44
  element.uidEvent = uid;
44
45
  eventRegistry[uid] = eventRegistry[uid] || {};
45
46
  return eventRegistry[uid];
46
47
  }
47
-
48
48
  function bootstrapHandler(element, fn) {
49
49
  return function handler(event) {
50
50
  hydrateObj(event, {
51
51
  delegateTarget: element
52
52
  });
53
-
54
53
  if (handler.oneOff) {
55
54
  EventHandler.off(element, event.type, fn);
56
55
  }
57
-
58
56
  return fn.apply(element, [event]);
59
57
  };
60
58
  }
61
-
62
59
  function bootstrapDelegationHandler(element, selector, fn) {
63
60
  return function handler(event) {
64
61
  const domElements = element.querySelectorAll(selector);
65
-
66
62
  for (let {
67
63
  target
68
64
  } = event; target && target !== this; target = target.parentNode) {
@@ -70,46 +66,38 @@
70
66
  if (domElement !== target) {
71
67
  continue;
72
68
  }
73
-
74
69
  hydrateObj(event, {
75
70
  delegateTarget: target
76
71
  });
77
-
78
72
  if (handler.oneOff) {
79
73
  EventHandler.off(element, event.type, selector, fn);
80
74
  }
81
-
82
75
  return fn.apply(target, [event]);
83
76
  }
84
77
  }
85
78
  };
86
79
  }
87
-
88
80
  function findHandler(events, callable, delegationSelector = null) {
89
81
  return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);
90
82
  }
91
-
92
83
  function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
93
- const isDelegated = typeof handler === 'string'; // todo: tooltip passes `false` instead of selector, so we need to check
94
-
84
+ const isDelegated = typeof handler === 'string';
85
+ // TODO: tooltip passes `false` instead of selector, so we need to check
95
86
  const callable = isDelegated ? delegationFunction : handler || delegationFunction;
96
87
  let typeEvent = getTypeEvent(originalTypeEvent);
97
-
98
88
  if (!nativeEvents.has(typeEvent)) {
99
89
  typeEvent = originalTypeEvent;
100
90
  }
101
-
102
91
  return [isDelegated, callable, typeEvent];
103
92
  }
104
-
105
93
  function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
106
94
  if (typeof originalTypeEvent !== 'string' || !element) {
107
95
  return;
108
96
  }
97
+ let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
109
98
 
110
- let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
99
+ // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
111
100
  // this prevents the handler from being dispatched the same way as mouseover or mouseout does
112
-
113
101
  if (originalTypeEvent in customEvents) {
114
102
  const wrapFunction = fn => {
115
103
  return function (event) {
@@ -118,19 +106,15 @@
118
106
  }
119
107
  };
120
108
  };
121
-
122
109
  callable = wrapFunction(callable);
123
110
  }
124
-
125
111
  const events = getElementEvents(element);
126
112
  const handlers = events[typeEvent] || (events[typeEvent] = {});
127
113
  const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
128
-
129
114
  if (previousFunction) {
130
115
  previousFunction.oneOff = previousFunction.oneOff && oneOff;
131
116
  return;
132
117
  }
133
-
134
118
  const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));
135
119
  const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);
136
120
  fn.delegationSelector = isDelegated ? handler : null;
@@ -140,94 +124,74 @@
140
124
  handlers[uid] = fn;
141
125
  element.addEventListener(typeEvent, fn, isDelegated);
142
126
  }
143
-
144
127
  function removeHandler(element, events, typeEvent, handler, delegationSelector) {
145
128
  const fn = findHandler(events[typeEvent], handler, delegationSelector);
146
-
147
129
  if (!fn) {
148
130
  return;
149
131
  }
150
-
151
132
  element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));
152
133
  delete events[typeEvent][fn.uidEvent];
153
134
  }
154
-
155
135
  function removeNamespacedHandlers(element, events, typeEvent, namespace) {
156
136
  const storeElementEvent = events[typeEvent] || {};
157
-
158
- for (const handlerKey of Object.keys(storeElementEvent)) {
137
+ for (const [handlerKey, event] of Object.entries(storeElementEvent)) {
159
138
  if (handlerKey.includes(namespace)) {
160
- const event = storeElementEvent[handlerKey];
161
139
  removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
162
140
  }
163
141
  }
164
142
  }
165
-
166
143
  function getTypeEvent(event) {
167
144
  // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
168
145
  event = event.replace(stripNameRegex, '');
169
146
  return customEvents[event] || event;
170
147
  }
171
-
172
148
  const EventHandler = {
173
149
  on(element, event, handler, delegationFunction) {
174
150
  addHandler(element, event, handler, delegationFunction, false);
175
151
  },
176
-
177
152
  one(element, event, handler, delegationFunction) {
178
153
  addHandler(element, event, handler, delegationFunction, true);
179
154
  },
180
-
181
155
  off(element, originalTypeEvent, handler, delegationFunction) {
182
156
  if (typeof originalTypeEvent !== 'string' || !element) {
183
157
  return;
184
158
  }
185
-
186
159
  const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
187
160
  const inNamespace = typeEvent !== originalTypeEvent;
188
161
  const events = getElementEvents(element);
189
162
  const storeElementEvent = events[typeEvent] || {};
190
163
  const isNamespace = originalTypeEvent.startsWith('.');
191
-
192
164
  if (typeof callable !== 'undefined') {
193
165
  // Simplest case: handler is passed, remove that listener ONLY.
194
166
  if (!Object.keys(storeElementEvent).length) {
195
167
  return;
196
168
  }
197
-
198
169
  removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
199
170
  return;
200
171
  }
201
-
202
172
  if (isNamespace) {
203
173
  for (const elementEvent of Object.keys(events)) {
204
174
  removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
205
175
  }
206
176
  }
207
-
208
- for (const keyHandlers of Object.keys(storeElementEvent)) {
177
+ for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {
209
178
  const handlerKey = keyHandlers.replace(stripUidRegex, '');
210
-
211
179
  if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
212
- const event = storeElementEvent[keyHandlers];
213
180
  removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
214
181
  }
215
182
  }
216
183
  },
217
-
218
184
  trigger(element, event, args) {
219
185
  if (typeof event !== 'string' || !element) {
220
186
  return null;
221
187
  }
222
-
223
- const $ = index.getjQuery();
188
+ const $ = index_js.getjQuery();
224
189
  const typeEvent = getTypeEvent(event);
225
190
  const inNamespace = event !== typeEvent;
226
191
  let jQueryEvent = null;
227
192
  let bubbles = true;
228
193
  let nativeDispatch = true;
229
194
  let defaultPrevented = false;
230
-
231
195
  if (inNamespace && $) {
232
196
  jQueryEvent = $.Event(event, args);
233
197
  $(element).trigger(jQueryEvent);
@@ -235,46 +199,35 @@
235
199
  nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
236
200
  defaultPrevented = jQueryEvent.isDefaultPrevented();
237
201
  }
238
-
239
- let evt = new Event(event, {
202
+ const evt = hydrateObj(new Event(event, {
240
203
  bubbles,
241
204
  cancelable: true
242
- });
243
- evt = hydrateObj(evt, args);
244
-
205
+ }), args);
245
206
  if (defaultPrevented) {
246
207
  evt.preventDefault();
247
208
  }
248
-
249
209
  if (nativeDispatch) {
250
210
  element.dispatchEvent(evt);
251
211
  }
252
-
253
212
  if (evt.defaultPrevented && jQueryEvent) {
254
213
  jQueryEvent.preventDefault();
255
214
  }
256
-
257
215
  return evt;
258
216
  }
259
-
260
217
  };
261
-
262
- function hydrateObj(obj, meta) {
263
- for (const [key, value] of Object.entries(meta || {})) {
218
+ function hydrateObj(obj, meta = {}) {
219
+ for (const [key, value] of Object.entries(meta)) {
264
220
  try {
265
221
  obj[key] = value;
266
222
  } catch (_unused) {
267
223
  Object.defineProperty(obj, key, {
268
224
  configurable: true,
269
-
270
225
  get() {
271
226
  return value;
272
227
  }
273
-
274
228
  });
275
229
  }
276
230
  }
277
-
278
231
  return obj;
279
232
  }
280
233