bootstrap 5.2.3 → 5.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +11 -5
- data/CHANGELOG.md +4 -0
- data/Gemfile +1 -0
- data/README.md +8 -2
- data/Rakefile +17 -4
- 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 +27 -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 +19 -36
- data/assets/javascripts/bootstrap/util/index.js +42 -112
- data/assets/javascripts/bootstrap/util/sanitizer.js +33 -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 +9 -9
- data/assets/javascripts/bootstrap.js +692 -1447
- 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 +20 -11
- data/assets/stylesheets/bootstrap/_alert.scss +8 -11
- data/assets/stylesheets/bootstrap/_button-group.scss +2 -2
- data/assets/stylesheets/bootstrap/_buttons.scss +12 -3
- data/assets/stylesheets/bootstrap/_card.scss +5 -0
- data/assets/stylesheets/bootstrap/_carousel.scss +22 -12
- 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/_modal.scss +0 -1
- data/assets/stylesheets/bootstrap/_nav.scss +42 -17
- data/assets/stylesheets/bootstrap/_navbar.scss +15 -4
- data/assets/stylesheets/bootstrap/_offcanvas.scss +5 -6
- 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 +19 -12
- 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 +289 -172
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +23 -3
- data/assets/stylesheets/bootstrap/forms/_form-check.scss +27 -13
- 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 +20 -9
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +2 -2
- 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 +17 -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 +2 -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
- data/test/test_helper.rb +2 -2
- metadata +39 -19
- data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +0 -18
@@ -1,29 +1,22 @@
|
|
1
1
|
/*!
|
2
|
-
* Bootstrap modal.js v5.
|
3
|
-
* Copyright 2011-
|
2
|
+
* Bootstrap modal.js v5.3.3 (https://getbootstrap.com/)
|
3
|
+
* Copyright 2011-2024 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.Modal = 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 ScrollBarHelper__default = /*#__PURE__*/_interopDefaultLegacy(ScrollBarHelper);
|
17
|
-
const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
|
18
|
-
const Backdrop__default = /*#__PURE__*/_interopDefaultLegacy(Backdrop);
|
19
|
-
const FocusTrap__default = /*#__PURE__*/_interopDefaultLegacy(FocusTrap);
|
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/backdrop.js'), require('./util/component-functions.js'), require('./util/focustrap.js'), require('./util/index.js'), require('./util/scrollbar.js')) :
|
8
|
+
typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/selector-engine', './util/backdrop', './util/component-functions', './util/focustrap', './util/index', './util/scrollbar'], factory) :
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Backdrop, global.ComponentFunctions, global.Focustrap, global.Index, global.Scrollbar));
|
10
|
+
})(this, (function (BaseComponent, EventHandler, SelectorEngine, Backdrop, componentFunctions_js, FocusTrap, index_js, ScrollBarHelper) { 'use strict';
|
20
11
|
|
21
12
|
/**
|
22
13
|
* --------------------------------------------------------------------------
|
23
|
-
* Bootstrap
|
14
|
+
* Bootstrap modal.js
|
24
15
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
25
16
|
* --------------------------------------------------------------------------
|
26
17
|
*/
|
18
|
+
|
19
|
+
|
27
20
|
/**
|
28
21
|
* Constants
|
29
22
|
*/
|
@@ -61,338 +54,265 @@
|
|
61
54
|
focus: 'boolean',
|
62
55
|
keyboard: 'boolean'
|
63
56
|
};
|
57
|
+
|
64
58
|
/**
|
65
59
|
* Class definition
|
66
60
|
*/
|
67
61
|
|
68
|
-
class Modal extends
|
62
|
+
class Modal extends BaseComponent {
|
69
63
|
constructor(element, config) {
|
70
64
|
super(element, config);
|
71
|
-
this._dialog =
|
65
|
+
this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
|
72
66
|
this._backdrop = this._initializeBackDrop();
|
73
67
|
this._focustrap = this._initializeFocusTrap();
|
74
68
|
this._isShown = false;
|
75
69
|
this._isTransitioning = false;
|
76
|
-
this._scrollBar = new
|
77
|
-
|
70
|
+
this._scrollBar = new ScrollBarHelper();
|
78
71
|
this._addEventListeners();
|
79
|
-
}
|
80
|
-
|
72
|
+
}
|
81
73
|
|
74
|
+
// Getters
|
82
75
|
static get Default() {
|
83
76
|
return Default;
|
84
77
|
}
|
85
|
-
|
86
78
|
static get DefaultType() {
|
87
79
|
return DefaultType;
|
88
80
|
}
|
89
|
-
|
90
81
|
static get NAME() {
|
91
82
|
return NAME;
|
92
|
-
}
|
93
|
-
|
83
|
+
}
|
94
84
|
|
85
|
+
// Public
|
95
86
|
toggle(relatedTarget) {
|
96
87
|
return this._isShown ? this.hide() : this.show(relatedTarget);
|
97
88
|
}
|
98
|
-
|
99
89
|
show(relatedTarget) {
|
100
90
|
if (this._isShown || this._isTransitioning) {
|
101
91
|
return;
|
102
92
|
}
|
103
|
-
|
104
|
-
const showEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW, {
|
93
|
+
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {
|
105
94
|
relatedTarget
|
106
95
|
});
|
107
|
-
|
108
96
|
if (showEvent.defaultPrevented) {
|
109
97
|
return;
|
110
98
|
}
|
111
|
-
|
112
99
|
this._isShown = true;
|
113
100
|
this._isTransitioning = true;
|
114
|
-
|
115
101
|
this._scrollBar.hide();
|
116
|
-
|
117
102
|
document.body.classList.add(CLASS_NAME_OPEN);
|
118
|
-
|
119
103
|
this._adjustDialog();
|
120
|
-
|
121
104
|
this._backdrop.show(() => this._showElement(relatedTarget));
|
122
105
|
}
|
123
|
-
|
124
106
|
hide() {
|
125
107
|
if (!this._isShown || this._isTransitioning) {
|
126
108
|
return;
|
127
109
|
}
|
128
|
-
|
129
|
-
const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
|
130
|
-
|
110
|
+
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
|
131
111
|
if (hideEvent.defaultPrevented) {
|
132
112
|
return;
|
133
113
|
}
|
134
|
-
|
135
114
|
this._isShown = false;
|
136
115
|
this._isTransitioning = true;
|
137
|
-
|
138
116
|
this._focustrap.deactivate();
|
139
|
-
|
140
117
|
this._element.classList.remove(CLASS_NAME_SHOW);
|
141
|
-
|
142
118
|
this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
|
143
119
|
}
|
144
|
-
|
145
120
|
dispose() {
|
146
|
-
|
147
|
-
|
148
|
-
}
|
149
|
-
|
121
|
+
EventHandler.off(window, EVENT_KEY);
|
122
|
+
EventHandler.off(this._dialog, EVENT_KEY);
|
150
123
|
this._backdrop.dispose();
|
151
|
-
|
152
124
|
this._focustrap.deactivate();
|
153
|
-
|
154
125
|
super.dispose();
|
155
126
|
}
|
156
|
-
|
157
127
|
handleUpdate() {
|
158
128
|
this._adjustDialog();
|
159
|
-
}
|
160
|
-
|
129
|
+
}
|
161
130
|
|
131
|
+
// Private
|
162
132
|
_initializeBackDrop() {
|
163
|
-
return new
|
133
|
+
return new Backdrop({
|
164
134
|
isVisible: Boolean(this._config.backdrop),
|
165
135
|
// 'static' option will be translated to true, and booleans will keep their value,
|
166
136
|
isAnimated: this._isAnimated()
|
167
137
|
});
|
168
138
|
}
|
169
|
-
|
170
139
|
_initializeFocusTrap() {
|
171
|
-
return new
|
140
|
+
return new FocusTrap({
|
172
141
|
trapElement: this._element
|
173
142
|
});
|
174
143
|
}
|
175
|
-
|
176
144
|
_showElement(relatedTarget) {
|
177
145
|
// try to append dynamic modal
|
178
146
|
if (!document.body.contains(this._element)) {
|
179
147
|
document.body.append(this._element);
|
180
148
|
}
|
181
|
-
|
182
149
|
this._element.style.display = 'block';
|
183
|
-
|
184
150
|
this._element.removeAttribute('aria-hidden');
|
185
|
-
|
186
151
|
this._element.setAttribute('aria-modal', true);
|
187
|
-
|
188
152
|
this._element.setAttribute('role', 'dialog');
|
189
|
-
|
190
153
|
this._element.scrollTop = 0;
|
191
|
-
const modalBody =
|
192
|
-
|
154
|
+
const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
|
193
155
|
if (modalBody) {
|
194
156
|
modalBody.scrollTop = 0;
|
195
157
|
}
|
196
|
-
|
197
|
-
index.reflow(this._element);
|
198
|
-
|
158
|
+
index_js.reflow(this._element);
|
199
159
|
this._element.classList.add(CLASS_NAME_SHOW);
|
200
|
-
|
201
160
|
const transitionComplete = () => {
|
202
161
|
if (this._config.focus) {
|
203
162
|
this._focustrap.activate();
|
204
163
|
}
|
205
|
-
|
206
164
|
this._isTransitioning = false;
|
207
|
-
|
165
|
+
EventHandler.trigger(this._element, EVENT_SHOWN, {
|
208
166
|
relatedTarget
|
209
167
|
});
|
210
168
|
};
|
211
|
-
|
212
169
|
this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
|
213
170
|
}
|
214
|
-
|
215
171
|
_addEventListeners() {
|
216
|
-
|
172
|
+
EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
|
217
173
|
if (event.key !== ESCAPE_KEY) {
|
218
174
|
return;
|
219
175
|
}
|
220
|
-
|
221
176
|
if (this._config.keyboard) {
|
222
|
-
event.preventDefault();
|
223
177
|
this.hide();
|
224
178
|
return;
|
225
179
|
}
|
226
|
-
|
227
180
|
this._triggerBackdropTransition();
|
228
181
|
});
|
229
|
-
|
182
|
+
EventHandler.on(window, EVENT_RESIZE, () => {
|
230
183
|
if (this._isShown && !this._isTransitioning) {
|
231
184
|
this._adjustDialog();
|
232
185
|
}
|
233
186
|
});
|
234
|
-
|
187
|
+
EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {
|
235
188
|
// a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks
|
236
|
-
|
189
|
+
EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {
|
237
190
|
if (this._element !== event.target || this._element !== event2.target) {
|
238
191
|
return;
|
239
192
|
}
|
240
|
-
|
241
193
|
if (this._config.backdrop === 'static') {
|
242
194
|
this._triggerBackdropTransition();
|
243
|
-
|
244
195
|
return;
|
245
196
|
}
|
246
|
-
|
247
197
|
if (this._config.backdrop) {
|
248
198
|
this.hide();
|
249
199
|
}
|
250
200
|
});
|
251
201
|
});
|
252
202
|
}
|
253
|
-
|
254
203
|
_hideModal() {
|
255
204
|
this._element.style.display = 'none';
|
256
|
-
|
257
205
|
this._element.setAttribute('aria-hidden', true);
|
258
|
-
|
259
206
|
this._element.removeAttribute('aria-modal');
|
260
|
-
|
261
207
|
this._element.removeAttribute('role');
|
262
|
-
|
263
208
|
this._isTransitioning = false;
|
264
|
-
|
265
209
|
this._backdrop.hide(() => {
|
266
210
|
document.body.classList.remove(CLASS_NAME_OPEN);
|
267
|
-
|
268
211
|
this._resetAdjustments();
|
269
|
-
|
270
212
|
this._scrollBar.reset();
|
271
|
-
|
272
|
-
EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
|
213
|
+
EventHandler.trigger(this._element, EVENT_HIDDEN);
|
273
214
|
});
|
274
215
|
}
|
275
|
-
|
276
216
|
_isAnimated() {
|
277
217
|
return this._element.classList.contains(CLASS_NAME_FADE);
|
278
218
|
}
|
279
|
-
|
280
219
|
_triggerBackdropTransition() {
|
281
|
-
const hideEvent =
|
282
|
-
|
220
|
+
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
|
283
221
|
if (hideEvent.defaultPrevented) {
|
284
222
|
return;
|
285
223
|
}
|
286
|
-
|
287
224
|
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
288
|
-
const initialOverflowY = this._element.style.overflowY;
|
289
|
-
|
225
|
+
const initialOverflowY = this._element.style.overflowY;
|
226
|
+
// return if the following background transition hasn't yet completed
|
290
227
|
if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {
|
291
228
|
return;
|
292
229
|
}
|
293
|
-
|
294
230
|
if (!isModalOverflowing) {
|
295
231
|
this._element.style.overflowY = 'hidden';
|
296
232
|
}
|
297
|
-
|
298
233
|
this._element.classList.add(CLASS_NAME_STATIC);
|
299
|
-
|
300
234
|
this._queueCallback(() => {
|
301
235
|
this._element.classList.remove(CLASS_NAME_STATIC);
|
302
|
-
|
303
236
|
this._queueCallback(() => {
|
304
237
|
this._element.style.overflowY = initialOverflowY;
|
305
238
|
}, this._dialog);
|
306
239
|
}, this._dialog);
|
307
|
-
|
308
240
|
this._element.focus();
|
309
241
|
}
|
242
|
+
|
310
243
|
/**
|
311
244
|
* The following methods are used to handle overflowing modals
|
312
245
|
*/
|
313
246
|
|
314
|
-
|
315
247
|
_adjustDialog() {
|
316
248
|
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
317
|
-
|
318
249
|
const scrollbarWidth = this._scrollBar.getWidth();
|
319
|
-
|
320
250
|
const isBodyOverflowing = scrollbarWidth > 0;
|
321
|
-
|
322
251
|
if (isBodyOverflowing && !isModalOverflowing) {
|
323
|
-
const property =
|
252
|
+
const property = index_js.isRTL() ? 'paddingLeft' : 'paddingRight';
|
324
253
|
this._element.style[property] = `${scrollbarWidth}px`;
|
325
254
|
}
|
326
|
-
|
327
255
|
if (!isBodyOverflowing && isModalOverflowing) {
|
328
|
-
const property =
|
256
|
+
const property = index_js.isRTL() ? 'paddingRight' : 'paddingLeft';
|
329
257
|
this._element.style[property] = `${scrollbarWidth}px`;
|
330
258
|
}
|
331
259
|
}
|
332
|
-
|
333
260
|
_resetAdjustments() {
|
334
261
|
this._element.style.paddingLeft = '';
|
335
262
|
this._element.style.paddingRight = '';
|
336
|
-
}
|
337
|
-
|
263
|
+
}
|
338
264
|
|
265
|
+
// Static
|
339
266
|
static jQueryInterface(config, relatedTarget) {
|
340
267
|
return this.each(function () {
|
341
268
|
const data = Modal.getOrCreateInstance(this, config);
|
342
|
-
|
343
269
|
if (typeof config !== 'string') {
|
344
270
|
return;
|
345
271
|
}
|
346
|
-
|
347
272
|
if (typeof data[config] === 'undefined') {
|
348
273
|
throw new TypeError(`No method named "${config}"`);
|
349
274
|
}
|
350
|
-
|
351
275
|
data[config](relatedTarget);
|
352
276
|
});
|
353
277
|
}
|
354
|
-
|
355
278
|
}
|
279
|
+
|
356
280
|
/**
|
357
281
|
* Data API implementation
|
358
282
|
*/
|
359
283
|
|
360
|
-
|
361
|
-
|
362
|
-
const target = index.getElementFromSelector(this);
|
363
|
-
|
284
|
+
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
285
|
+
const target = SelectorEngine.getElementFromSelector(this);
|
364
286
|
if (['A', 'AREA'].includes(this.tagName)) {
|
365
287
|
event.preventDefault();
|
366
288
|
}
|
367
|
-
|
368
|
-
EventHandler__default.default.one(target, EVENT_SHOW, showEvent => {
|
289
|
+
EventHandler.one(target, EVENT_SHOW, showEvent => {
|
369
290
|
if (showEvent.defaultPrevented) {
|
370
291
|
// only register focus restorer if modal will actually get shown
|
371
292
|
return;
|
372
293
|
}
|
373
|
-
|
374
|
-
|
375
|
-
if (index.isVisible(this)) {
|
294
|
+
EventHandler.one(target, EVENT_HIDDEN, () => {
|
295
|
+
if (index_js.isVisible(this)) {
|
376
296
|
this.focus();
|
377
297
|
}
|
378
298
|
});
|
379
|
-
});
|
380
|
-
|
381
|
-
const alreadyOpen = SelectorEngine__default.default.findOne(OPEN_SELECTOR);
|
299
|
+
});
|
382
300
|
|
301
|
+
// avoid conflict when clicking modal toggler while another one is open
|
302
|
+
const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
|
383
303
|
if (alreadyOpen) {
|
384
304
|
Modal.getInstance(alreadyOpen).hide();
|
385
305
|
}
|
386
|
-
|
387
306
|
const data = Modal.getOrCreateInstance(target);
|
388
307
|
data.toggle(this);
|
389
308
|
});
|
390
|
-
|
309
|
+
componentFunctions_js.enableDismissTrigger(Modal);
|
310
|
+
|
391
311
|
/**
|
392
312
|
* jQuery
|
393
313
|
*/
|
394
314
|
|
395
|
-
|
315
|
+
index_js.defineJQueryPlugin(Modal);
|
396
316
|
|
397
317
|
return Modal;
|
398
318
|
|