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.

Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/Gemfile +2 -4
  4. data/README.md +20 -22
  5. data/assets/javascripts/bootstrap.js +657 -361
  6. data/assets/javascripts/bootstrap.min.js +2 -3
  7. data/assets/javascripts/bootstrap/alert.js +8 -8
  8. data/assets/javascripts/bootstrap/button.js +16 -9
  9. data/assets/javascripts/bootstrap/carousel.js +48 -21
  10. data/assets/javascripts/bootstrap/collapse.js +42 -33
  11. data/assets/javascripts/bootstrap/dropdown.js +196 -52
  12. data/assets/javascripts/bootstrap/modal.js +71 -29
  13. data/assets/javascripts/bootstrap/popover.js +25 -13
  14. data/assets/javascripts/bootstrap/scrollspy.js +23 -21
  15. data/assets/javascripts/bootstrap/tab.js +14 -18
  16. data/assets/javascripts/bootstrap/tooltip.js +139 -83
  17. data/assets/javascripts/bootstrap/util.js +10 -8
  18. data/assets/stylesheets/_bootstrap-grid.scss +2 -8
  19. data/assets/stylesheets/_bootstrap-reboot.scss +1 -2
  20. data/assets/stylesheets/_bootstrap.scss +2 -15
  21. data/assets/stylesheets/bootstrap/_alert.scss +4 -11
  22. data/assets/stylesheets/bootstrap/_badge.scss +4 -33
  23. data/assets/stylesheets/bootstrap/_breadcrumb.scss +1 -1
  24. data/assets/stylesheets/bootstrap/_button-group.scss +11 -15
  25. data/assets/stylesheets/bootstrap/_buttons.scss +13 -42
  26. data/assets/stylesheets/bootstrap/_card.scss +27 -80
  27. data/assets/stylesheets/bootstrap/_carousel.scss +24 -17
  28. data/assets/stylesheets/bootstrap/_close.scss +0 -2
  29. data/assets/stylesheets/bootstrap/_custom-forms.scss +27 -36
  30. data/assets/stylesheets/bootstrap/_dropdown.scss +15 -48
  31. data/assets/stylesheets/bootstrap/_forms.scss +70 -68
  32. data/assets/stylesheets/bootstrap/_functions.scss +90 -0
  33. data/assets/stylesheets/bootstrap/_grid.scss +3 -2
  34. data/assets/stylesheets/bootstrap/_images.scss +1 -1
  35. data/assets/stylesheets/bootstrap/_input-group.scss +6 -8
  36. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -4
  37. data/assets/stylesheets/bootstrap/_list-group.scss +9 -36
  38. data/assets/stylesheets/bootstrap/_mixins.scss +2 -18
  39. data/assets/stylesheets/bootstrap/_modal.scss +3 -3
  40. data/assets/stylesheets/bootstrap/_nav.scss +15 -16
  41. data/assets/stylesheets/bootstrap/_navbar.scss +70 -54
  42. data/assets/stylesheets/bootstrap/_pagination.scss +3 -4
  43. data/assets/stylesheets/bootstrap/_popover.scss +96 -72
  44. data/assets/stylesheets/bootstrap/_print.scss +1 -9
  45. data/assets/stylesheets/bootstrap/_progress.scss +4 -4
  46. data/assets/stylesheets/bootstrap/_reboot.scss +187 -95
  47. data/assets/stylesheets/bootstrap/_tables.scss +34 -19
  48. data/assets/stylesheets/bootstrap/_tooltip.scss +52 -35
  49. data/assets/stylesheets/bootstrap/_type.scss +8 -28
  50. data/assets/stylesheets/bootstrap/_utilities.scss +1 -0
  51. data/assets/stylesheets/bootstrap/_variables.scss +286 -410
  52. data/assets/stylesheets/bootstrap/mixins/_alert.scss +4 -5
  53. data/assets/stylesheets/bootstrap/mixins/_badge.scss +6 -5
  54. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +3 -3
  55. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +5 -0
  56. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +23 -13
  57. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +11 -14
  58. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +1 -1
  59. data/assets/stylesheets/bootstrap/mixins/_forms.scss +57 -55
  60. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +1 -1
  61. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +9 -18
  62. data/assets/stylesheets/bootstrap/mixins/_grid.scss +12 -65
  63. data/assets/stylesheets/bootstrap/mixins/_hover.scss +6 -6
  64. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +2 -4
  65. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +3 -3
  66. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +1 -0
  67. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +4 -3
  68. data/assets/stylesheets/bootstrap/mixins/_resize.scss +1 -1
  69. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +5 -2
  70. data/assets/stylesheets/bootstrap/mixins/_text-truncate.scss +1 -1
  71. data/assets/stylesheets/bootstrap/mixins/_transition.scss +9 -0
  72. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +2 -2
  73. data/assets/stylesheets/bootstrap/utilities/_background.scss +4 -17
  74. data/assets/stylesheets/bootstrap/utilities/_borders.scss +20 -5
  75. data/assets/stylesheets/bootstrap/utilities/_display.scss +36 -1
  76. data/assets/stylesheets/bootstrap/{_responsive-embed.scss → utilities/_embed.scss} +0 -0
  77. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -4
  78. data/assets/stylesheets/bootstrap/utilities/_position.scss +5 -3
  79. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +10 -12
  80. data/assets/stylesheets/bootstrap/utilities/_text.scss +5 -17
  81. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +4 -48
  82. data/bootstrap.gemspec +2 -0
  83. data/lib/bootstrap.rb +2 -0
  84. data/lib/bootstrap/version.rb +2 -2
  85. data/tasks/updater/js.rb +7 -9
  86. data/tasks/updater/scss.rb +1 -4
  87. data/templates/project/_bootstrap-variables.scss +289 -396
  88. data/test/dummy_rails/app/assets/javascripts/application.js +1 -1
  89. data/test/dummy_rails/config/application.rb +0 -1
  90. data/test/gemfiles/rails_4_2.gemfile +0 -4
  91. data/test/gemfiles/rails_5_0.gemfile +0 -4
  92. data/test/gemfiles/rails_5_1.gemfile +8 -0
  93. metadata +23 -8
  94. data/assets/stylesheets/bootstrap/_custom.scss +0 -4
  95. data/assets/stylesheets/bootstrap/_normalize.scss +0 -461
  96. data/assets/stylesheets/bootstrap/mixins/_cards.scss +0 -47
  97. 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-alpha.6): dropdown.js
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-alpha.6';
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
- FOCUSIN_DATA_API: 'focusin' + EVENT_KEY + DATA_API_KEY,
39
- KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY
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
- ROLE_MENU: '[role="menu"]',
53
- ROLE_LISTBOX: '[role="listbox"]',
66
+ MENU: '.dropdown-menu',
54
67
  NAVBAR_NAV: '.navbar-nav',
55
- VISIBLE_ITEMS: '[role="menu"] li:not(.disabled) a, ' + '[role="listbox"] li:not(.disabled) a'
68
+ VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled)'
56
69
  };
57
70
 
58
- /**
59
- * ------------------------------------------------------------------------
60
- * Class Definition
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 false;
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 = $(parent).hasClass(ClassName.SHOW);
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 false;
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 false;
135
+ return;
109
136
  }
110
137
 
111
- this.focus();
112
- this.setAttribute('aria-expanded', true);
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
- $(parent).toggleClass(ClassName.SHOW);
115
- $(parent).trigger($.Event(Event.SHOWN, relatedTarget));
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
- return false;
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
- $(this._element).on(Event.CLICK, this.toggle);
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].call(this);
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 === 'focusin') && $.contains(parent, event.target)) {
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 (!/(38|40|27|32)/.test(event.which) || /input|textarea/i.test(event.target.tagName)) {
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.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + ' ' + Event.FOCUSIN_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
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-alpha.6): modal.js
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-alpha.6';
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
- * Class Definition
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
- throw new Error('Modal is transitioning');
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
- throw new Error('Modal is transitioning');
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._handleUpdate(event);
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', 'true');
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 bodyPadding = parseInt($(Selector.FIXED_CONTENT).css('padding-right') || 0, 10);
422
-
423
- this._originalBodyPadding = document.body.style.paddingRight || '';
425
+ var _this9 = this;
424
426
 
425
427
  if (this._isBodyOverflowing) {
426
- document.body.style.paddingRight = bodyPadding + this._scrollbarWidth + 'px';
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
- document.body.style.paddingRight = this._originalBodyPadding;
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.offsetWidth - scrollDiv.clientWidth;
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 _this9 = this;
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 ($(_this9).is(':visible')) {
512
- _this9.focus();
553
+ if ($(_this10).is(':visible')) {
554
+ _this10.focus();
513
555
  }
514
556
  });
515
557
  });