bootstrap 4.0.0.alpha6 → 4.0.0.beta
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bootstrap might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/Gemfile +2 -4
- data/README.md +20 -22
- data/assets/javascripts/bootstrap.js +657 -361
- data/assets/javascripts/bootstrap.min.js +2 -3
- data/assets/javascripts/bootstrap/alert.js +8 -8
- data/assets/javascripts/bootstrap/button.js +16 -9
- data/assets/javascripts/bootstrap/carousel.js +48 -21
- data/assets/javascripts/bootstrap/collapse.js +42 -33
- data/assets/javascripts/bootstrap/dropdown.js +196 -52
- data/assets/javascripts/bootstrap/modal.js +71 -29
- data/assets/javascripts/bootstrap/popover.js +25 -13
- data/assets/javascripts/bootstrap/scrollspy.js +23 -21
- data/assets/javascripts/bootstrap/tab.js +14 -18
- data/assets/javascripts/bootstrap/tooltip.js +139 -83
- data/assets/javascripts/bootstrap/util.js +10 -8
- data/assets/stylesheets/_bootstrap-grid.scss +2 -8
- data/assets/stylesheets/_bootstrap-reboot.scss +1 -2
- data/assets/stylesheets/_bootstrap.scss +2 -15
- data/assets/stylesheets/bootstrap/_alert.scss +4 -11
- data/assets/stylesheets/bootstrap/_badge.scss +4 -33
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +1 -1
- data/assets/stylesheets/bootstrap/_button-group.scss +11 -15
- data/assets/stylesheets/bootstrap/_buttons.scss +13 -42
- data/assets/stylesheets/bootstrap/_card.scss +27 -80
- data/assets/stylesheets/bootstrap/_carousel.scss +24 -17
- data/assets/stylesheets/bootstrap/_close.scss +0 -2
- data/assets/stylesheets/bootstrap/_custom-forms.scss +27 -36
- data/assets/stylesheets/bootstrap/_dropdown.scss +15 -48
- data/assets/stylesheets/bootstrap/_forms.scss +70 -68
- data/assets/stylesheets/bootstrap/_functions.scss +90 -0
- data/assets/stylesheets/bootstrap/_grid.scss +3 -2
- data/assets/stylesheets/bootstrap/_images.scss +1 -1
- data/assets/stylesheets/bootstrap/_input-group.scss +6 -8
- data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -4
- data/assets/stylesheets/bootstrap/_list-group.scss +9 -36
- data/assets/stylesheets/bootstrap/_mixins.scss +2 -18
- data/assets/stylesheets/bootstrap/_modal.scss +3 -3
- data/assets/stylesheets/bootstrap/_nav.scss +15 -16
- data/assets/stylesheets/bootstrap/_navbar.scss +70 -54
- data/assets/stylesheets/bootstrap/_pagination.scss +3 -4
- data/assets/stylesheets/bootstrap/_popover.scss +96 -72
- data/assets/stylesheets/bootstrap/_print.scss +1 -9
- data/assets/stylesheets/bootstrap/_progress.scss +4 -4
- data/assets/stylesheets/bootstrap/_reboot.scss +187 -95
- data/assets/stylesheets/bootstrap/_tables.scss +34 -19
- data/assets/stylesheets/bootstrap/_tooltip.scss +52 -35
- data/assets/stylesheets/bootstrap/_type.scss +8 -28
- data/assets/stylesheets/bootstrap/_utilities.scss +1 -0
- data/assets/stylesheets/bootstrap/_variables.scss +286 -410
- data/assets/stylesheets/bootstrap/mixins/_alert.scss +4 -5
- data/assets/stylesheets/bootstrap/mixins/_badge.scss +6 -5
- data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +3 -3
- data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +5 -0
- data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +23 -13
- data/assets/stylesheets/bootstrap/mixins/_buttons.scss +11 -14
- data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_forms.scss +57 -55
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +9 -18
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +12 -65
- data/assets/stylesheets/bootstrap/mixins/_hover.scss +6 -6
- data/assets/stylesheets/bootstrap/mixins/_list-group.scss +2 -4
- data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +3 -3
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +1 -0
- data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +4 -3
- data/assets/stylesheets/bootstrap/mixins/_resize.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +5 -2
- data/assets/stylesheets/bootstrap/mixins/_text-truncate.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_transition.scss +9 -0
- data/assets/stylesheets/bootstrap/mixins/_visibility.scss +2 -2
- data/assets/stylesheets/bootstrap/utilities/_background.scss +4 -17
- data/assets/stylesheets/bootstrap/utilities/_borders.scss +20 -5
- data/assets/stylesheets/bootstrap/utilities/_display.scss +36 -1
- data/assets/stylesheets/bootstrap/{_responsive-embed.scss → utilities/_embed.scss} +0 -0
- data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -4
- data/assets/stylesheets/bootstrap/utilities/_position.scss +5 -3
- data/assets/stylesheets/bootstrap/utilities/_spacing.scss +10 -12
- data/assets/stylesheets/bootstrap/utilities/_text.scss +5 -17
- data/assets/stylesheets/bootstrap/utilities/_visibility.scss +4 -48
- data/bootstrap.gemspec +2 -0
- data/lib/bootstrap.rb +2 -0
- data/lib/bootstrap/version.rb +2 -2
- data/tasks/updater/js.rb +7 -9
- data/tasks/updater/scss.rb +1 -4
- data/templates/project/_bootstrap-variables.scss +289 -396
- data/test/dummy_rails/app/assets/javascripts/application.js +1 -1
- data/test/dummy_rails/config/application.rb +0 -1
- data/test/gemfiles/rails_4_2.gemfile +0 -4
- data/test/gemfiles/rails_5_0.gemfile +0 -4
- data/test/gemfiles/rails_5_1.gemfile +8 -0
- metadata +23 -8
- data/assets/stylesheets/bootstrap/_custom.scss +0 -4
- data/assets/stylesheets/bootstrap/_normalize.scss +0 -461
- data/assets/stylesheets/bootstrap/mixins/_cards.scss +0 -47
- data/assets/stylesheets/bootstrap/mixins/_transforms.scss +0 -14
@@ -1,16 +1,26 @@
|
|
1
|
+
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
2
|
+
|
1
3
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
2
4
|
|
3
5
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
4
6
|
|
5
7
|
/**
|
6
8
|
* --------------------------------------------------------------------------
|
7
|
-
* Bootstrap (v4.0.0-
|
9
|
+
* Bootstrap (v4.0.0-beta): dropdown.js
|
8
10
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
9
11
|
* --------------------------------------------------------------------------
|
10
12
|
*/
|
11
13
|
|
12
14
|
var Dropdown = function ($) {
|
13
15
|
|
16
|
+
/**
|
17
|
+
* Check for Popper dependency
|
18
|
+
* Popper - https://popper.js.org
|
19
|
+
*/
|
20
|
+
if (typeof Popper === 'undefined') {
|
21
|
+
throw new Error('Bootstrap dropdown require Popper.js (https://popper.js.org)');
|
22
|
+
}
|
23
|
+
|
14
24
|
/**
|
15
25
|
* ------------------------------------------------------------------------
|
16
26
|
* Constants
|
@@ -18,15 +28,18 @@ var Dropdown = function ($) {
|
|
18
28
|
*/
|
19
29
|
|
20
30
|
var NAME = 'dropdown';
|
21
|
-
var VERSION = '4.0.0-
|
31
|
+
var VERSION = '4.0.0-beta';
|
22
32
|
var DATA_KEY = 'bs.dropdown';
|
23
33
|
var EVENT_KEY = '.' + DATA_KEY;
|
24
34
|
var DATA_API_KEY = '.data-api';
|
25
35
|
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
26
36
|
var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
|
37
|
+
var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
|
38
|
+
var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
|
27
39
|
var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
|
28
40
|
var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
|
29
41
|
var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
|
42
|
+
var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + '|' + ARROW_DOWN_KEYCODE + '|' + ESCAPE_KEYCODE);
|
30
43
|
|
31
44
|
var Event = {
|
32
45
|
HIDE: 'hide' + EVENT_KEY,
|
@@ -35,37 +48,60 @@ var Dropdown = function ($) {
|
|
35
48
|
SHOWN: 'shown' + EVENT_KEY,
|
36
49
|
CLICK: 'click' + EVENT_KEY,
|
37
50
|
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
|
38
|
-
|
39
|
-
|
51
|
+
KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY,
|
52
|
+
KEYUP_DATA_API: 'keyup' + EVENT_KEY + DATA_API_KEY
|
40
53
|
};
|
41
54
|
|
42
55
|
var ClassName = {
|
43
|
-
BACKDROP: 'dropdown-backdrop',
|
44
56
|
DISABLED: 'disabled',
|
45
|
-
SHOW: 'show'
|
57
|
+
SHOW: 'show',
|
58
|
+
DROPUP: 'dropup',
|
59
|
+
MENURIGHT: 'dropdown-menu-right',
|
60
|
+
MENULEFT: 'dropdown-menu-left'
|
46
61
|
};
|
47
62
|
|
48
63
|
var Selector = {
|
49
|
-
BACKDROP: '.dropdown-backdrop',
|
50
64
|
DATA_TOGGLE: '[data-toggle="dropdown"]',
|
51
65
|
FORM_CHILD: '.dropdown form',
|
52
|
-
|
53
|
-
ROLE_LISTBOX: '[role="listbox"]',
|
66
|
+
MENU: '.dropdown-menu',
|
54
67
|
NAVBAR_NAV: '.navbar-nav',
|
55
|
-
VISIBLE_ITEMS: '
|
68
|
+
VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled)'
|
56
69
|
};
|
57
70
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
71
|
+
var AttachmentMap = {
|
72
|
+
TOP: 'top-start',
|
73
|
+
TOPEND: 'top-end',
|
74
|
+
BOTTOM: 'bottom-start',
|
75
|
+
BOTTOMEND: 'bottom-end'
|
76
|
+
};
|
63
77
|
|
78
|
+
var Default = {
|
79
|
+
placement: AttachmentMap.BOTTOM,
|
80
|
+
offset: 0,
|
81
|
+
flip: true
|
82
|
+
};
|
83
|
+
|
84
|
+
var DefaultType = {
|
85
|
+
placement: 'string',
|
86
|
+
offset: '(number|string)',
|
87
|
+
flip: 'boolean'
|
88
|
+
|
89
|
+
/**
|
90
|
+
* ------------------------------------------------------------------------
|
91
|
+
* Class Definition
|
92
|
+
* ------------------------------------------------------------------------
|
93
|
+
*/
|
94
|
+
|
95
|
+
};
|
64
96
|
var Dropdown = function () {
|
65
|
-
function Dropdown(element) {
|
97
|
+
function Dropdown(element, config) {
|
66
98
|
_classCallCheck(this, Dropdown);
|
67
99
|
|
68
100
|
this._element = element;
|
101
|
+
this._popper = null;
|
102
|
+
this._config = this._getConfig(config);
|
103
|
+
this._menu = this._getMenuElement();
|
104
|
+
this._inNavbar = this._detectNavbar();
|
69
105
|
|
70
106
|
this._addEventListeners();
|
71
107
|
}
|
@@ -75,58 +111,144 @@ var Dropdown = function ($) {
|
|
75
111
|
// public
|
76
112
|
|
77
113
|
Dropdown.prototype.toggle = function toggle() {
|
78
|
-
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
|
79
|
-
return
|
114
|
+
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {
|
115
|
+
return;
|
80
116
|
}
|
81
117
|
|
82
|
-
var parent = Dropdown._getParentFromElement(this);
|
83
|
-
var isActive = $(
|
118
|
+
var parent = Dropdown._getParentFromElement(this._element);
|
119
|
+
var isActive = $(this._menu).hasClass(ClassName.SHOW);
|
84
120
|
|
85
121
|
Dropdown._clearMenus();
|
86
122
|
|
87
123
|
if (isActive) {
|
88
|
-
return
|
89
|
-
}
|
90
|
-
|
91
|
-
if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) {
|
92
|
-
|
93
|
-
// if mobile we use a backdrop because click events don't delegate
|
94
|
-
var dropdown = document.createElement('div');
|
95
|
-
dropdown.className = ClassName.BACKDROP;
|
96
|
-
$(dropdown).insertBefore(this);
|
97
|
-
$(dropdown).on('click', Dropdown._clearMenus);
|
124
|
+
return;
|
98
125
|
}
|
99
126
|
|
100
127
|
var relatedTarget = {
|
101
|
-
relatedTarget: this
|
128
|
+
relatedTarget: this._element
|
102
129
|
};
|
103
130
|
var showEvent = $.Event(Event.SHOW, relatedTarget);
|
104
131
|
|
105
132
|
$(parent).trigger(showEvent);
|
106
133
|
|
107
134
|
if (showEvent.isDefaultPrevented()) {
|
108
|
-
return
|
135
|
+
return;
|
109
136
|
}
|
110
137
|
|
111
|
-
this.
|
112
|
-
|
138
|
+
var element = this._element;
|
139
|
+
// for dropup with alignment we use the parent as popper container
|
140
|
+
if ($(parent).hasClass(ClassName.DROPUP)) {
|
141
|
+
if ($(this._menu).hasClass(ClassName.MENULEFT) || $(this._menu).hasClass(ClassName.MENURIGHT)) {
|
142
|
+
element = parent;
|
143
|
+
}
|
144
|
+
}
|
145
|
+
this._popper = new Popper(element, this._menu, this._getPopperConfig());
|
113
146
|
|
114
|
-
|
115
|
-
|
147
|
+
// if this is a touch-enabled device we add extra
|
148
|
+
// empty mouseover listeners to the body's immediate children;
|
149
|
+
// only needed because of broken event delegation on iOS
|
150
|
+
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
|
151
|
+
if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) {
|
152
|
+
$('body').children().on('mouseover', null, $.noop);
|
153
|
+
}
|
154
|
+
|
155
|
+
this._element.focus();
|
156
|
+
this._element.setAttribute('aria-expanded', true);
|
116
157
|
|
117
|
-
|
158
|
+
$(this._menu).toggleClass(ClassName.SHOW);
|
159
|
+
$(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget));
|
118
160
|
};
|
119
161
|
|
120
162
|
Dropdown.prototype.dispose = function dispose() {
|
121
163
|
$.removeData(this._element, DATA_KEY);
|
122
164
|
$(this._element).off(EVENT_KEY);
|
123
165
|
this._element = null;
|
166
|
+
this._menu = null;
|
167
|
+
if (this._popper !== null) {
|
168
|
+
this._popper.destroy();
|
169
|
+
}
|
170
|
+
this._popper = null;
|
171
|
+
};
|
172
|
+
|
173
|
+
Dropdown.prototype.update = function update() {
|
174
|
+
this._inNavbar = this._detectNavbar();
|
175
|
+
if (this._popper !== null) {
|
176
|
+
this._popper.scheduleUpdate();
|
177
|
+
}
|
124
178
|
};
|
125
179
|
|
126
180
|
// private
|
127
181
|
|
128
182
|
Dropdown.prototype._addEventListeners = function _addEventListeners() {
|
129
|
-
|
183
|
+
var _this = this;
|
184
|
+
|
185
|
+
$(this._element).on(Event.CLICK, function (event) {
|
186
|
+
event.preventDefault();
|
187
|
+
event.stopPropagation();
|
188
|
+
_this.toggle();
|
189
|
+
});
|
190
|
+
};
|
191
|
+
|
192
|
+
Dropdown.prototype._getConfig = function _getConfig(config) {
|
193
|
+
var elementData = $(this._element).data();
|
194
|
+
if (elementData.placement !== undefined) {
|
195
|
+
elementData.placement = AttachmentMap[elementData.placement.toUpperCase()];
|
196
|
+
}
|
197
|
+
|
198
|
+
config = $.extend({}, this.constructor.Default, $(this._element).data(), config);
|
199
|
+
|
200
|
+
Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
|
201
|
+
|
202
|
+
return config;
|
203
|
+
};
|
204
|
+
|
205
|
+
Dropdown.prototype._getMenuElement = function _getMenuElement() {
|
206
|
+
if (!this._menu) {
|
207
|
+
var parent = Dropdown._getParentFromElement(this._element);
|
208
|
+
this._menu = $(parent).find(Selector.MENU)[0];
|
209
|
+
}
|
210
|
+
return this._menu;
|
211
|
+
};
|
212
|
+
|
213
|
+
Dropdown.prototype._getPlacement = function _getPlacement() {
|
214
|
+
var $parentDropdown = $(this._element).parent();
|
215
|
+
var placement = this._config.placement;
|
216
|
+
|
217
|
+
// Handle dropup
|
218
|
+
if ($parentDropdown.hasClass(ClassName.DROPUP) || this._config.placement === AttachmentMap.TOP) {
|
219
|
+
placement = AttachmentMap.TOP;
|
220
|
+
if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
|
221
|
+
placement = AttachmentMap.TOPEND;
|
222
|
+
}
|
223
|
+
} else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
|
224
|
+
placement = AttachmentMap.BOTTOMEND;
|
225
|
+
}
|
226
|
+
return placement;
|
227
|
+
};
|
228
|
+
|
229
|
+
Dropdown.prototype._detectNavbar = function _detectNavbar() {
|
230
|
+
return $(this._element).closest('.navbar').length > 0;
|
231
|
+
};
|
232
|
+
|
233
|
+
Dropdown.prototype._getPopperConfig = function _getPopperConfig() {
|
234
|
+
var popperConfig = {
|
235
|
+
placement: this._getPlacement(),
|
236
|
+
modifiers: {
|
237
|
+
offset: {
|
238
|
+
offset: this._config.offset
|
239
|
+
},
|
240
|
+
flip: {
|
241
|
+
enabled: this._config.flip
|
242
|
+
}
|
243
|
+
}
|
244
|
+
|
245
|
+
// Disable Popper.js for Dropdown in Navbar
|
246
|
+
};if (this._inNavbar) {
|
247
|
+
popperConfig.modifiers.applyStyle = {
|
248
|
+
enabled: !this._inNavbar
|
249
|
+
};
|
250
|
+
}
|
251
|
+
return popperConfig;
|
130
252
|
};
|
131
253
|
|
132
254
|
// static
|
@@ -134,9 +256,10 @@ var Dropdown = function ($) {
|
|
134
256
|
Dropdown._jQueryInterface = function _jQueryInterface(config) {
|
135
257
|
return this.each(function () {
|
136
258
|
var data = $(this).data(DATA_KEY);
|
259
|
+
var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' ? config : null;
|
137
260
|
|
138
261
|
if (!data) {
|
139
|
-
data = new Dropdown(this);
|
262
|
+
data = new Dropdown(this, _config);
|
140
263
|
$(this).data(DATA_KEY, data);
|
141
264
|
}
|
142
265
|
|
@@ -144,34 +267,34 @@ var Dropdown = function ($) {
|
|
144
267
|
if (data[config] === undefined) {
|
145
268
|
throw new Error('No method named "' + config + '"');
|
146
269
|
}
|
147
|
-
data[config]
|
270
|
+
data[config]();
|
148
271
|
}
|
149
272
|
});
|
150
273
|
};
|
151
274
|
|
152
275
|
Dropdown._clearMenus = function _clearMenus(event) {
|
153
|
-
if (event && event.which === RIGHT_MOUSE_BUTTON_WHICH) {
|
276
|
+
if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
|
154
277
|
return;
|
155
278
|
}
|
156
279
|
|
157
|
-
var backdrop = $(Selector.BACKDROP)[0];
|
158
|
-
if (backdrop) {
|
159
|
-
backdrop.parentNode.removeChild(backdrop);
|
160
|
-
}
|
161
|
-
|
162
280
|
var toggles = $.makeArray($(Selector.DATA_TOGGLE));
|
163
|
-
|
164
281
|
for (var i = 0; i < toggles.length; i++) {
|
165
282
|
var parent = Dropdown._getParentFromElement(toggles[i]);
|
283
|
+
var context = $(toggles[i]).data(DATA_KEY);
|
166
284
|
var relatedTarget = {
|
167
285
|
relatedTarget: toggles[i]
|
168
286
|
};
|
169
287
|
|
288
|
+
if (!context) {
|
289
|
+
continue;
|
290
|
+
}
|
291
|
+
|
292
|
+
var dropdownMenu = context._menu;
|
170
293
|
if (!$(parent).hasClass(ClassName.SHOW)) {
|
171
294
|
continue;
|
172
295
|
}
|
173
296
|
|
174
|
-
if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === '
|
297
|
+
if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {
|
175
298
|
continue;
|
176
299
|
}
|
177
300
|
|
@@ -181,8 +304,15 @@ var Dropdown = function ($) {
|
|
181
304
|
continue;
|
182
305
|
}
|
183
306
|
|
307
|
+
// if this is a touch-enabled device we remove the extra
|
308
|
+
// empty mouseover listeners we added for iOS support
|
309
|
+
if ('ontouchstart' in document.documentElement) {
|
310
|
+
$('body').children().off('mouseover', null, $.noop);
|
311
|
+
}
|
312
|
+
|
184
313
|
toggles[i].setAttribute('aria-expanded', 'false');
|
185
314
|
|
315
|
+
$(dropdownMenu).removeClass(ClassName.SHOW);
|
186
316
|
$(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
|
187
317
|
}
|
188
318
|
};
|
@@ -199,7 +329,7 @@ var Dropdown = function ($) {
|
|
199
329
|
};
|
200
330
|
|
201
331
|
Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
|
202
|
-
if (
|
332
|
+
if (!REGEXP_KEYDOWN.test(event.which) || /button/i.test(event.target.tagName) && event.which === SPACE_KEYCODE || /input|textarea/i.test(event.target.tagName)) {
|
203
333
|
return;
|
204
334
|
}
|
205
335
|
|
@@ -213,7 +343,7 @@ var Dropdown = function ($) {
|
|
213
343
|
var parent = Dropdown._getParentFromElement(this);
|
214
344
|
var isActive = $(parent).hasClass(ClassName.SHOW);
|
215
345
|
|
216
|
-
if (!isActive && event.which !== ESCAPE_KEYCODE || isActive && event.which === ESCAPE_KEYCODE) {
|
346
|
+
if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
|
217
347
|
|
218
348
|
if (event.which === ESCAPE_KEYCODE) {
|
219
349
|
var toggle = $(parent).find(Selector.DATA_TOGGLE)[0];
|
@@ -254,6 +384,16 @@ var Dropdown = function ($) {
|
|
254
384
|
get: function get() {
|
255
385
|
return VERSION;
|
256
386
|
}
|
387
|
+
}, {
|
388
|
+
key: 'Default',
|
389
|
+
get: function get() {
|
390
|
+
return Default;
|
391
|
+
}
|
392
|
+
}, {
|
393
|
+
key: 'DefaultType',
|
394
|
+
get: function get() {
|
395
|
+
return DefaultType;
|
396
|
+
}
|
257
397
|
}]);
|
258
398
|
|
259
399
|
return Dropdown;
|
@@ -265,7 +405,11 @@ var Dropdown = function ($) {
|
|
265
405
|
* ------------------------------------------------------------------------
|
266
406
|
*/
|
267
407
|
|
268
|
-
$(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.
|
408
|
+
$(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + ' ' + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
409
|
+
event.preventDefault();
|
410
|
+
event.stopPropagation();
|
411
|
+
Dropdown._jQueryInterface.call($(this), 'toggle');
|
412
|
+
}).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
|
269
413
|
e.stopPropagation();
|
270
414
|
});
|
271
415
|
|
@@ -283,4 +427,4 @@ var Dropdown = function ($) {
|
|
283
427
|
};
|
284
428
|
|
285
429
|
return Dropdown;
|
286
|
-
}(jQuery);
|
430
|
+
}(jQuery); /* global Popper */
|
@@ -6,7 +6,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
|
|
6
6
|
|
7
7
|
/**
|
8
8
|
* --------------------------------------------------------------------------
|
9
|
-
* Bootstrap (v4.0.0-
|
9
|
+
* Bootstrap (v4.0.0-beta): modal.js
|
10
10
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
11
11
|
* --------------------------------------------------------------------------
|
12
12
|
*/
|
@@ -20,7 +20,7 @@ var Modal = function ($) {
|
|
20
20
|
*/
|
21
21
|
|
22
22
|
var NAME = 'modal';
|
23
|
-
var VERSION = '4.0.0-
|
23
|
+
var VERSION = '4.0.0-beta';
|
24
24
|
var DATA_KEY = 'bs.modal';
|
25
25
|
var EVENT_KEY = '.' + DATA_KEY;
|
26
26
|
var DATA_API_KEY = '.data-api';
|
@@ -69,15 +69,16 @@ var Modal = function ($) {
|
|
69
69
|
DIALOG: '.modal-dialog',
|
70
70
|
DATA_TOGGLE: '[data-toggle="modal"]',
|
71
71
|
DATA_DISMISS: '[data-dismiss="modal"]',
|
72
|
-
FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'
|
73
|
-
|
72
|
+
FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
|
73
|
+
NAVBAR_TOGGLER: '.navbar-toggler'
|
74
74
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
75
|
+
/**
|
76
|
+
* ------------------------------------------------------------------------
|
77
|
+
* Class Definition
|
78
|
+
* ------------------------------------------------------------------------
|
79
|
+
*/
|
80
80
|
|
81
|
+
};
|
81
82
|
var Modal = function () {
|
82
83
|
function Modal(element, config) {
|
83
84
|
_classCallCheck(this, Modal);
|
@@ -89,7 +90,6 @@ var Modal = function ($) {
|
|
89
90
|
this._isShown = false;
|
90
91
|
this._isBodyOverflowing = false;
|
91
92
|
this._ignoreBackdropClick = false;
|
92
|
-
this._isTransitioning = false;
|
93
93
|
this._originalBodyPadding = 0;
|
94
94
|
this._scrollbarWidth = 0;
|
95
95
|
}
|
@@ -106,12 +106,13 @@ var Modal = function ($) {
|
|
106
106
|
var _this = this;
|
107
107
|
|
108
108
|
if (this._isTransitioning) {
|
109
|
-
|
109
|
+
return;
|
110
110
|
}
|
111
111
|
|
112
112
|
if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
|
113
113
|
this._isTransitioning = true;
|
114
114
|
}
|
115
|
+
|
115
116
|
var showEvent = $.Event(Event.SHOW, {
|
116
117
|
relatedTarget: relatedTarget
|
117
118
|
});
|
@@ -156,16 +157,18 @@ var Modal = function ($) {
|
|
156
157
|
event.preventDefault();
|
157
158
|
}
|
158
159
|
|
159
|
-
if (this._isTransitioning) {
|
160
|
-
|
160
|
+
if (this._isTransitioning || !this._isShown) {
|
161
|
+
return;
|
161
162
|
}
|
162
163
|
|
163
164
|
var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
|
165
|
+
|
164
166
|
if (transition) {
|
165
167
|
this._isTransitioning = true;
|
166
168
|
}
|
167
169
|
|
168
170
|
var hideEvent = $.Event(Event.HIDE);
|
171
|
+
|
169
172
|
$(this._element).trigger(hideEvent);
|
170
173
|
|
171
174
|
if (!this._isShown || hideEvent.isDefaultPrevented()) {
|
@@ -185,6 +188,7 @@ var Modal = function ($) {
|
|
185
188
|
$(this._dialog).off(Event.MOUSEDOWN_DISMISS);
|
186
189
|
|
187
190
|
if (transition) {
|
191
|
+
|
188
192
|
$(this._element).one(Util.TRANSITION_END, function (event) {
|
189
193
|
return _this2._hideModal(event);
|
190
194
|
}).emulateTransitionEnd(TRANSITION_DURATION);
|
@@ -205,10 +209,13 @@ var Modal = function ($) {
|
|
205
209
|
this._isShown = null;
|
206
210
|
this._isBodyOverflowing = null;
|
207
211
|
this._ignoreBackdropClick = null;
|
208
|
-
this._originalBodyPadding = null;
|
209
212
|
this._scrollbarWidth = null;
|
210
213
|
};
|
211
214
|
|
215
|
+
Modal.prototype.handleUpdate = function handleUpdate() {
|
216
|
+
this._adjustDialog();
|
217
|
+
};
|
218
|
+
|
212
219
|
// private
|
213
220
|
|
214
221
|
Modal.prototype._getConfig = function _getConfig(config) {
|
@@ -277,6 +284,7 @@ var Modal = function ($) {
|
|
277
284
|
if (this._isShown && this._config.keyboard) {
|
278
285
|
$(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
|
279
286
|
if (event.which === ESCAPE_KEYCODE) {
|
287
|
+
event.preventDefault();
|
280
288
|
_this5.hide();
|
281
289
|
}
|
282
290
|
});
|
@@ -290,7 +298,7 @@ var Modal = function ($) {
|
|
290
298
|
|
291
299
|
if (this._isShown) {
|
292
300
|
$(window).on(Event.RESIZE, function (event) {
|
293
|
-
return _this6.
|
301
|
+
return _this6.handleUpdate(event);
|
294
302
|
});
|
295
303
|
} else {
|
296
304
|
$(window).off(Event.RESIZE);
|
@@ -301,7 +309,7 @@ var Modal = function ($) {
|
|
301
309
|
var _this7 = this;
|
302
310
|
|
303
311
|
this._element.style.display = 'none';
|
304
|
-
this._element.setAttribute('aria-hidden',
|
312
|
+
this._element.setAttribute('aria-hidden', true);
|
305
313
|
this._isTransitioning = false;
|
306
314
|
this._showBackdrop(function () {
|
307
315
|
$(document.body).removeClass(ClassName.OPEN);
|
@@ -391,10 +399,6 @@ var Modal = function ($) {
|
|
391
399
|
// todo (fat): these should probably be refactored out of modal.js
|
392
400
|
// ----------------------------------------------------------------------
|
393
401
|
|
394
|
-
Modal.prototype._handleUpdate = function _handleUpdate() {
|
395
|
-
this._adjustDialog();
|
396
|
-
};
|
397
|
-
|
398
402
|
Modal.prototype._adjustDialog = function _adjustDialog() {
|
399
403
|
var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
400
404
|
|
@@ -418,17 +422,55 @@ var Modal = function ($) {
|
|
418
422
|
};
|
419
423
|
|
420
424
|
Modal.prototype._setScrollbar = function _setScrollbar() {
|
421
|
-
var
|
422
|
-
|
423
|
-
this._originalBodyPadding = document.body.style.paddingRight || '';
|
425
|
+
var _this9 = this;
|
424
426
|
|
425
427
|
if (this._isBodyOverflowing) {
|
426
|
-
|
428
|
+
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set
|
429
|
+
// while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
|
430
|
+
|
431
|
+
// Adjust fixed content padding
|
432
|
+
$(Selector.FIXED_CONTENT).each(function (index, element) {
|
433
|
+
var actualPadding = $(element)[0].style.paddingRight;
|
434
|
+
var calculatedPadding = $(element).css('padding-right');
|
435
|
+
$(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + 'px');
|
436
|
+
});
|
437
|
+
|
438
|
+
// Adjust navbar-toggler margin
|
439
|
+
$(Selector.NAVBAR_TOGGLER).each(function (index, element) {
|
440
|
+
var actualMargin = $(element)[0].style.marginRight;
|
441
|
+
var calculatedMargin = $(element).css('margin-right');
|
442
|
+
$(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this9._scrollbarWidth + 'px');
|
443
|
+
});
|
444
|
+
|
445
|
+
// Adjust body padding
|
446
|
+
var actualPadding = document.body.style.paddingRight;
|
447
|
+
var calculatedPadding = $('body').css('padding-right');
|
448
|
+
$('body').data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + 'px');
|
427
449
|
}
|
428
450
|
};
|
429
451
|
|
430
452
|
Modal.prototype._resetScrollbar = function _resetScrollbar() {
|
431
|
-
|
453
|
+
// Restore fixed content padding
|
454
|
+
$(Selector.FIXED_CONTENT).each(function (index, element) {
|
455
|
+
var padding = $(element).data('padding-right');
|
456
|
+
if (typeof padding !== 'undefined') {
|
457
|
+
$(element).css('padding-right', padding).removeData('padding-right');
|
458
|
+
}
|
459
|
+
});
|
460
|
+
|
461
|
+
// Restore navbar-toggler margin
|
462
|
+
$(Selector.NAVBAR_TOGGLER).each(function (index, element) {
|
463
|
+
var margin = $(element).data('margin-right');
|
464
|
+
if (typeof margin !== 'undefined') {
|
465
|
+
$(element).css('margin-right', margin).removeData('margin-right');
|
466
|
+
}
|
467
|
+
});
|
468
|
+
|
469
|
+
// Restore body padding
|
470
|
+
var padding = $('body').data('padding-right');
|
471
|
+
if (typeof padding !== 'undefined') {
|
472
|
+
$('body').css('padding-right', padding).removeData('padding-right');
|
473
|
+
}
|
432
474
|
};
|
433
475
|
|
434
476
|
Modal.prototype._getScrollbarWidth = function _getScrollbarWidth() {
|
@@ -436,7 +478,7 @@ var Modal = function ($) {
|
|
436
478
|
var scrollDiv = document.createElement('div');
|
437
479
|
scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
|
438
480
|
document.body.appendChild(scrollDiv);
|
439
|
-
var scrollbarWidth = scrollDiv.
|
481
|
+
var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
|
440
482
|
document.body.removeChild(scrollDiv);
|
441
483
|
return scrollbarWidth;
|
442
484
|
};
|
@@ -486,7 +528,7 @@ var Modal = function ($) {
|
|
486
528
|
*/
|
487
529
|
|
488
530
|
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
489
|
-
var
|
531
|
+
var _this10 = this;
|
490
532
|
|
491
533
|
var target = void 0;
|
492
534
|
var selector = Util.getSelectorFromElement(this);
|
@@ -508,8 +550,8 @@ var Modal = function ($) {
|
|
508
550
|
}
|
509
551
|
|
510
552
|
$target.one(Event.HIDDEN, function () {
|
511
|
-
if ($(
|
512
|
-
|
553
|
+
if ($(_this10).is(':visible')) {
|
554
|
+
_this10.focus();
|
513
555
|
}
|
514
556
|
});
|
515
557
|
});
|