bootstrap 4.1.3 → 5.0.0
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/.travis.yml +17 -2
- data/CHANGELOG.md +2 -14
- data/README.md +7 -4
- data/Rakefile +2 -2
- data/assets/javascripts/bootstrap/alert.js +226 -166
- data/assets/javascripts/bootstrap/base-component.js +63 -0
- data/assets/javascripts/bootstrap/button.js +119 -165
- data/assets/javascripts/bootstrap/carousel.js +634 -445
- data/assets/javascripts/bootstrap/collapse.js +447 -327
- data/assets/javascripts/bootstrap/dom/data.js +68 -0
- data/assets/javascripts/bootstrap/dom/event-handler.js +322 -0
- data/assets/javascripts/bootstrap/dom/manipulator.js +88 -0
- data/assets/javascripts/bootstrap/dom/selector-engine.js +85 -0
- data/assets/javascripts/bootstrap/dropdown.js +550 -425
- data/assets/javascripts/bootstrap/modal.js +695 -492
- data/assets/javascripts/bootstrap/offcanvas.js +671 -0
- data/assets/javascripts/bootstrap/popover.js +167 -217
- data/assets/javascripts/bootstrap/scrollspy.js +319 -302
- data/assets/javascripts/bootstrap/tab.js +303 -221
- data/assets/javascripts/bootstrap/toast.js +333 -0
- data/assets/javascripts/bootstrap/tooltip.js +896 -577
- data/assets/javascripts/bootstrap-global-this-define.js +6 -0
- data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
- data/assets/javascripts/bootstrap-sprockets.js +15 -7
- data/assets/javascripts/bootstrap.js +4262 -3163
- data/assets/javascripts/bootstrap.min.js +4 -4
- data/assets/stylesheets/_bootstrap-grid.scss +54 -21
- data/assets/stylesheets/_bootstrap-reboot.scss +7 -4
- data/assets/stylesheets/_bootstrap.scss +21 -11
- data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
- data/assets/stylesheets/bootstrap/_alert.scss +15 -9
- data/assets/stylesheets/bootstrap/_badge.scss +3 -21
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +5 -18
- data/assets/stylesheets/bootstrap/_button-group.scss +29 -62
- data/assets/stylesheets/bootstrap/_buttons.scss +33 -65
- data/assets/stylesheets/bootstrap/_card.scss +55 -141
- data/assets/stylesheets/bootstrap/_carousel.scss +94 -101
- data/assets/stylesheets/bootstrap/_close.scss +33 -28
- data/assets/stylesheets/bootstrap/_containers.scss +41 -0
- data/assets/stylesheets/bootstrap/_dropdown.scss +114 -40
- data/assets/stylesheets/bootstrap/_forms.scss +9 -333
- data/assets/stylesheets/bootstrap/_functions.scss +148 -29
- data/assets/stylesheets/bootstrap/_grid.scss +4 -34
- data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
- data/assets/stylesheets/bootstrap/_images.scss +4 -4
- data/assets/stylesheets/bootstrap/_list-group.scss +86 -27
- data/assets/stylesheets/bootstrap/_mixins.scss +17 -16
- data/assets/stylesheets/bootstrap/_modal.scss +90 -42
- data/assets/stylesheets/bootstrap/_nav.scss +31 -10
- data/assets/stylesheets/bootstrap/_navbar.scss +68 -61
- data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
- data/assets/stylesheets/bootstrap/_pagination.scss +13 -27
- data/assets/stylesheets/bootstrap/_popover.scss +63 -88
- data/assets/stylesheets/bootstrap/_progress.scss +20 -6
- data/assets/stylesheets/bootstrap/_reboot.scss +349 -211
- data/assets/stylesheets/bootstrap/_root.scss +5 -8
- data/assets/stylesheets/bootstrap/_spinners.scss +69 -0
- data/assets/stylesheets/bootstrap/_tables.scss +79 -116
- data/assets/stylesheets/bootstrap/_toasts.scss +51 -0
- data/assets/stylesheets/bootstrap/_tooltip.scss +18 -18
- data/assets/stylesheets/bootstrap/_transitions.scss +2 -3
- data/assets/stylesheets/bootstrap/_type.scss +42 -63
- data/assets/stylesheets/bootstrap/_utilities.scss +594 -15
- data/assets/stylesheets/bootstrap/_variables.scss +952 -440
- data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
- data/assets/stylesheets/bootstrap/forms/_form-check.scss +152 -0
- data/assets/stylesheets/bootstrap/forms/_form-control.scss +219 -0
- data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
- data/assets/stylesheets/bootstrap/forms/_form-select.scss +67 -0
- data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
- data/assets/stylesheets/bootstrap/forms/_input-group.scss +121 -0
- data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
- data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
- data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
- data/assets/stylesheets/bootstrap/helpers/_position.scss +30 -0
- data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
- data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
- data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
- data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
- data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -5
- data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +57 -14
- data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +14 -1
- data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +13 -9
- data/assets/stylesheets/bootstrap/mixins/_buttons.scss +77 -53
- data/assets/stylesheets/bootstrap/mixins/_caret.scss +14 -16
- data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
- data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
- data/assets/stylesheets/bootstrap/mixins/_container.scss +9 -0
- data/assets/stylesheets/bootstrap/mixins/_deprecate.scss +10 -0
- data/assets/stylesheets/bootstrap/mixins/_forms.scss +87 -97
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +106 -33
- data/assets/stylesheets/bootstrap/mixins/_image.scss +0 -20
- data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +18 -9
- data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
- data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
- data/assets/stylesheets/bootstrap/mixins/_transition.scss +19 -6
- data/assets/stylesheets/bootstrap/mixins/_utilities.scss +68 -0
- data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
- data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
- data/assets/stylesheets/bootstrap/vendor/_rfs.scss +312 -0
- data/bootstrap.gemspec +7 -6
- data/lib/bootstrap/engine.rb +3 -0
- data/lib/bootstrap/version.rb +4 -2
- data/lib/bootstrap.rb +10 -7
- data/tasks/updater/js.rb +20 -5
- data/tasks/updater/network.rb +8 -2
- data/test/dummy_rails/app/assets/config/manifest.js +3 -0
- data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
- data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
- data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
- data/test/dummy_rails/app/views/pages/root.html +89 -0
- data/test/dummy_rails/config/application.rb +0 -3
- data/test/gemfiles/rails_6_0.gemfile +7 -0
- data/test/gemfiles/rails_6_1.gemfile +7 -0
- data/test/support/dummy_rails_integration.rb +3 -1
- data/test/test_helper.rb +18 -13
- metadata +64 -79
- data/assets/javascripts/bootstrap/util.js +0 -143
- data/assets/stylesheets/bootstrap/_code.scss +0 -48
- data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -433
- data/assets/stylesheets/bootstrap/_input-group.scss +0 -173
- data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -16
- data/assets/stylesheets/bootstrap/_media.scss +0 -8
- data/assets/stylesheets/bootstrap/_print.scss +0 -141
- data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
- data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -12
- data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -11
- data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -67
- data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
- data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
- data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -33
- data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -6
- data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -30
- data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -14
- data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -13
- data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -7
- data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
- data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
- data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -59
- data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -38
- data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -52
- data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
- data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -9
- data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -37
- data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
- data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
- data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -12
- data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -51
- data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -58
- data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -11
- data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
- /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
@@ -1,632 +1,835 @@
|
|
1
|
+
/*!
|
2
|
+
* Bootstrap modal.js v5.0.0 (https://getbootstrap.com/)
|
3
|
+
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
4
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
5
|
+
*/
|
1
6
|
(function (global, factory) {
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('
|
3
|
-
typeof define === 'function' && define.amd ? define(['
|
4
|
-
(global.Modal = factory(global.
|
5
|
-
}(this, (function (
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
7
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./base-component.js')) :
|
8
|
+
typeof define === 'function' && define.amd ? define(['./dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
|
10
|
+
}(this, (function (EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
|
11
|
+
|
12
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
13
|
+
|
14
|
+
var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
|
15
|
+
var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
|
16
|
+
var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
|
17
|
+
var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
|
18
|
+
|
19
|
+
/**
|
20
|
+
* --------------------------------------------------------------------------
|
21
|
+
* Bootstrap (v5.0.0): util/index.js
|
22
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
23
|
+
* --------------------------------------------------------------------------
|
24
|
+
*/
|
25
|
+
const MILLISECONDS_MULTIPLIER = 1000;
|
26
|
+
const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
|
27
|
+
|
28
|
+
const toType = obj => {
|
29
|
+
if (obj === null || obj === undefined) {
|
30
|
+
return `${obj}`;
|
17
31
|
}
|
18
|
-
}
|
19
32
|
|
20
|
-
|
21
|
-
|
22
|
-
if (staticProps) _defineProperties(Constructor, staticProps);
|
23
|
-
return Constructor;
|
24
|
-
}
|
33
|
+
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
|
34
|
+
};
|
25
35
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
+
const getSelector = element => {
|
37
|
+
let selector = element.getAttribute('data-bs-target');
|
38
|
+
|
39
|
+
if (!selector || selector === '#') {
|
40
|
+
let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
|
41
|
+
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
|
42
|
+
// `document.querySelector` will rightfully complain it is invalid.
|
43
|
+
// See https://github.com/twbs/bootstrap/issues/32273
|
44
|
+
|
45
|
+
if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
|
46
|
+
return null;
|
47
|
+
} // Just in case some CMS puts out a full URL with the anchor appended
|
48
|
+
|
49
|
+
|
50
|
+
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
|
51
|
+
hrefAttr = `#${hrefAttr.split('#')[1]}`;
|
52
|
+
}
|
53
|
+
|
54
|
+
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
|
36
55
|
}
|
37
56
|
|
38
|
-
return
|
39
|
-
}
|
57
|
+
return selector;
|
58
|
+
};
|
59
|
+
|
60
|
+
const getElementFromSelector = element => {
|
61
|
+
const selector = getSelector(element);
|
62
|
+
return selector ? document.querySelector(selector) : null;
|
63
|
+
};
|
64
|
+
|
65
|
+
const getTransitionDurationFromElement = element => {
|
66
|
+
if (!element) {
|
67
|
+
return 0;
|
68
|
+
} // Get transition-duration of the element
|
69
|
+
|
70
|
+
|
71
|
+
let {
|
72
|
+
transitionDuration,
|
73
|
+
transitionDelay
|
74
|
+
} = window.getComputedStyle(element);
|
75
|
+
const floatTransitionDuration = Number.parseFloat(transitionDuration);
|
76
|
+
const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
|
77
|
+
|
78
|
+
if (!floatTransitionDuration && !floatTransitionDelay) {
|
79
|
+
return 0;
|
80
|
+
} // If multiple durations are defined, take the first
|
40
81
|
|
41
|
-
function _objectSpread(target) {
|
42
|
-
for (var i = 1; i < arguments.length; i++) {
|
43
|
-
var source = arguments[i] != null ? arguments[i] : {};
|
44
|
-
var ownKeys = Object.keys(source);
|
45
82
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
83
|
+
transitionDuration = transitionDuration.split(',')[0];
|
84
|
+
transitionDelay = transitionDelay.split(',')[0];
|
85
|
+
return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
|
86
|
+
};
|
87
|
+
|
88
|
+
const triggerTransitionEnd = element => {
|
89
|
+
element.dispatchEvent(new Event(TRANSITION_END));
|
90
|
+
};
|
91
|
+
|
92
|
+
const isElement = obj => (obj[0] || obj).nodeType;
|
93
|
+
|
94
|
+
const emulateTransitionEnd = (element, duration) => {
|
95
|
+
let called = false;
|
96
|
+
const durationPadding = 5;
|
97
|
+
const emulatedDuration = duration + durationPadding;
|
98
|
+
|
99
|
+
function listener() {
|
100
|
+
called = true;
|
101
|
+
element.removeEventListener(TRANSITION_END, listener);
|
102
|
+
}
|
103
|
+
|
104
|
+
element.addEventListener(TRANSITION_END, listener);
|
105
|
+
setTimeout(() => {
|
106
|
+
if (!called) {
|
107
|
+
triggerTransitionEnd(element);
|
50
108
|
}
|
109
|
+
}, emulatedDuration);
|
110
|
+
};
|
51
111
|
|
52
|
-
|
53
|
-
|
54
|
-
|
112
|
+
const typeCheckConfig = (componentName, config, configTypes) => {
|
113
|
+
Object.keys(configTypes).forEach(property => {
|
114
|
+
const expectedTypes = configTypes[property];
|
115
|
+
const value = config[property];
|
116
|
+
const valueType = value && isElement(value) ? 'element' : toType(value);
|
117
|
+
|
118
|
+
if (!new RegExp(expectedTypes).test(valueType)) {
|
119
|
+
throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
|
120
|
+
}
|
121
|
+
});
|
122
|
+
};
|
123
|
+
|
124
|
+
const isVisible = element => {
|
125
|
+
if (!element) {
|
126
|
+
return false;
|
55
127
|
}
|
56
128
|
|
57
|
-
|
58
|
-
|
129
|
+
if (element.style && element.parentNode && element.parentNode.style) {
|
130
|
+
const elementStyle = getComputedStyle(element);
|
131
|
+
const parentNodeStyle = getComputedStyle(element.parentNode);
|
132
|
+
return elementStyle.display !== 'none' && parentNodeStyle.display !== 'none' && elementStyle.visibility !== 'hidden';
|
133
|
+
}
|
134
|
+
|
135
|
+
return false;
|
136
|
+
};
|
137
|
+
|
138
|
+
const reflow = element => element.offsetHeight;
|
139
|
+
|
140
|
+
const getjQuery = () => {
|
141
|
+
const {
|
142
|
+
jQuery
|
143
|
+
} = window;
|
144
|
+
|
145
|
+
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
|
146
|
+
return jQuery;
|
147
|
+
}
|
148
|
+
|
149
|
+
return null;
|
150
|
+
};
|
151
|
+
|
152
|
+
const onDOMContentLoaded = callback => {
|
153
|
+
if (document.readyState === 'loading') {
|
154
|
+
document.addEventListener('DOMContentLoaded', callback);
|
155
|
+
} else {
|
156
|
+
callback();
|
157
|
+
}
|
158
|
+
};
|
159
|
+
|
160
|
+
const isRTL = () => document.documentElement.dir === 'rtl';
|
161
|
+
|
162
|
+
const defineJQueryPlugin = (name, plugin) => {
|
163
|
+
onDOMContentLoaded(() => {
|
164
|
+
const $ = getjQuery();
|
165
|
+
/* istanbul ignore if */
|
166
|
+
|
167
|
+
if ($) {
|
168
|
+
const JQUERY_NO_CONFLICT = $.fn[name];
|
169
|
+
$.fn[name] = plugin.jQueryInterface;
|
170
|
+
$.fn[name].Constructor = plugin;
|
171
|
+
|
172
|
+
$.fn[name].noConflict = () => {
|
173
|
+
$.fn[name] = JQUERY_NO_CONFLICT;
|
174
|
+
return plugin.jQueryInterface;
|
175
|
+
};
|
176
|
+
}
|
177
|
+
});
|
178
|
+
};
|
179
|
+
|
180
|
+
const execute = callback => {
|
181
|
+
if (typeof callback === 'function') {
|
182
|
+
callback();
|
183
|
+
}
|
184
|
+
};
|
59
185
|
|
60
186
|
/**
|
61
187
|
* --------------------------------------------------------------------------
|
62
|
-
* Bootstrap (
|
63
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/
|
188
|
+
* Bootstrap (v5.0.0): util/scrollBar.js
|
189
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
64
190
|
* --------------------------------------------------------------------------
|
65
191
|
*/
|
192
|
+
const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
|
193
|
+
const SELECTOR_STICKY_CONTENT = '.sticky-top';
|
66
194
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
*/
|
73
|
-
var NAME = 'modal';
|
74
|
-
var VERSION = '4.1.3';
|
75
|
-
var DATA_KEY = 'bs.modal';
|
76
|
-
var EVENT_KEY = "." + DATA_KEY;
|
77
|
-
var DATA_API_KEY = '.data-api';
|
78
|
-
var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
|
79
|
-
var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
|
80
|
-
|
81
|
-
var Default = {
|
82
|
-
backdrop: true,
|
83
|
-
keyboard: true,
|
84
|
-
focus: true,
|
85
|
-
show: true
|
86
|
-
};
|
87
|
-
var DefaultType = {
|
88
|
-
backdrop: '(boolean|string)',
|
89
|
-
keyboard: 'boolean',
|
90
|
-
focus: 'boolean',
|
91
|
-
show: 'boolean'
|
92
|
-
};
|
93
|
-
var Event = {
|
94
|
-
HIDE: "hide" + EVENT_KEY,
|
95
|
-
HIDDEN: "hidden" + EVENT_KEY,
|
96
|
-
SHOW: "show" + EVENT_KEY,
|
97
|
-
SHOWN: "shown" + EVENT_KEY,
|
98
|
-
FOCUSIN: "focusin" + EVENT_KEY,
|
99
|
-
RESIZE: "resize" + EVENT_KEY,
|
100
|
-
CLICK_DISMISS: "click.dismiss" + EVENT_KEY,
|
101
|
-
KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY,
|
102
|
-
MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY,
|
103
|
-
MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY,
|
104
|
-
CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
|
105
|
-
};
|
106
|
-
var ClassName = {
|
107
|
-
SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
|
108
|
-
BACKDROP: 'modal-backdrop',
|
109
|
-
OPEN: 'modal-open',
|
110
|
-
FADE: 'fade',
|
111
|
-
SHOW: 'show'
|
112
|
-
};
|
113
|
-
var Selector = {
|
114
|
-
DIALOG: '.modal-dialog',
|
115
|
-
DATA_TOGGLE: '[data-toggle="modal"]',
|
116
|
-
DATA_DISMISS: '[data-dismiss="modal"]',
|
117
|
-
FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
|
118
|
-
STICKY_CONTENT: '.sticky-top'
|
119
|
-
/**
|
120
|
-
* ------------------------------------------------------------------------
|
121
|
-
* Class Definition
|
122
|
-
* ------------------------------------------------------------------------
|
123
|
-
*/
|
195
|
+
const getWidth = () => {
|
196
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
|
197
|
+
const documentWidth = document.documentElement.clientWidth;
|
198
|
+
return Math.abs(window.innerWidth - documentWidth);
|
199
|
+
};
|
124
200
|
|
125
|
-
|
201
|
+
const hide = (width = getWidth()) => {
|
202
|
+
_disableOverFlow(); // give padding to element to balances the hidden scrollbar width
|
126
203
|
|
127
|
-
var Modal =
|
128
|
-
/*#__PURE__*/
|
129
|
-
function () {
|
130
|
-
function Modal(element, config) {
|
131
|
-
this._config = this._getConfig(config);
|
132
|
-
this._element = element;
|
133
|
-
this._dialog = element.querySelector(Selector.DIALOG);
|
134
|
-
this._backdrop = null;
|
135
|
-
this._isShown = false;
|
136
|
-
this._isBodyOverflowing = false;
|
137
|
-
this._ignoreBackdropClick = false;
|
138
|
-
this._scrollbarWidth = 0;
|
139
|
-
} // Getters
|
140
204
|
|
205
|
+
_setElementAttributes('body', 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements, to keep shown fullwidth
|
141
206
|
|
142
|
-
var _proto = Modal.prototype;
|
143
|
-
|
144
|
-
// Public
|
145
|
-
_proto.toggle = function toggle(relatedTarget) {
|
146
|
-
return this._isShown ? this.hide() : this.show(relatedTarget);
|
147
|
-
};
|
148
207
|
|
149
|
-
|
150
|
-
var _this = this;
|
208
|
+
_setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
|
151
209
|
|
152
|
-
|
153
|
-
|
154
|
-
}
|
210
|
+
_setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
|
211
|
+
};
|
155
212
|
|
156
|
-
|
157
|
-
|
158
|
-
}
|
213
|
+
const _disableOverFlow = () => {
|
214
|
+
const actualValue = document.body.style.overflow;
|
159
215
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
$$$1(this._element).trigger(showEvent);
|
216
|
+
if (actualValue) {
|
217
|
+
Manipulator__default['default'].setDataAttribute(document.body, 'overflow', actualValue);
|
218
|
+
}
|
164
219
|
|
165
|
-
|
166
|
-
|
167
|
-
}
|
220
|
+
document.body.style.overflow = 'hidden';
|
221
|
+
};
|
168
222
|
|
169
|
-
|
223
|
+
const _setElementAttributes = (selector, styleProp, callback) => {
|
224
|
+
const scrollbarWidth = getWidth();
|
225
|
+
SelectorEngine__default['default'].find(selector).forEach(element => {
|
226
|
+
if (element !== document.body && window.innerWidth > element.clientWidth + scrollbarWidth) {
|
227
|
+
return;
|
228
|
+
}
|
170
229
|
|
171
|
-
|
230
|
+
const actualValue = element.style[styleProp];
|
231
|
+
const calculatedValue = window.getComputedStyle(element)[styleProp];
|
232
|
+
Manipulator__default['default'].setDataAttribute(element, styleProp, actualValue);
|
233
|
+
element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
|
234
|
+
});
|
235
|
+
};
|
172
236
|
|
173
|
-
|
237
|
+
const reset = () => {
|
238
|
+
_resetElementAttributes('body', 'overflow');
|
174
239
|
|
175
|
-
|
240
|
+
_resetElementAttributes('body', 'paddingRight');
|
176
241
|
|
177
|
-
|
242
|
+
_resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
|
178
243
|
|
179
|
-
|
244
|
+
_resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
|
245
|
+
};
|
180
246
|
|
181
|
-
|
247
|
+
const _resetElementAttributes = (selector, styleProp) => {
|
248
|
+
SelectorEngine__default['default'].find(selector).forEach(element => {
|
249
|
+
const value = Manipulator__default['default'].getDataAttribute(element, styleProp);
|
182
250
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
});
|
192
|
-
});
|
251
|
+
if (typeof value === 'undefined') {
|
252
|
+
element.style.removeProperty(styleProp);
|
253
|
+
} else {
|
254
|
+
Manipulator__default['default'].removeDataAttribute(element, styleProp);
|
255
|
+
element.style[styleProp] = value;
|
256
|
+
}
|
257
|
+
});
|
258
|
+
};
|
193
259
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
260
|
+
/**
|
261
|
+
* --------------------------------------------------------------------------
|
262
|
+
* Bootstrap (v5.0.0): util/backdrop.js
|
263
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
264
|
+
* --------------------------------------------------------------------------
|
265
|
+
*/
|
266
|
+
const Default$1 = {
|
267
|
+
isVisible: true,
|
268
|
+
// if false, we use the backdrop helper without adding any element to the dom
|
269
|
+
isAnimated: false,
|
270
|
+
rootElement: document.body,
|
271
|
+
// give the choice to place backdrop under different elements
|
272
|
+
clickCallback: null
|
273
|
+
};
|
274
|
+
const DefaultType$1 = {
|
275
|
+
isVisible: 'boolean',
|
276
|
+
isAnimated: 'boolean',
|
277
|
+
rootElement: 'element',
|
278
|
+
clickCallback: '(function|null)'
|
279
|
+
};
|
280
|
+
const NAME$1 = 'backdrop';
|
281
|
+
const CLASS_NAME_BACKDROP = 'modal-backdrop';
|
282
|
+
const CLASS_NAME_FADE$1 = 'fade';
|
283
|
+
const CLASS_NAME_SHOW$1 = 'show';
|
284
|
+
const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$1}`;
|
285
|
+
|
286
|
+
class Backdrop {
|
287
|
+
constructor(config) {
|
288
|
+
this._config = this._getConfig(config);
|
289
|
+
this._isAppended = false;
|
290
|
+
this._element = null;
|
291
|
+
}
|
198
292
|
|
199
|
-
|
200
|
-
|
293
|
+
show(callback) {
|
294
|
+
if (!this._config.isVisible) {
|
295
|
+
execute(callback);
|
296
|
+
return;
|
297
|
+
}
|
201
298
|
|
202
|
-
|
203
|
-
event.preventDefault();
|
204
|
-
}
|
299
|
+
this._append();
|
205
300
|
|
206
|
-
|
207
|
-
|
208
|
-
|
301
|
+
if (this._config.isAnimated) {
|
302
|
+
reflow(this._getElement());
|
303
|
+
}
|
209
304
|
|
210
|
-
|
211
|
-
$$$1(this._element).trigger(hideEvent);
|
305
|
+
this._getElement().classList.add(CLASS_NAME_SHOW$1);
|
212
306
|
|
213
|
-
|
214
|
-
|
215
|
-
|
307
|
+
this._emulateAnimation(() => {
|
308
|
+
execute(callback);
|
309
|
+
});
|
310
|
+
}
|
216
311
|
|
217
|
-
|
218
|
-
|
312
|
+
hide(callback) {
|
313
|
+
if (!this._config.isVisible) {
|
314
|
+
execute(callback);
|
315
|
+
return;
|
316
|
+
}
|
219
317
|
|
220
|
-
|
221
|
-
this._isTransitioning = true;
|
222
|
-
}
|
318
|
+
this._getElement().classList.remove(CLASS_NAME_SHOW$1);
|
223
319
|
|
224
|
-
|
320
|
+
this._emulateAnimation(() => {
|
321
|
+
this.dispose();
|
322
|
+
execute(callback);
|
323
|
+
});
|
324
|
+
} // Private
|
225
325
|
|
226
|
-
this._setResizeEvent();
|
227
326
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
327
|
+
_getElement() {
|
328
|
+
if (!this._element) {
|
329
|
+
const backdrop = document.createElement('div');
|
330
|
+
backdrop.className = CLASS_NAME_BACKDROP;
|
232
331
|
|
233
|
-
if (
|
234
|
-
|
235
|
-
$$$1(this._element).one(Util.TRANSITION_END, function (event) {
|
236
|
-
return _this2._hideModal(event);
|
237
|
-
}).emulateTransitionEnd(transitionDuration);
|
238
|
-
} else {
|
239
|
-
this._hideModal();
|
332
|
+
if (this._config.isAnimated) {
|
333
|
+
backdrop.classList.add(CLASS_NAME_FADE$1);
|
240
334
|
}
|
241
|
-
};
|
242
335
|
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
this._ignoreBackdropClick = null;
|
253
|
-
this._scrollbarWidth = null;
|
336
|
+
this._element = backdrop;
|
337
|
+
}
|
338
|
+
|
339
|
+
return this._element;
|
340
|
+
}
|
341
|
+
|
342
|
+
_getConfig(config) {
|
343
|
+
config = { ...Default$1,
|
344
|
+
...(typeof config === 'object' ? config : {})
|
254
345
|
};
|
346
|
+
typeCheckConfig(NAME$1, config, DefaultType$1);
|
347
|
+
return config;
|
348
|
+
}
|
255
349
|
|
256
|
-
|
257
|
-
|
258
|
-
|
350
|
+
_append() {
|
351
|
+
if (this._isAppended) {
|
352
|
+
return;
|
353
|
+
}
|
259
354
|
|
355
|
+
this._config.rootElement.appendChild(this._getElement());
|
260
356
|
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
357
|
+
EventHandler__default['default'].on(this._getElement(), EVENT_MOUSEDOWN, () => {
|
358
|
+
execute(this._config.clickCallback);
|
359
|
+
});
|
360
|
+
this._isAppended = true;
|
361
|
+
}
|
266
362
|
|
267
|
-
|
268
|
-
|
363
|
+
dispose() {
|
364
|
+
if (!this._isAppended) {
|
365
|
+
return;
|
366
|
+
}
|
269
367
|
|
270
|
-
|
368
|
+
EventHandler__default['default'].off(this._element, EVENT_MOUSEDOWN);
|
271
369
|
|
272
|
-
|
273
|
-
// Don't move modal's DOM position
|
274
|
-
document.body.appendChild(this._element);
|
275
|
-
}
|
370
|
+
this._getElement().parentNode.removeChild(this._element);
|
276
371
|
|
277
|
-
|
372
|
+
this._isAppended = false;
|
373
|
+
}
|
278
374
|
|
279
|
-
|
375
|
+
_emulateAnimation(callback) {
|
376
|
+
if (!this._config.isAnimated) {
|
377
|
+
execute(callback);
|
378
|
+
return;
|
379
|
+
}
|
280
380
|
|
281
|
-
|
381
|
+
const backdropTransitionDuration = getTransitionDurationFromElement(this._getElement());
|
382
|
+
EventHandler__default['default'].one(this._getElement(), 'transitionend', () => execute(callback));
|
383
|
+
emulateTransitionEnd(this._getElement(), backdropTransitionDuration);
|
384
|
+
}
|
282
385
|
|
283
|
-
|
284
|
-
Util.reflow(this._element);
|
285
|
-
}
|
386
|
+
}
|
286
387
|
|
287
|
-
|
388
|
+
/**
|
389
|
+
* --------------------------------------------------------------------------
|
390
|
+
* Bootstrap (v5.0.0): modal.js
|
391
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
392
|
+
* --------------------------------------------------------------------------
|
393
|
+
*/
|
394
|
+
/**
|
395
|
+
* ------------------------------------------------------------------------
|
396
|
+
* Constants
|
397
|
+
* ------------------------------------------------------------------------
|
398
|
+
*/
|
288
399
|
|
289
|
-
|
290
|
-
|
291
|
-
|
400
|
+
const NAME = 'modal';
|
401
|
+
const DATA_KEY = 'bs.modal';
|
402
|
+
const EVENT_KEY = `.${DATA_KEY}`;
|
403
|
+
const DATA_API_KEY = '.data-api';
|
404
|
+
const ESCAPE_KEY = 'Escape';
|
405
|
+
const Default = {
|
406
|
+
backdrop: true,
|
407
|
+
keyboard: true,
|
408
|
+
focus: true
|
409
|
+
};
|
410
|
+
const DefaultType = {
|
411
|
+
backdrop: '(boolean|string)',
|
412
|
+
keyboard: 'boolean',
|
413
|
+
focus: 'boolean'
|
414
|
+
};
|
415
|
+
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
416
|
+
const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;
|
417
|
+
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
418
|
+
const EVENT_SHOW = `show${EVENT_KEY}`;
|
419
|
+
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
420
|
+
const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
|
421
|
+
const EVENT_RESIZE = `resize${EVENT_KEY}`;
|
422
|
+
const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
|
423
|
+
const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
|
424
|
+
const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`;
|
425
|
+
const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`;
|
426
|
+
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
|
427
|
+
const CLASS_NAME_OPEN = 'modal-open';
|
428
|
+
const CLASS_NAME_FADE = 'fade';
|
429
|
+
const CLASS_NAME_SHOW = 'show';
|
430
|
+
const CLASS_NAME_STATIC = 'modal-static';
|
431
|
+
const SELECTOR_DIALOG = '.modal-dialog';
|
432
|
+
const SELECTOR_MODAL_BODY = '.modal-body';
|
433
|
+
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]';
|
434
|
+
const SELECTOR_DATA_DISMISS = '[data-bs-dismiss="modal"]';
|
435
|
+
/**
|
436
|
+
* ------------------------------------------------------------------------
|
437
|
+
* Class Definition
|
438
|
+
* ------------------------------------------------------------------------
|
439
|
+
*/
|
292
440
|
|
293
|
-
|
294
|
-
|
295
|
-
|
441
|
+
class Modal extends BaseComponent__default['default'] {
|
442
|
+
constructor(element, config) {
|
443
|
+
super(element);
|
444
|
+
this._config = this._getConfig(config);
|
445
|
+
this._dialog = SelectorEngine__default['default'].findOne(SELECTOR_DIALOG, this._element);
|
446
|
+
this._backdrop = this._initializeBackDrop();
|
447
|
+
this._isShown = false;
|
448
|
+
this._ignoreBackdropClick = false;
|
449
|
+
this._isTransitioning = false;
|
450
|
+
} // Getters
|
296
451
|
|
297
|
-
var transitionComplete = function transitionComplete() {
|
298
|
-
if (_this3._config.focus) {
|
299
|
-
_this3._element.focus();
|
300
|
-
}
|
301
452
|
|
302
|
-
|
303
|
-
|
304
|
-
|
453
|
+
static get Default() {
|
454
|
+
return Default;
|
455
|
+
}
|
305
456
|
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
} else {
|
310
|
-
transitionComplete();
|
311
|
-
}
|
312
|
-
};
|
457
|
+
static get DATA_KEY() {
|
458
|
+
return DATA_KEY;
|
459
|
+
} // Public
|
313
460
|
|
314
|
-
_proto._enforceFocus = function _enforceFocus() {
|
315
|
-
var _this4 = this;
|
316
461
|
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
462
|
+
toggle(relatedTarget) {
|
463
|
+
return this._isShown ? this.hide() : this.show(relatedTarget);
|
464
|
+
}
|
465
|
+
|
466
|
+
show(relatedTarget) {
|
467
|
+
if (this._isShown || this._isTransitioning) {
|
468
|
+
return;
|
469
|
+
}
|
470
|
+
|
471
|
+
if (this._isAnimated()) {
|
472
|
+
this._isTransitioning = true;
|
473
|
+
}
|
474
|
+
|
475
|
+
const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
|
476
|
+
relatedTarget
|
477
|
+
});
|
478
|
+
|
479
|
+
if (this._isShown || showEvent.defaultPrevented) {
|
480
|
+
return;
|
481
|
+
}
|
482
|
+
|
483
|
+
this._isShown = true;
|
484
|
+
hide();
|
485
|
+
document.body.classList.add(CLASS_NAME_OPEN);
|
486
|
+
|
487
|
+
this._adjustDialog();
|
488
|
+
|
489
|
+
this._setEscapeEvent();
|
490
|
+
|
491
|
+
this._setResizeEvent();
|
492
|
+
|
493
|
+
EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, event => this.hide(event));
|
494
|
+
EventHandler__default['default'].on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
|
495
|
+
EventHandler__default['default'].one(this._element, EVENT_MOUSEUP_DISMISS, event => {
|
496
|
+
if (event.target === this._element) {
|
497
|
+
this._ignoreBackdropClick = true;
|
321
498
|
}
|
322
499
|
});
|
323
|
-
};
|
500
|
+
});
|
324
501
|
|
325
|
-
|
326
|
-
|
502
|
+
this._showBackdrop(() => this._showElement(relatedTarget));
|
503
|
+
}
|
327
504
|
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
505
|
+
hide(event) {
|
506
|
+
if (event) {
|
507
|
+
event.preventDefault();
|
508
|
+
}
|
332
509
|
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
} else if (!this._isShown) {
|
337
|
-
$$$1(this._element).off(Event.KEYDOWN_DISMISS);
|
338
|
-
}
|
339
|
-
};
|
510
|
+
if (!this._isShown || this._isTransitioning) {
|
511
|
+
return;
|
512
|
+
}
|
340
513
|
|
341
|
-
|
342
|
-
var _this6 = this;
|
514
|
+
const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
|
343
515
|
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
});
|
348
|
-
} else {
|
349
|
-
$$$1(window).off(Event.RESIZE);
|
350
|
-
}
|
351
|
-
};
|
516
|
+
if (hideEvent.defaultPrevented) {
|
517
|
+
return;
|
518
|
+
}
|
352
519
|
|
353
|
-
|
354
|
-
var _this7 = this;
|
520
|
+
this._isShown = false;
|
355
521
|
|
356
|
-
|
522
|
+
const isAnimated = this._isAnimated();
|
357
523
|
|
358
|
-
|
524
|
+
if (isAnimated) {
|
525
|
+
this._isTransitioning = true;
|
526
|
+
}
|
359
527
|
|
360
|
-
|
528
|
+
this._setEscapeEvent();
|
361
529
|
|
362
|
-
|
363
|
-
$$$1(document.body).removeClass(ClassName.OPEN);
|
530
|
+
this._setResizeEvent();
|
364
531
|
|
365
|
-
|
532
|
+
EventHandler__default['default'].off(document, EVENT_FOCUSIN);
|
366
533
|
|
367
|
-
|
534
|
+
this._element.classList.remove(CLASS_NAME_SHOW);
|
368
535
|
|
369
|
-
|
370
|
-
|
371
|
-
};
|
536
|
+
EventHandler__default['default'].off(this._element, EVENT_CLICK_DISMISS);
|
537
|
+
EventHandler__default['default'].off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
|
372
538
|
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
539
|
+
if (isAnimated) {
|
540
|
+
const transitionDuration = getTransitionDurationFromElement(this._element);
|
541
|
+
EventHandler__default['default'].one(this._element, 'transitionend', event => this._hideModal(event));
|
542
|
+
emulateTransitionEnd(this._element, transitionDuration);
|
543
|
+
} else {
|
544
|
+
this._hideModal();
|
545
|
+
}
|
546
|
+
}
|
379
547
|
|
380
|
-
|
381
|
-
|
548
|
+
dispose() {
|
549
|
+
[window, this._dialog].forEach(htmlElement => EventHandler__default['default'].off(htmlElement, EVENT_KEY));
|
550
|
+
super.dispose();
|
551
|
+
/**
|
552
|
+
* `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`
|
553
|
+
* Do not move `document` in `htmlElements` array
|
554
|
+
* It will remove `EVENT_CLICK_DATA_API` event that should remain
|
555
|
+
*/
|
382
556
|
|
383
|
-
|
557
|
+
EventHandler__default['default'].off(document, EVENT_FOCUSIN);
|
558
|
+
this._config = null;
|
559
|
+
this._dialog = null;
|
384
560
|
|
385
|
-
|
386
|
-
this._backdrop = document.createElement('div');
|
387
|
-
this._backdrop.className = ClassName.BACKDROP;
|
561
|
+
this._backdrop.dispose();
|
388
562
|
|
389
|
-
|
390
|
-
|
391
|
-
|
563
|
+
this._backdrop = null;
|
564
|
+
this._isShown = null;
|
565
|
+
this._ignoreBackdropClick = null;
|
566
|
+
this._isTransitioning = null;
|
567
|
+
}
|
392
568
|
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
_this8._ignoreBackdropClick = false;
|
397
|
-
return;
|
398
|
-
}
|
399
|
-
|
400
|
-
if (event.target !== event.currentTarget) {
|
401
|
-
return;
|
402
|
-
}
|
403
|
-
|
404
|
-
if (_this8._config.backdrop === 'static') {
|
405
|
-
_this8._element.focus();
|
406
|
-
} else {
|
407
|
-
_this8.hide();
|
408
|
-
}
|
409
|
-
});
|
569
|
+
handleUpdate() {
|
570
|
+
this._adjustDialog();
|
571
|
+
} // Private
|
410
572
|
|
411
|
-
if (animate) {
|
412
|
-
Util.reflow(this._backdrop);
|
413
|
-
}
|
414
573
|
|
415
|
-
|
574
|
+
_initializeBackDrop() {
|
575
|
+
return new Backdrop({
|
576
|
+
isVisible: Boolean(this._config.backdrop),
|
577
|
+
// 'static' option will be translated to true, and booleans will keep their value
|
578
|
+
isAnimated: this._isAnimated()
|
579
|
+
});
|
580
|
+
}
|
416
581
|
|
417
|
-
|
418
|
-
|
419
|
-
|
582
|
+
_getConfig(config) {
|
583
|
+
config = { ...Default,
|
584
|
+
...Manipulator__default['default'].getDataAttributes(this._element),
|
585
|
+
...config
|
586
|
+
};
|
587
|
+
typeCheckConfig(NAME, config, DefaultType);
|
588
|
+
return config;
|
589
|
+
}
|
420
590
|
|
421
|
-
|
422
|
-
|
423
|
-
return;
|
424
|
-
}
|
591
|
+
_showElement(relatedTarget) {
|
592
|
+
const isAnimated = this._isAnimated();
|
425
593
|
|
426
|
-
|
427
|
-
$$$1(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);
|
428
|
-
} else if (!this._isShown && this._backdrop) {
|
429
|
-
$$$1(this._backdrop).removeClass(ClassName.SHOW);
|
594
|
+
const modalBody = SelectorEngine__default['default'].findOne(SELECTOR_MODAL_BODY, this._dialog);
|
430
595
|
|
431
|
-
|
432
|
-
|
596
|
+
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
|
597
|
+
// Don't move modal's DOM position
|
598
|
+
document.body.appendChild(this._element);
|
599
|
+
}
|
433
600
|
|
434
|
-
|
435
|
-
callback();
|
436
|
-
}
|
437
|
-
};
|
601
|
+
this._element.style.display = 'block';
|
438
602
|
|
439
|
-
|
440
|
-
var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
|
603
|
+
this._element.removeAttribute('aria-hidden');
|
441
604
|
|
442
|
-
|
443
|
-
} else {
|
444
|
-
callbackRemove();
|
445
|
-
}
|
446
|
-
} else if (callback) {
|
447
|
-
callback();
|
448
|
-
}
|
449
|
-
}; // ----------------------------------------------------------------------
|
450
|
-
// the following methods are used to handle overflowing modals
|
451
|
-
// todo (fat): these should probably be refactored out of modal.js
|
452
|
-
// ----------------------------------------------------------------------
|
605
|
+
this._element.setAttribute('aria-modal', true);
|
453
606
|
|
607
|
+
this._element.setAttribute('role', 'dialog');
|
454
608
|
|
455
|
-
|
456
|
-
var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
609
|
+
this._element.scrollTop = 0;
|
457
610
|
|
458
|
-
|
459
|
-
|
460
|
-
|
611
|
+
if (modalBody) {
|
612
|
+
modalBody.scrollTop = 0;
|
613
|
+
}
|
461
614
|
|
462
|
-
|
463
|
-
|
615
|
+
if (isAnimated) {
|
616
|
+
reflow(this._element);
|
617
|
+
}
|
618
|
+
|
619
|
+
this._element.classList.add(CLASS_NAME_SHOW);
|
620
|
+
|
621
|
+
if (this._config.focus) {
|
622
|
+
this._enforceFocus();
|
623
|
+
}
|
624
|
+
|
625
|
+
const transitionComplete = () => {
|
626
|
+
if (this._config.focus) {
|
627
|
+
this._element.focus();
|
464
628
|
}
|
465
|
-
};
|
466
629
|
|
467
|
-
|
468
|
-
this._element
|
469
|
-
|
630
|
+
this._isTransitioning = false;
|
631
|
+
EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
|
632
|
+
relatedTarget
|
633
|
+
});
|
470
634
|
};
|
471
635
|
|
472
|
-
|
473
|
-
|
474
|
-
this.
|
475
|
-
this.
|
476
|
-
}
|
636
|
+
if (isAnimated) {
|
637
|
+
const transitionDuration = getTransitionDurationFromElement(this._dialog);
|
638
|
+
EventHandler__default['default'].one(this._dialog, 'transitionend', transitionComplete);
|
639
|
+
emulateTransitionEnd(this._dialog, transitionDuration);
|
640
|
+
} else {
|
641
|
+
transitionComplete();
|
642
|
+
}
|
643
|
+
}
|
644
|
+
|
645
|
+
_enforceFocus() {
|
646
|
+
EventHandler__default['default'].off(document, EVENT_FOCUSIN); // guard against infinite focus loop
|
477
647
|
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
if (this._isBodyOverflowing) {
|
482
|
-
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set
|
483
|
-
// while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
|
484
|
-
var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT));
|
485
|
-
var stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT)); // Adjust fixed content padding
|
486
|
-
|
487
|
-
$$$1(fixedContent).each(function (index, element) {
|
488
|
-
var actualPadding = element.style.paddingRight;
|
489
|
-
var calculatedPadding = $$$1(element).css('padding-right');
|
490
|
-
$$$1(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px");
|
491
|
-
}); // Adjust sticky content margin
|
492
|
-
|
493
|
-
$$$1(stickyContent).each(function (index, element) {
|
494
|
-
var actualMargin = element.style.marginRight;
|
495
|
-
var calculatedMargin = $$$1(element).css('margin-right');
|
496
|
-
$$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px");
|
497
|
-
}); // Adjust body padding
|
498
|
-
|
499
|
-
var actualPadding = document.body.style.paddingRight;
|
500
|
-
var calculatedPadding = $$$1(document.body).css('padding-right');
|
501
|
-
$$$1(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
|
648
|
+
EventHandler__default['default'].on(document, EVENT_FOCUSIN, event => {
|
649
|
+
if (document !== event.target && this._element !== event.target && !this._element.contains(event.target)) {
|
650
|
+
this._element.focus();
|
502
651
|
}
|
503
|
-
};
|
652
|
+
});
|
653
|
+
}
|
504
654
|
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
var elements = [].slice.call(document.querySelectorAll("" + Selector.STICKY_CONTENT));
|
515
|
-
$$$1(elements).each(function (index, element) {
|
516
|
-
var margin = $$$1(element).data('margin-right');
|
517
|
-
|
518
|
-
if (typeof margin !== 'undefined') {
|
519
|
-
$$$1(element).css('margin-right', margin).removeData('margin-right');
|
655
|
+
_setEscapeEvent() {
|
656
|
+
if (this._isShown) {
|
657
|
+
EventHandler__default['default'].on(this._element, EVENT_KEYDOWN_DISMISS, event => {
|
658
|
+
if (this._config.keyboard && event.key === ESCAPE_KEY) {
|
659
|
+
event.preventDefault();
|
660
|
+
this.hide();
|
661
|
+
} else if (!this._config.keyboard && event.key === ESCAPE_KEY) {
|
662
|
+
this._triggerBackdropTransition();
|
520
663
|
}
|
521
|
-
});
|
664
|
+
});
|
665
|
+
} else {
|
666
|
+
EventHandler__default['default'].off(this._element, EVENT_KEYDOWN_DISMISS);
|
667
|
+
}
|
668
|
+
}
|
522
669
|
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
}
|
670
|
+
_setResizeEvent() {
|
671
|
+
if (this._isShown) {
|
672
|
+
EventHandler__default['default'].on(window, EVENT_RESIZE, () => this._adjustDialog());
|
673
|
+
} else {
|
674
|
+
EventHandler__default['default'].off(window, EVENT_RESIZE);
|
675
|
+
}
|
676
|
+
}
|
527
677
|
|
528
|
-
|
529
|
-
|
530
|
-
var scrollDiv = document.createElement('div');
|
531
|
-
scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
|
532
|
-
document.body.appendChild(scrollDiv);
|
533
|
-
var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
|
534
|
-
document.body.removeChild(scrollDiv);
|
535
|
-
return scrollbarWidth;
|
536
|
-
}; // Static
|
678
|
+
_hideModal() {
|
679
|
+
this._element.style.display = 'none';
|
537
680
|
|
681
|
+
this._element.setAttribute('aria-hidden', true);
|
538
682
|
|
539
|
-
|
540
|
-
return this.each(function () {
|
541
|
-
var data = $$$1(this).data(DATA_KEY);
|
683
|
+
this._element.removeAttribute('aria-modal');
|
542
684
|
|
543
|
-
|
685
|
+
this._element.removeAttribute('role');
|
544
686
|
|
545
|
-
|
546
|
-
data = new Modal(this, _config);
|
547
|
-
$$$1(this).data(DATA_KEY, data);
|
548
|
-
}
|
687
|
+
this._isTransitioning = false;
|
549
688
|
|
550
|
-
|
551
|
-
|
552
|
-
throw new TypeError("No method named \"" + config + "\"");
|
553
|
-
}
|
689
|
+
this._backdrop.hide(() => {
|
690
|
+
document.body.classList.remove(CLASS_NAME_OPEN);
|
554
691
|
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
692
|
+
this._resetAdjustments();
|
693
|
+
|
694
|
+
reset();
|
695
|
+
EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
|
696
|
+
});
|
697
|
+
}
|
561
698
|
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
699
|
+
_showBackdrop(callback) {
|
700
|
+
EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, event => {
|
701
|
+
if (this._ignoreBackdropClick) {
|
702
|
+
this._ignoreBackdropClick = false;
|
703
|
+
return;
|
566
704
|
}
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
return Default;
|
705
|
+
|
706
|
+
if (event.target !== event.currentTarget) {
|
707
|
+
return;
|
571
708
|
}
|
572
|
-
}]);
|
573
709
|
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
*/
|
710
|
+
if (this._config.backdrop === true) {
|
711
|
+
this.hide();
|
712
|
+
} else if (this._config.backdrop === 'static') {
|
713
|
+
this._triggerBackdropTransition();
|
714
|
+
}
|
715
|
+
});
|
581
716
|
|
717
|
+
this._backdrop.show(callback);
|
718
|
+
}
|
582
719
|
|
583
|
-
|
584
|
-
|
720
|
+
_isAnimated() {
|
721
|
+
return this._element.classList.contains(CLASS_NAME_FADE);
|
722
|
+
}
|
585
723
|
|
586
|
-
|
587
|
-
|
724
|
+
_triggerBackdropTransition() {
|
725
|
+
const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE_PREVENTED);
|
588
726
|
|
589
|
-
if (
|
590
|
-
|
727
|
+
if (hideEvent.defaultPrevented) {
|
728
|
+
return;
|
591
729
|
}
|
592
730
|
|
593
|
-
|
731
|
+
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
594
732
|
|
595
|
-
if (
|
596
|
-
|
733
|
+
if (!isModalOverflowing) {
|
734
|
+
this._element.style.overflowY = 'hidden';
|
597
735
|
}
|
598
736
|
|
599
|
-
|
600
|
-
|
601
|
-
|
737
|
+
this._element.classList.add(CLASS_NAME_STATIC);
|
738
|
+
|
739
|
+
const modalTransitionDuration = getTransitionDurationFromElement(this._dialog);
|
740
|
+
EventHandler__default['default'].off(this._element, 'transitionend');
|
741
|
+
EventHandler__default['default'].one(this._element, 'transitionend', () => {
|
742
|
+
this._element.classList.remove(CLASS_NAME_STATIC);
|
743
|
+
|
744
|
+
if (!isModalOverflowing) {
|
745
|
+
EventHandler__default['default'].one(this._element, 'transitionend', () => {
|
746
|
+
this._element.style.overflowY = '';
|
747
|
+
});
|
748
|
+
emulateTransitionEnd(this._element, modalTransitionDuration);
|
749
|
+
}
|
750
|
+
});
|
751
|
+
emulateTransitionEnd(this._element, modalTransitionDuration);
|
752
|
+
|
753
|
+
this._element.focus();
|
754
|
+
} // ----------------------------------------------------------------------
|
755
|
+
// the following methods are used to handle overflowing modals
|
756
|
+
// ----------------------------------------------------------------------
|
757
|
+
|
758
|
+
|
759
|
+
_adjustDialog() {
|
760
|
+
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
761
|
+
const scrollbarWidth = getWidth();
|
762
|
+
const isBodyOverflowing = scrollbarWidth > 0;
|
763
|
+
|
764
|
+
if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {
|
765
|
+
this._element.style.paddingLeft = `${scrollbarWidth}px`;
|
766
|
+
}
|
767
|
+
|
768
|
+
if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {
|
769
|
+
this._element.style.paddingRight = `${scrollbarWidth}px`;
|
770
|
+
}
|
771
|
+
}
|
772
|
+
|
773
|
+
_resetAdjustments() {
|
774
|
+
this._element.style.paddingLeft = '';
|
775
|
+
this._element.style.paddingRight = '';
|
776
|
+
} // Static
|
777
|
+
|
778
|
+
|
779
|
+
static jQueryInterface(config, relatedTarget) {
|
780
|
+
return this.each(function () {
|
781
|
+
const data = Modal.getInstance(this) || new Modal(this, typeof config === 'object' ? config : {});
|
782
|
+
|
783
|
+
if (typeof config !== 'string') {
|
602
784
|
return;
|
603
785
|
}
|
604
786
|
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
787
|
+
if (typeof data[config] === 'undefined') {
|
788
|
+
throw new TypeError(`No method named "${config}"`);
|
789
|
+
}
|
790
|
+
|
791
|
+
data[config](relatedTarget);
|
610
792
|
});
|
793
|
+
}
|
611
794
|
|
612
|
-
|
795
|
+
}
|
796
|
+
/**
|
797
|
+
* ------------------------------------------------------------------------
|
798
|
+
* Data Api implementation
|
799
|
+
* ------------------------------------------------------------------------
|
800
|
+
*/
|
801
|
+
|
802
|
+
|
803
|
+
EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
804
|
+
const target = getElementFromSelector(this);
|
805
|
+
|
806
|
+
if (['A', 'AREA'].includes(this.tagName)) {
|
807
|
+
event.preventDefault();
|
808
|
+
}
|
809
|
+
|
810
|
+
EventHandler__default['default'].one(target, EVENT_SHOW, showEvent => {
|
811
|
+
if (showEvent.defaultPrevented) {
|
812
|
+
// only register focus restorer if modal will actually get shown
|
813
|
+
return;
|
814
|
+
}
|
815
|
+
|
816
|
+
EventHandler__default['default'].one(target, EVENT_HIDDEN, () => {
|
817
|
+
if (isVisible(this)) {
|
818
|
+
this.focus();
|
819
|
+
}
|
820
|
+
});
|
613
821
|
});
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
return Modal._jQueryInterface;
|
626
|
-
};
|
627
|
-
|
628
|
-
return Modal;
|
629
|
-
}($);
|
822
|
+
const data = Modal.getInstance(target) || new Modal(target);
|
823
|
+
data.toggle(this);
|
824
|
+
});
|
825
|
+
/**
|
826
|
+
* ------------------------------------------------------------------------
|
827
|
+
* jQuery
|
828
|
+
* ------------------------------------------------------------------------
|
829
|
+
* add .Modal to jQuery only if jQuery is present
|
830
|
+
*/
|
831
|
+
|
832
|
+
defineJQueryPlugin(NAME, Modal);
|
630
833
|
|
631
834
|
return Modal;
|
632
835
|
|