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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +11 -5
- data/Gemfile +1 -0
- data/README.md +6 -2
- data/Rakefile +10 -1
- data/assets/javascripts/bootstrap/alert.js +22 -32
- data/assets/javascripts/bootstrap/base-component.js +22 -38
- data/assets/javascripts/bootstrap/button.js +19 -22
- data/assets/javascripts/bootstrap/carousel.js +52 -135
- data/assets/javascripts/bootstrap/collapse.js +40 -102
- data/assets/javascripts/bootstrap/dom/data.js +8 -12
- data/assets/javascripts/bootstrap/dom/event-handler.js +19 -66
- data/assets/javascripts/bootstrap/dom/manipulator.js +4 -17
- data/assets/javascripts/bootstrap/dom/selector-engine.js +42 -24
- data/assets/javascripts/bootstrap/dropdown.js +74 -145
- data/assets/javascripts/bootstrap/modal.js +53 -133
- data/assets/javascripts/bootstrap/offcanvas.js +50 -102
- data/assets/javascripts/bootstrap/popover.js +23 -29
- data/assets/javascripts/bootstrap/scrollspy.js +53 -90
- data/assets/javascripts/bootstrap/tab.js +63 -112
- data/assets/javascripts/bootstrap/toast.js +31 -73
- data/assets/javascripts/bootstrap/tooltip.js +75 -177
- data/assets/javascripts/bootstrap/util/backdrop.js +28 -54
- data/assets/javascripts/bootstrap/util/component-functions.js +13 -18
- data/assets/javascripts/bootstrap/util/config.js +15 -27
- data/assets/javascripts/bootstrap/util/focustrap.js +20 -36
- data/assets/javascripts/bootstrap/util/index.js +42 -111
- data/assets/javascripts/bootstrap/util/sanitizer.js +30 -42
- data/assets/javascripts/bootstrap/util/scrollbar.js +24 -50
- data/assets/javascripts/bootstrap/util/swipe.js +27 -48
- data/assets/javascripts/bootstrap/util/template-factory.js +25 -52
- data/assets/javascripts/bootstrap-sprockets.js +10 -10
- data/assets/javascripts/bootstrap.js +689 -1444
- data/assets/javascripts/bootstrap.min.js +3 -3
- data/assets/stylesheets/_bootstrap-grid.scss +1 -3
- data/assets/stylesheets/_bootstrap-reboot.scss +1 -0
- data/assets/stylesheets/_bootstrap-utilities.scss +19 -0
- data/assets/stylesheets/_bootstrap.scss +1 -0
- data/assets/stylesheets/bootstrap/_accordion.scss +9 -0
- data/assets/stylesheets/bootstrap/_alert.scss +8 -11
- data/assets/stylesheets/bootstrap/_button-group.scss +2 -2
- data/assets/stylesheets/bootstrap/_buttons.scss +3 -3
- data/assets/stylesheets/bootstrap/_card.scss +5 -0
- data/assets/stylesheets/bootstrap/_carousel.scss +20 -2
- data/assets/stylesheets/bootstrap/_close.scss +32 -9
- data/assets/stylesheets/bootstrap/_dropdown.scss +1 -0
- data/assets/stylesheets/bootstrap/_functions.scss +1 -1
- data/assets/stylesheets/bootstrap/_grid.scss +6 -0
- data/assets/stylesheets/bootstrap/_helpers.scss +2 -0
- data/assets/stylesheets/bootstrap/_list-group.scss +12 -7
- data/assets/stylesheets/bootstrap/_maps.scss +120 -0
- data/assets/stylesheets/bootstrap/_mixins.scss +1 -2
- data/assets/stylesheets/bootstrap/_nav.scss +42 -17
- data/assets/stylesheets/bootstrap/_navbar.scss +15 -4
- data/assets/stylesheets/bootstrap/_offcanvas.scss +4 -2
- data/assets/stylesheets/bootstrap/_pagination.scss +1 -1
- data/assets/stylesheets/bootstrap/_progress.scss +10 -1
- data/assets/stylesheets/bootstrap/_reboot.scss +8 -7
- data/assets/stylesheets/bootstrap/_root.scss +124 -10
- data/assets/stylesheets/bootstrap/_tables.scss +18 -11
- data/assets/stylesheets/bootstrap/_tooltip.scss +4 -5
- data/assets/stylesheets/bootstrap/_utilities.scss +175 -16
- data/assets/stylesheets/bootstrap/_variables-dark.scss +87 -0
- data/assets/stylesheets/bootstrap/_variables.scss +282 -169
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +23 -3
- data/assets/stylesheets/bootstrap/forms/_form-check.scss +26 -12
- data/assets/stylesheets/bootstrap/forms/_form-control.scss +24 -4
- data/assets/stylesheets/bootstrap/forms/_form-range.scss +3 -3
- data/assets/stylesheets/bootstrap/forms/_form-select.scss +12 -3
- data/assets/stylesheets/bootstrap/forms/_input-group.scss +1 -1
- data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +1 -4
- data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +20 -2
- data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
- data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
- data/assets/stylesheets/bootstrap/helpers/_vr.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_alert.scss +4 -1
- data/assets/stylesheets/bootstrap/mixins/_banner.scss +2 -4
- data/assets/stylesheets/bootstrap/mixins/_caret.scss +30 -25
- data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
- data/assets/stylesheets/bootstrap/mixins/_forms.scss +8 -7
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_list-group.scss +2 -0
- data/assets/stylesheets/bootstrap/mixins/_utilities.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +5 -1
- data/assets/stylesheets/bootstrap/vendor/_rfs.scss +23 -29
- data/bootstrap.gemspec +4 -3
- data/lib/bootstrap/engine.rb +7 -1
- data/lib/bootstrap/version.rb +2 -2
- data/tasks/updater/js.rb +1 -1
- data/tasks/updater/scss.rb +2 -2
- data/test/gemfiles/rails_4_2.gemfile +1 -1
- data/test/gemfiles/rails_5_0.gemfile +1 -1
- data/test/gemfiles/rails_5_1.gemfile +1 -1
- data/test/gemfiles/rails_5_2.gemfile +1 -1
- data/test/gemfiles/rails_6_0.gemfile +1 -0
- data/test/gemfiles/rails_6_1.gemfile +1 -0
- data/test/gemfiles/rails_7_0_dartsass.gemfile +8 -0
- data/test/gemfiles/{rails_7_0.gemfile → rails_7_0_sassc.gemfile} +1 -0
- metadata +35 -15
- data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +0 -18
|
@@ -1,26 +1,22 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap collapse.js v5.2
|
|
3
|
-
* Copyright 2011-
|
|
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('./
|
|
8
|
-
typeof define === 'function' && define.amd ? define(['./
|
|
9
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Collapse = factory(global.
|
|
10
|
-
})(this, (function (
|
|
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
|
|
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
|
|
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 =
|
|
65
|
-
|
|
61
|
+
const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE);
|
|
66
62
|
for (const elem of toggleList) {
|
|
67
|
-
const selector =
|
|
68
|
-
const filterElement =
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
}
|
|
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 =
|
|
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 =
|
|
245
|
-
|
|
246
|
-
return
|
|
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
|
-
}
|
|
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
|
-
|
|
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
|
-
* Copyright 2011-
|
|
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
|
|
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
|
-
|
|
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);
|
|
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
|
-
* Copyright 2011-
|
|
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 (
|
|
10
|
+
})(this, (function (index_js) { 'use strict';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* --------------------------------------------------------------------------
|
|
14
|
-
* Bootstrap
|
|
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';
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|