bootstrap 5.1.3 → 5.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +24 -4
  3. data/assets/javascripts/bootstrap/alert.js +11 -146
  4. data/assets/javascripts/bootstrap/base-component.js +37 -120
  5. data/assets/javascripts/bootstrap/button.js +10 -74
  6. data/assets/javascripts/bootstrap/carousel.js +213 -485
  7. data/assets/javascripts/bootstrap/collapse.js +65 -249
  8. data/assets/javascripts/bootstrap/dom/data.js +3 -5
  9. data/assets/javascripts/bootstrap/dom/event-handler.js +94 -132
  10. data/assets/javascripts/bootstrap/dom/manipulator.js +23 -27
  11. data/assets/javascripts/bootstrap/dom/selector-engine.js +16 -58
  12. data/assets/javascripts/bootstrap/dropdown.js +103 -317
  13. data/assets/javascripts/bootstrap/modal.js +107 -749
  14. data/assets/javascripts/bootstrap/offcanvas.js +90 -659
  15. data/assets/javascripts/bootstrap/popover.js +36 -118
  16. data/assets/javascripts/bootstrap/scrollspy.js +183 -262
  17. data/assets/javascripts/bootstrap/tab.js +215 -214
  18. data/assets/javascripts/bootstrap/toast.js +28 -214
  19. data/assets/javascripts/bootstrap/tooltip.js +272 -611
  20. data/assets/javascripts/bootstrap/util/backdrop.js +165 -0
  21. data/assets/javascripts/bootstrap/util/component-functions.js +46 -0
  22. data/assets/javascripts/bootstrap/util/config.js +79 -0
  23. data/assets/javascripts/bootstrap/util/focustrap.js +129 -0
  24. data/assets/javascripts/bootstrap/util/index.js +350 -0
  25. data/assets/javascripts/bootstrap/util/sanitizer.js +122 -0
  26. data/assets/javascripts/bootstrap/util/scrollbar.js +138 -0
  27. data/assets/javascripts/bootstrap/util/swipe.js +155 -0
  28. data/assets/javascripts/bootstrap/util/template-factory.js +177 -0
  29. data/assets/javascripts/bootstrap-global-this-define.js +1 -1
  30. data/assets/javascripts/bootstrap-sprockets.js +10 -1
  31. data/assets/javascripts/bootstrap.js +2077 -1859
  32. data/assets/javascripts/bootstrap.min.js +3 -3
  33. data/assets/stylesheets/_bootstrap-grid.scss +3 -6
  34. data/assets/stylesheets/_bootstrap-reboot.scss +3 -7
  35. data/assets/stylesheets/_bootstrap.scss +4 -6
  36. data/assets/stylesheets/bootstrap/_accordion.scss +56 -25
  37. data/assets/stylesheets/bootstrap/_alert.scss +18 -4
  38. data/assets/stylesheets/bootstrap/_badge.scss +14 -5
  39. data/assets/stylesheets/bootstrap/_breadcrumb.scss +22 -10
  40. data/assets/stylesheets/bootstrap/_button-group.scss +4 -1
  41. data/assets/stylesheets/bootstrap/_buttons.scss +120 -30
  42. data/assets/stylesheets/bootstrap/_card.scss +55 -37
  43. data/assets/stylesheets/bootstrap/_close.scss +1 -1
  44. data/assets/stylesheets/bootstrap/_containers.scss +1 -1
  45. data/assets/stylesheets/bootstrap/_dropdown.scss +85 -76
  46. data/assets/stylesheets/bootstrap/_functions.scss +8 -8
  47. data/assets/stylesheets/bootstrap/_grid.scss +3 -3
  48. data/assets/stylesheets/bootstrap/_helpers.scss +1 -0
  49. data/assets/stylesheets/bootstrap/_list-group.scss +48 -30
  50. data/assets/stylesheets/bootstrap/_maps.scss +54 -0
  51. data/assets/stylesheets/bootstrap/_modal.scss +71 -43
  52. data/assets/stylesheets/bootstrap/_nav.scss +53 -20
  53. data/assets/stylesheets/bootstrap/_navbar.scss +93 -150
  54. data/assets/stylesheets/bootstrap/_offcanvas.scss +120 -59
  55. data/assets/stylesheets/bootstrap/_pagination.scss +66 -21
  56. data/assets/stylesheets/bootstrap/_placeholders.scss +1 -1
  57. data/assets/stylesheets/bootstrap/_popover.scss +90 -52
  58. data/assets/stylesheets/bootstrap/_progress.scss +20 -9
  59. data/assets/stylesheets/bootstrap/_reboot.scss +25 -40
  60. data/assets/stylesheets/bootstrap/_root.scss +40 -21
  61. data/assets/stylesheets/bootstrap/_spinners.scss +38 -22
  62. data/assets/stylesheets/bootstrap/_tables.scss +32 -23
  63. data/assets/stylesheets/bootstrap/_toasts.scss +36 -16
  64. data/assets/stylesheets/bootstrap/_tooltip.scss +61 -56
  65. data/assets/stylesheets/bootstrap/_type.scss +2 -0
  66. data/assets/stylesheets/bootstrap/_utilities.scss +43 -26
  67. data/assets/stylesheets/bootstrap/_variables.scss +128 -135
  68. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +3 -6
  69. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +15 -3
  70. data/assets/stylesheets/bootstrap/forms/_form-check.scss +28 -5
  71. data/assets/stylesheets/bootstrap/forms/_form-control.scss +12 -37
  72. data/assets/stylesheets/bootstrap/forms/_form-select.scss +0 -1
  73. data/assets/stylesheets/bootstrap/forms/_input-group.scss +19 -8
  74. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +10 -0
  75. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +2 -2
  76. data/assets/stylesheets/bootstrap/helpers/_position.scss +7 -1
  77. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +2 -2
  78. data/assets/stylesheets/bootstrap/helpers/_vr.scss +1 -1
  79. data/assets/stylesheets/bootstrap/mixins/_alert.scss +7 -3
  80. data/assets/stylesheets/bootstrap/mixins/_banner.scss +9 -0
  81. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +8 -8
  82. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +32 -95
  83. data/assets/stylesheets/bootstrap/mixins/_container.scss +4 -2
  84. data/assets/stylesheets/bootstrap/mixins/_forms.scss +18 -10
  85. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +1 -1
  86. data/assets/stylesheets/bootstrap/mixins/_grid.scss +12 -12
  87. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +4 -25
  88. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +1 -1
  89. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +12 -9
  90. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +13 -5
  91. data/bootstrap.gemspec +1 -1
  92. data/lib/bootstrap/version.rb +2 -2
  93. data/tasks/updater/js.rb +10 -5
  94. metadata +16 -4
@@ -1,43 +1,22 @@
1
1
  /*!
2
- * Bootstrap event-handler.js v5.1.3 (https://getbootstrap.com/)
3
- * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap event-handler.js v5.2.1 (https://getbootstrap.com/)
3
+ * Copyright 2011-2022 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() :
8
- typeof define === 'function' && define.amd ? define(factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EventHandler = factory());
10
- })(this, (function () { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../util/index')) :
8
+ typeof define === 'function' && define.amd ? define(['../util/index'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EventHandler = factory(global.Index));
10
+ })(this, (function (index) { 'use strict';
11
11
 
12
12
  /**
13
13
  * --------------------------------------------------------------------------
14
- * Bootstrap (v5.1.3): util/index.js
14
+ * Bootstrap (v5.2.1): dom/event-handler.js
15
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
16
  * --------------------------------------------------------------------------
17
17
  */
18
-
19
- const getjQuery = () => {
20
- const {
21
- jQuery
22
- } = window;
23
-
24
- if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
25
- return jQuery;
26
- }
27
-
28
- return null;
29
- };
30
-
31
18
  /**
32
- * --------------------------------------------------------------------------
33
- * Bootstrap (v5.1.3): dom/event-handler.js
34
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
35
- * --------------------------------------------------------------------------
36
- */
37
- /**
38
- * ------------------------------------------------------------------------
39
19
  * Constants
40
- * ------------------------------------------------------------------------
41
20
  */
42
21
 
43
22
  const namespaceRegex = /[^.]*(?=\..*)\.|.*/;
@@ -50,20 +29,17 @@
50
29
  mouseenter: 'mouseover',
51
30
  mouseleave: 'mouseout'
52
31
  };
53
- const customEventsRegex = /^(mouseenter|mouseleave)/i;
54
32
  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']);
55
33
  /**
56
- * ------------------------------------------------------------------------
57
34
  * Private methods
58
- * ------------------------------------------------------------------------
59
35
  */
60
36
 
61
- function getUidEvent(element, uid) {
37
+ function makeEventUid(element, uid) {
62
38
  return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
63
39
  }
64
40
 
65
- function getEvent(element) {
66
- const uid = getUidEvent(element);
41
+ function getElementEvents(element) {
42
+ const uid = makeEventUid(element);
67
43
  element.uidEvent = uid;
68
44
  eventRegistry[uid] = eventRegistry[uid] || {};
69
45
  return eventRegistry[uid];
@@ -71,7 +47,9 @@
71
47
 
72
48
  function bootstrapHandler(element, fn) {
73
49
  return function handler(event) {
74
- event.delegateTarget = element;
50
+ hydrateObj(event, {
51
+ delegateTarget: element
52
+ });
75
53
 
76
54
  if (handler.oneOff) {
77
55
  EventHandler.off(element, event.type, fn);
@@ -88,65 +66,52 @@
88
66
  for (let {
89
67
  target
90
68
  } = event; target && target !== this; target = target.parentNode) {
91
- for (let i = domElements.length; i--;) {
92
- if (domElements[i] === target) {
93
- event.delegateTarget = target;
69
+ for (const domElement of domElements) {
70
+ if (domElement !== target) {
71
+ continue;
72
+ }
94
73
 
95
- if (handler.oneOff) {
96
- EventHandler.off(element, event.type, selector, fn);
97
- }
74
+ hydrateObj(event, {
75
+ delegateTarget: target
76
+ });
98
77
 
99
- return fn.apply(target, [event]);
78
+ if (handler.oneOff) {
79
+ EventHandler.off(element, event.type, selector, fn);
100
80
  }
101
- }
102
- } // To please ESLint
103
81
 
104
-
105
- return null;
82
+ return fn.apply(target, [event]);
83
+ }
84
+ }
106
85
  };
107
86
  }
108
87
 
109
- function findHandler(events, handler, delegationSelector = null) {
110
- const uidEventList = Object.keys(events);
111
-
112
- for (let i = 0, len = uidEventList.length; i < len; i++) {
113
- const event = events[uidEventList[i]];
114
-
115
- if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {
116
- return event;
117
- }
118
- }
119
-
120
- return null;
88
+ function findHandler(events, callable, delegationSelector = null) {
89
+ return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);
121
90
  }
122
91
 
123
- function normalizeParams(originalTypeEvent, handler, delegationFn) {
124
- const delegation = typeof handler === 'string';
125
- const originalHandler = delegation ? delegationFn : handler;
92
+ function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
93
+ const isDelegated = typeof handler === 'string'; // todo: tooltip passes `false` instead of selector, so we need to check
94
+
95
+ const callable = isDelegated ? delegationFunction : handler || delegationFunction;
126
96
  let typeEvent = getTypeEvent(originalTypeEvent);
127
- const isNative = nativeEvents.has(typeEvent);
128
97
 
129
- if (!isNative) {
98
+ if (!nativeEvents.has(typeEvent)) {
130
99
  typeEvent = originalTypeEvent;
131
100
  }
132
101
 
133
- return [delegation, originalHandler, typeEvent];
102
+ return [isDelegated, callable, typeEvent];
134
103
  }
135
104
 
136
- function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
105
+ function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
137
106
  if (typeof originalTypeEvent !== 'string' || !element) {
138
107
  return;
139
108
  }
140
109
 
141
- if (!handler) {
142
- handler = delegationFn;
143
- delegationFn = null;
144
- } // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
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
145
111
  // this prevents the handler from being dispatched the same way as mouseover or mouseout does
146
112
 
147
-
148
- if (customEventsRegex.test(originalTypeEvent)) {
149
- const wrapFn = fn => {
113
+ if (originalTypeEvent in customEvents) {
114
+ const wrapFunction = fn => {
150
115
  return function (event) {
151
116
  if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
152
117
  return fn.call(this, event);
@@ -154,31 +119,26 @@
154
119
  };
155
120
  };
156
121
 
157
- if (delegationFn) {
158
- delegationFn = wrapFn(delegationFn);
159
- } else {
160
- handler = wrapFn(handler);
161
- }
122
+ callable = wrapFunction(callable);
162
123
  }
163
124
 
164
- const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);
165
- const events = getEvent(element);
125
+ const events = getElementEvents(element);
166
126
  const handlers = events[typeEvent] || (events[typeEvent] = {});
167
- const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null);
127
+ const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
168
128
 
169
- if (previousFn) {
170
- previousFn.oneOff = previousFn.oneOff && oneOff;
129
+ if (previousFunction) {
130
+ previousFunction.oneOff = previousFunction.oneOff && oneOff;
171
131
  return;
172
132
  }
173
133
 
174
- const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''));
175
- const fn = delegation ? bootstrapDelegationHandler(element, handler, delegationFn) : bootstrapHandler(element, handler);
176
- fn.delegationSelector = delegation ? handler : null;
177
- fn.originalHandler = originalHandler;
134
+ const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));
135
+ const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);
136
+ fn.delegationSelector = isDelegated ? handler : null;
137
+ fn.callable = callable;
178
138
  fn.oneOff = oneOff;
179
139
  fn.uidEvent = uid;
180
140
  handlers[uid] = fn;
181
- element.addEventListener(typeEvent, fn, delegation);
141
+ element.addEventListener(typeEvent, fn, isDelegated);
182
142
  }
183
143
 
184
144
  function removeHandler(element, events, typeEvent, handler, delegationSelector) {
@@ -194,12 +154,13 @@
194
154
 
195
155
  function removeNamespacedHandlers(element, events, typeEvent, namespace) {
196
156
  const storeElementEvent = events[typeEvent] || {};
197
- Object.keys(storeElementEvent).forEach(handlerKey => {
157
+
158
+ for (const handlerKey of Object.keys(storeElementEvent)) {
198
159
  if (handlerKey.includes(namespace)) {
199
160
  const event = storeElementEvent[handlerKey];
200
- removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);
161
+ removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
201
162
  }
202
- });
163
+ }
203
164
  }
204
165
 
205
166
  function getTypeEvent(event) {
@@ -209,49 +170,49 @@
209
170
  }
210
171
 
211
172
  const EventHandler = {
212
- on(element, event, handler, delegationFn) {
213
- addHandler(element, event, handler, delegationFn, false);
173
+ on(element, event, handler, delegationFunction) {
174
+ addHandler(element, event, handler, delegationFunction, false);
214
175
  },
215
176
 
216
- one(element, event, handler, delegationFn) {
217
- addHandler(element, event, handler, delegationFn, true);
177
+ one(element, event, handler, delegationFunction) {
178
+ addHandler(element, event, handler, delegationFunction, true);
218
179
  },
219
180
 
220
- off(element, originalTypeEvent, handler, delegationFn) {
181
+ off(element, originalTypeEvent, handler, delegationFunction) {
221
182
  if (typeof originalTypeEvent !== 'string' || !element) {
222
183
  return;
223
184
  }
224
185
 
225
- const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);
186
+ const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
226
187
  const inNamespace = typeEvent !== originalTypeEvent;
227
- const events = getEvent(element);
188
+ const events = getElementEvents(element);
189
+ const storeElementEvent = events[typeEvent] || {};
228
190
  const isNamespace = originalTypeEvent.startsWith('.');
229
191
 
230
- if (typeof originalHandler !== 'undefined') {
192
+ if (typeof callable !== 'undefined') {
231
193
  // Simplest case: handler is passed, remove that listener ONLY.
232
- if (!events || !events[typeEvent]) {
194
+ if (!Object.keys(storeElementEvent).length) {
233
195
  return;
234
196
  }
235
197
 
236
- removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null);
198
+ removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
237
199
  return;
238
200
  }
239
201
 
240
202
  if (isNamespace) {
241
- Object.keys(events).forEach(elementEvent => {
203
+ for (const elementEvent of Object.keys(events)) {
242
204
  removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
243
- });
205
+ }
244
206
  }
245
207
 
246
- const storeElementEvent = events[typeEvent] || {};
247
- Object.keys(storeElementEvent).forEach(keyHandlers => {
208
+ for (const keyHandlers of Object.keys(storeElementEvent)) {
248
209
  const handlerKey = keyHandlers.replace(stripUidRegex, '');
249
210
 
250
211
  if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
251
212
  const event = storeElementEvent[keyHandlers];
252
- removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);
213
+ removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
253
214
  }
254
- });
215
+ }
255
216
  },
256
217
 
257
218
  trigger(element, event, args) {
@@ -259,15 +220,13 @@
259
220
  return null;
260
221
  }
261
222
 
262
- const $ = getjQuery();
223
+ const $ = index.getjQuery();
263
224
  const typeEvent = getTypeEvent(event);
264
225
  const inNamespace = event !== typeEvent;
265
- const isNative = nativeEvents.has(typeEvent);
266
- let jQueryEvent;
226
+ let jQueryEvent = null;
267
227
  let bubbles = true;
268
228
  let nativeDispatch = true;
269
229
  let defaultPrevented = false;
270
- let evt = null;
271
230
 
272
231
  if (inNamespace && $) {
273
232
  jQueryEvent = $.Event(event, args);
@@ -277,27 +236,11 @@
277
236
  defaultPrevented = jQueryEvent.isDefaultPrevented();
278
237
  }
279
238
 
280
- if (isNative) {
281
- evt = document.createEvent('HTMLEvents');
282
- evt.initEvent(typeEvent, bubbles, true);
283
- } else {
284
- evt = new CustomEvent(event, {
285
- bubbles,
286
- cancelable: true
287
- });
288
- } // merge custom information in our event
289
-
290
-
291
- if (typeof args !== 'undefined') {
292
- Object.keys(args).forEach(key => {
293
- Object.defineProperty(evt, key, {
294
- get() {
295
- return args[key];
296
- }
297
-
298
- });
299
- });
300
- }
239
+ let evt = new Event(event, {
240
+ bubbles,
241
+ cancelable: true
242
+ });
243
+ evt = hydrateObj(evt, args);
301
244
 
302
245
  if (defaultPrevented) {
303
246
  evt.preventDefault();
@@ -307,7 +250,7 @@
307
250
  element.dispatchEvent(evt);
308
251
  }
309
252
 
310
- if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {
253
+ if (evt.defaultPrevented && jQueryEvent) {
311
254
  jQueryEvent.preventDefault();
312
255
  }
313
256
 
@@ -316,6 +259,25 @@
316
259
 
317
260
  };
318
261
 
262
+ function hydrateObj(obj, meta) {
263
+ for (const [key, value] of Object.entries(meta || {})) {
264
+ try {
265
+ obj[key] = value;
266
+ } catch (_unused) {
267
+ Object.defineProperty(obj, key, {
268
+ configurable: true,
269
+
270
+ get() {
271
+ return value;
272
+ }
273
+
274
+ });
275
+ }
276
+ }
277
+
278
+ return obj;
279
+ }
280
+
319
281
  return EventHandler;
320
282
 
321
283
  }));
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Bootstrap manipulator.js v5.1.3 (https://getbootstrap.com/)
3
- * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap manipulator.js v5.2.1 (https://getbootstrap.com/)
3
+ * Copyright 2011-2022 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,28 +11,36 @@
11
11
 
12
12
  /**
13
13
  * --------------------------------------------------------------------------
14
- * Bootstrap (v5.1.3): dom/manipulator.js
14
+ * Bootstrap (v5.2.1): dom/manipulator.js
15
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
16
  * --------------------------------------------------------------------------
17
17
  */
18
- function normalizeData(val) {
19
- if (val === 'true') {
18
+ function normalizeData(value) {
19
+ if (value === 'true') {
20
20
  return true;
21
21
  }
22
22
 
23
- if (val === 'false') {
23
+ if (value === 'false') {
24
24
  return false;
25
25
  }
26
26
 
27
- if (val === Number(val).toString()) {
28
- return Number(val);
27
+ if (value === Number(value).toString()) {
28
+ return Number(value);
29
29
  }
30
30
 
31
- if (val === '' || val === 'null') {
31
+ if (value === '' || value === 'null') {
32
32
  return null;
33
33
  }
34
34
 
35
- return val;
35
+ if (typeof value !== 'string') {
36
+ return value;
37
+ }
38
+
39
+ try {
40
+ return JSON.parse(decodeURIComponent(value));
41
+ } catch (_unused) {
42
+ return value;
43
+ }
36
44
  }
37
45
 
38
46
  function normalizeDataKey(key) {
@@ -54,31 +62,19 @@
54
62
  }
55
63
 
56
64
  const attributes = {};
57
- Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => {
65
+ const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));
66
+
67
+ for (const key of bsKeys) {
58
68
  let pureKey = key.replace(/^bs/, '');
59
69
  pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
60
70
  attributes[pureKey] = normalizeData(element.dataset[key]);
61
- });
71
+ }
72
+
62
73
  return attributes;
63
74
  },
64
75
 
65
76
  getDataAttribute(element, key) {
66
77
  return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
67
- },
68
-
69
- offset(element) {
70
- const rect = element.getBoundingClientRect();
71
- return {
72
- top: rect.top + window.pageYOffset,
73
- left: rect.left + window.pageXOffset
74
- };
75
- },
76
-
77
- position(element) {
78
- return {
79
- top: element.offsetTop,
80
- left: element.offsetLeft
81
- };
82
78
  }
83
79
 
84
80
  };
@@ -1,64 +1,24 @@
1
1
  /*!
2
- * Bootstrap selector-engine.js v5.1.3 (https://getbootstrap.com/)
3
- * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap selector-engine.js v5.2.1 (https://getbootstrap.com/)
3
+ * Copyright 2011-2022 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() :
8
- typeof define === 'function' && define.amd ? define(factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SelectorEngine = factory());
10
- })(this, (function () { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../util/index')) :
8
+ typeof define === 'function' && define.amd ? define(['../util/index'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SelectorEngine = factory(global.Index));
10
+ })(this, (function (index) { 'use strict';
11
11
 
12
12
  /**
13
13
  * --------------------------------------------------------------------------
14
- * Bootstrap (v5.1.3): util/index.js
14
+ * Bootstrap (v5.2.1): dom/selector-engine.js
15
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
16
  * --------------------------------------------------------------------------
17
17
  */
18
-
19
- const isElement = obj => {
20
- if (!obj || typeof obj !== 'object') {
21
- return false;
22
- }
23
-
24
- if (typeof obj.jquery !== 'undefined') {
25
- obj = obj[0];
26
- }
27
-
28
- return typeof obj.nodeType !== 'undefined';
29
- };
30
-
31
- const isVisible = element => {
32
- if (!isElement(element) || element.getClientRects().length === 0) {
33
- return false;
34
- }
35
-
36
- return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
37
- };
38
-
39
- const isDisabled = element => {
40
- if (!element || element.nodeType !== Node.ELEMENT_NODE) {
41
- return true;
42
- }
43
-
44
- if (element.classList.contains('disabled')) {
45
- return true;
46
- }
47
-
48
- if (typeof element.disabled !== 'undefined') {
49
- return element.disabled;
50
- }
51
-
52
- return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
53
- };
54
-
55
18
  /**
56
- * --------------------------------------------------------------------------
57
- * Bootstrap (v5.1.3): dom/selector-engine.js
58
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
59
- * --------------------------------------------------------------------------
19
+ * Constants
60
20
  */
61
- const NODE_TEXT = 3;
21
+
62
22
  const SelectorEngine = {
63
23
  find(selector, element = document.documentElement) {
64
24
  return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
@@ -74,14 +34,11 @@
74
34
 
75
35
  parents(element, selector) {
76
36
  const parents = [];
77
- let ancestor = element.parentNode;
78
-
79
- while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
80
- if (ancestor.matches(selector)) {
81
- parents.push(ancestor);
82
- }
37
+ let ancestor = element.parentNode.closest(selector);
83
38
 
84
- ancestor = ancestor.parentNode;
39
+ while (ancestor) {
40
+ parents.push(ancestor);
41
+ ancestor = ancestor.parentNode.closest(selector);
85
42
  }
86
43
 
87
44
  return parents;
@@ -101,6 +58,7 @@
101
58
  return [];
102
59
  },
103
60
 
61
+ // TODO: this is now unused; remove later along with prev()
104
62
  next(element, selector) {
105
63
  let next = element.nextElementSibling;
106
64
 
@@ -116,8 +74,8 @@
116
74
  },
117
75
 
118
76
  focusableChildren(element) {
119
- const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(', ');
120
- return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));
77
+ const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(',');
78
+ return this.find(focusables, element).filter(el => !index.isDisabled(el) && index.isVisible(el));
121
79
  }
122
80
 
123
81
  };