bootstrap 4.3.1 → 4.5.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.

Potentially problematic release.


This version of bootstrap might be problematic. Click here for more details.

Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +15 -1
  3. data/CHANGELOG.md +2 -14
  4. data/README.md +1 -1
  5. data/assets/javascripts/bootstrap/alert.js +26 -35
  6. data/assets/javascripts/bootstrap/button.js +93 -52
  7. data/assets/javascripts/bootstrap/carousel.js +122 -120
  8. data/assets/javascripts/bootstrap/collapse.js +75 -71
  9. data/assets/javascripts/bootstrap/dropdown.js +143 -140
  10. data/assets/javascripts/bootstrap/modal.js +165 -134
  11. data/assets/javascripts/bootstrap/popover.js +47 -39
  12. data/assets/javascripts/bootstrap/scrollspy.js +71 -71
  13. data/assets/javascripts/bootstrap/tab.js +51 -60
  14. data/assets/javascripts/bootstrap/toast.js +84 -72
  15. data/assets/javascripts/bootstrap/tooltip.js +141 -131
  16. data/assets/javascripts/bootstrap/util.js +28 -7
  17. data/assets/javascripts/bootstrap-sprockets.js +6 -6
  18. data/assets/javascripts/bootstrap.js +811 -826
  19. data/assets/javascripts/bootstrap.min.js +3 -3
  20. data/assets/stylesheets/_bootstrap-grid.scss +3 -3
  21. data/assets/stylesheets/_bootstrap-reboot.scss +3 -3
  22. data/assets/stylesheets/_bootstrap.scss +3 -3
  23. data/assets/stylesheets/bootstrap/_badge.scss +1 -1
  24. data/assets/stylesheets/bootstrap/_breadcrumb.scss +4 -1
  25. data/assets/stylesheets/bootstrap/_button-group.scss +1 -1
  26. data/assets/stylesheets/bootstrap/_buttons.scss +13 -8
  27. data/assets/stylesheets/bootstrap/_card.scss +28 -35
  28. data/assets/stylesheets/bootstrap/_carousel.scss +6 -6
  29. data/assets/stylesheets/bootstrap/_close.scss +2 -3
  30. data/assets/stylesheets/bootstrap/_code.scss +1 -1
  31. data/assets/stylesheets/bootstrap/_custom-forms.scss +24 -9
  32. data/assets/stylesheets/bootstrap/_dropdown.scss +5 -4
  33. data/assets/stylesheets/bootstrap/_forms.scss +26 -9
  34. data/assets/stylesheets/bootstrap/_functions.scss +60 -5
  35. data/assets/stylesheets/bootstrap/_grid.scss +33 -8
  36. data/assets/stylesheets/bootstrap/_images.scss +2 -2
  37. data/assets/stylesheets/bootstrap/_input-group.scss +1 -2
  38. data/assets/stylesheets/bootstrap/_list-group.scss +36 -31
  39. data/assets/stylesheets/bootstrap/_mixins.scss +3 -3
  40. data/assets/stylesheets/bootstrap/_modal.scss +28 -16
  41. data/assets/stylesheets/bootstrap/_nav.scss +4 -3
  42. data/assets/stylesheets/bootstrap/_navbar.scss +45 -15
  43. data/assets/stylesheets/bootstrap/_pagination.scss +3 -2
  44. data/assets/stylesheets/bootstrap/_popover.scss +8 -9
  45. data/assets/stylesheets/bootstrap/_print.scss +2 -2
  46. data/assets/stylesheets/bootstrap/_progress.scss +6 -2
  47. data/assets/stylesheets/bootstrap/_reboot.scss +24 -27
  48. data/assets/stylesheets/bootstrap/_root.scss +1 -0
  49. data/assets/stylesheets/bootstrap/_spinners.scss +1 -0
  50. data/assets/stylesheets/bootstrap/_tables.scss +3 -3
  51. data/assets/stylesheets/bootstrap/_type.scss +2 -2
  52. data/assets/stylesheets/bootstrap/_utilities.scss +2 -1
  53. data/assets/stylesheets/bootstrap/_variables.scss +46 -22
  54. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +5 -3
  55. data/assets/stylesheets/bootstrap/mixins/_badge.scss +1 -1
  56. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +26 -13
  57. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +11 -8
  58. data/assets/stylesheets/bootstrap/mixins/_caret.scss +8 -8
  59. data/assets/stylesheets/bootstrap/mixins/_float.scss +3 -3
  60. data/assets/stylesheets/bootstrap/mixins/_forms.scss +34 -49
  61. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +30 -15
  62. data/assets/stylesheets/bootstrap/mixins/_grid.scss +18 -0
  63. data/assets/stylesheets/bootstrap/mixins/_hover.scss +4 -4
  64. data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -1
  65. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +1 -1
  66. data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
  67. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +2 -1
  68. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +1 -1
  69. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +3 -2
  70. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +1 -1
  71. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +3 -2
  72. data/assets/stylesheets/bootstrap/mixins/_transition.scss +17 -7
  73. data/assets/stylesheets/bootstrap/utilities/_background.scss +2 -2
  74. data/assets/stylesheets/bootstrap/utilities/_interactions.scss +5 -0
  75. data/assets/stylesheets/bootstrap/utilities/_text.scss +3 -4
  76. data/bootstrap.gemspec +1 -1
  77. data/lib/bootstrap/version.rb +2 -2
  78. data/tasks/updater/network.rb +2 -2
  79. data/test/dummy_rails/app/assets/config/manifest.js +3 -0
  80. data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
  81. data/test/gemfiles/rails_6_0.gemfile +7 -0
  82. data/test/support/dummy_rails_integration.rb +3 -1
  83. data/test/test_helper.rb +18 -13
  84. metadata +11 -5
@@ -1,17 +1,17 @@
1
1
  /*!
2
- * Bootstrap dropdown.js v4.3.1 (https://getbootstrap.com/)
3
- * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap dropdown.js v4.5.0 (https://getbootstrap.com/)
3
+ * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
7
7
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('popper.js'), require('./util.js')) :
8
8
  typeof define === 'function' && define.amd ? define(['jquery', 'popper.js', './util.js'], factory) :
9
9
  (global = global || self, global.Dropdown = factory(global.jQuery, global.Popper, global.Util));
10
- }(this, function ($, Popper, Util) { 'use strict';
10
+ }(this, (function ($, Popper, Util) { 'use strict';
11
11
 
12
- $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
13
- Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
14
- Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
12
+ $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;
13
+ Popper = Popper && Object.prototype.hasOwnProperty.call(Popper, 'default') ? Popper['default'] : Popper;
14
+ Util = Util && Object.prototype.hasOwnProperty.call(Util, 'default') ? Util['default'] : Util;
15
15
 
16
16
  function _defineProperties(target, props) {
17
17
  for (var i = 0; i < props.length; i++) {
@@ -44,20 +44,35 @@
44
44
  return obj;
45
45
  }
46
46
 
47
- function _objectSpread(target) {
47
+ function ownKeys(object, enumerableOnly) {
48
+ var keys = Object.keys(object);
49
+
50
+ if (Object.getOwnPropertySymbols) {
51
+ var symbols = Object.getOwnPropertySymbols(object);
52
+ if (enumerableOnly) symbols = symbols.filter(function (sym) {
53
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
54
+ });
55
+ keys.push.apply(keys, symbols);
56
+ }
57
+
58
+ return keys;
59
+ }
60
+
61
+ function _objectSpread2(target) {
48
62
  for (var i = 1; i < arguments.length; i++) {
49
63
  var source = arguments[i] != null ? arguments[i] : {};
50
- var ownKeys = Object.keys(source);
51
64
 
52
- if (typeof Object.getOwnPropertySymbols === 'function') {
53
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
54
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
55
- }));
65
+ if (i % 2) {
66
+ ownKeys(Object(source), true).forEach(function (key) {
67
+ _defineProperty(target, key, source[key]);
68
+ });
69
+ } else if (Object.getOwnPropertyDescriptors) {
70
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
71
+ } else {
72
+ ownKeys(Object(source)).forEach(function (key) {
73
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
74
+ });
56
75
  }
57
-
58
- ownKeys.forEach(function (key) {
59
- _defineProperty(target, key, source[key]);
60
- });
61
76
  }
62
77
 
63
78
  return target;
@@ -70,7 +85,7 @@
70
85
  */
71
86
 
72
87
  var NAME = 'dropdown';
73
- var VERSION = '4.3.1';
88
+ var VERSION = '4.5.0';
74
89
  var DATA_KEY = 'bs.dropdown';
75
90
  var EVENT_KEY = "." + DATA_KEY;
76
91
  var DATA_API_KEY = '.data-api';
@@ -88,67 +103,55 @@
88
103
  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
89
104
 
90
105
  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
91
- var Event = {
92
- HIDE: "hide" + EVENT_KEY,
93
- HIDDEN: "hidden" + EVENT_KEY,
94
- SHOW: "show" + EVENT_KEY,
95
- SHOWN: "shown" + EVENT_KEY,
96
- CLICK: "click" + EVENT_KEY,
97
- CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
98
- KEYDOWN_DATA_API: "keydown" + EVENT_KEY + DATA_API_KEY,
99
- KEYUP_DATA_API: "keyup" + EVENT_KEY + DATA_API_KEY
100
- };
101
- var ClassName = {
102
- DISABLED: 'disabled',
103
- SHOW: 'show',
104
- DROPUP: 'dropup',
105
- DROPRIGHT: 'dropright',
106
- DROPLEFT: 'dropleft',
107
- MENURIGHT: 'dropdown-menu-right',
108
- MENULEFT: 'dropdown-menu-left',
109
- POSITION_STATIC: 'position-static'
110
- };
111
- var Selector = {
112
- DATA_TOGGLE: '[data-toggle="dropdown"]',
113
- FORM_CHILD: '.dropdown form',
114
- MENU: '.dropdown-menu',
115
- NAVBAR_NAV: '.navbar-nav',
116
- VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
117
- };
118
- var AttachmentMap = {
119
- TOP: 'top-start',
120
- TOPEND: 'top-end',
121
- BOTTOM: 'bottom-start',
122
- BOTTOMEND: 'bottom-end',
123
- RIGHT: 'right-start',
124
- RIGHTEND: 'right-end',
125
- LEFT: 'left-start',
126
- LEFTEND: 'left-end'
127
- };
106
+ var EVENT_HIDE = "hide" + EVENT_KEY;
107
+ var EVENT_HIDDEN = "hidden" + EVENT_KEY;
108
+ var EVENT_SHOW = "show" + EVENT_KEY;
109
+ var EVENT_SHOWN = "shown" + EVENT_KEY;
110
+ var EVENT_CLICK = "click" + EVENT_KEY;
111
+ var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
112
+ var EVENT_KEYDOWN_DATA_API = "keydown" + EVENT_KEY + DATA_API_KEY;
113
+ var EVENT_KEYUP_DATA_API = "keyup" + EVENT_KEY + DATA_API_KEY;
114
+ var CLASS_NAME_DISABLED = 'disabled';
115
+ var CLASS_NAME_SHOW = 'show';
116
+ var CLASS_NAME_DROPUP = 'dropup';
117
+ var CLASS_NAME_DROPRIGHT = 'dropright';
118
+ var CLASS_NAME_DROPLEFT = 'dropleft';
119
+ var CLASS_NAME_MENURIGHT = 'dropdown-menu-right';
120
+ var CLASS_NAME_POSITION_STATIC = 'position-static';
121
+ var SELECTOR_DATA_TOGGLE = '[data-toggle="dropdown"]';
122
+ var SELECTOR_FORM_CHILD = '.dropdown form';
123
+ var SELECTOR_MENU = '.dropdown-menu';
124
+ var SELECTOR_NAVBAR_NAV = '.navbar-nav';
125
+ var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
126
+ var PLACEMENT_TOP = 'top-start';
127
+ var PLACEMENT_TOPEND = 'top-end';
128
+ var PLACEMENT_BOTTOM = 'bottom-start';
129
+ var PLACEMENT_BOTTOMEND = 'bottom-end';
130
+ var PLACEMENT_RIGHT = 'right-start';
131
+ var PLACEMENT_LEFT = 'left-start';
128
132
  var Default = {
129
133
  offset: 0,
130
134
  flip: true,
131
135
  boundary: 'scrollParent',
132
136
  reference: 'toggle',
133
- display: 'dynamic'
137
+ display: 'dynamic',
138
+ popperConfig: null
134
139
  };
135
140
  var DefaultType = {
136
141
  offset: '(number|string|function)',
137
142
  flip: 'boolean',
138
143
  boundary: '(string|element)',
139
144
  reference: '(string|element)',
140
- display: 'string'
141
- /**
142
- * ------------------------------------------------------------------------
143
- * Class Definition
144
- * ------------------------------------------------------------------------
145
- */
146
-
145
+ display: 'string',
146
+ popperConfig: '(null|object)'
147
147
  };
148
+ /**
149
+ * ------------------------------------------------------------------------
150
+ * Class Definition
151
+ * ------------------------------------------------------------------------
152
+ */
148
153
 
149
- var Dropdown =
150
- /*#__PURE__*/
151
- function () {
154
+ var Dropdown = /*#__PURE__*/function () {
152
155
  function Dropdown(element, config) {
153
156
  this._element = element;
154
157
  this._popper = null;
@@ -164,13 +167,11 @@
164
167
 
165
168
  // Public
166
169
  _proto.toggle = function toggle() {
167
- if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {
170
+ if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED)) {
168
171
  return;
169
172
  }
170
173
 
171
- var parent = Dropdown._getParentFromElement(this._element);
172
-
173
- var isActive = $(this._menu).hasClass(ClassName.SHOW);
174
+ var isActive = $(this._menu).hasClass(CLASS_NAME_SHOW);
174
175
 
175
176
  Dropdown._clearMenus();
176
177
 
@@ -178,10 +179,25 @@
178
179
  return;
179
180
  }
180
181
 
182
+ this.show(true);
183
+ };
184
+
185
+ _proto.show = function show(usePopper) {
186
+ if (usePopper === void 0) {
187
+ usePopper = false;
188
+ }
189
+
190
+ if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED) || $(this._menu).hasClass(CLASS_NAME_SHOW)) {
191
+ return;
192
+ }
193
+
181
194
  var relatedTarget = {
182
195
  relatedTarget: this._element
183
196
  };
184
- var showEvent = $.Event(Event.SHOW, relatedTarget);
197
+ var showEvent = $.Event(EVENT_SHOW, relatedTarget);
198
+
199
+ var parent = Dropdown._getParentFromElement(this._element);
200
+
185
201
  $(parent).trigger(showEvent);
186
202
 
187
203
  if (showEvent.isDefaultPrevented()) {
@@ -189,7 +205,7 @@
189
205
  } // Disable totally Popper.js for Dropdown in Navbar
190
206
 
191
207
 
192
- if (!this._inNavbar) {
208
+ if (!this._inNavbar && usePopper) {
193
209
  /**
194
210
  * Check for Popper dependency
195
211
  * Popper - https://popper.js.org
@@ -214,7 +230,7 @@
214
230
 
215
231
 
216
232
  if (this._config.boundary !== 'scrollParent') {
217
- $(parent).addClass(ClassName.POSITION_STATIC);
233
+ $(parent).addClass(CLASS_NAME_POSITION_STATIC);
218
234
  }
219
235
 
220
236
  this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());
@@ -224,7 +240,7 @@
224
240
  // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
225
241
 
226
242
 
227
- if ('ontouchstart' in document.documentElement && $(parent).closest(Selector.NAVBAR_NAV).length === 0) {
243
+ if ('ontouchstart' in document.documentElement && $(parent).closest(SELECTOR_NAVBAR_NAV).length === 0) {
228
244
  $(document.body).children().on('mouseover', null, $.noop);
229
245
  }
230
246
 
@@ -232,41 +248,19 @@
232
248
 
233
249
  this._element.setAttribute('aria-expanded', true);
234
250
 
235
- $(this._menu).toggleClass(ClassName.SHOW);
236
- $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget));
237
- };
238
-
239
- _proto.show = function show() {
240
- if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {
241
- return;
242
- }
243
-
244
- var relatedTarget = {
245
- relatedTarget: this._element
246
- };
247
- var showEvent = $.Event(Event.SHOW, relatedTarget);
248
-
249
- var parent = Dropdown._getParentFromElement(this._element);
250
-
251
- $(parent).trigger(showEvent);
252
-
253
- if (showEvent.isDefaultPrevented()) {
254
- return;
255
- }
256
-
257
- $(this._menu).toggleClass(ClassName.SHOW);
258
- $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget));
251
+ $(this._menu).toggleClass(CLASS_NAME_SHOW);
252
+ $(parent).toggleClass(CLASS_NAME_SHOW).trigger($.Event(EVENT_SHOWN, relatedTarget));
259
253
  };
260
254
 
261
255
  _proto.hide = function hide() {
262
- if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {
256
+ if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED) || !$(this._menu).hasClass(CLASS_NAME_SHOW)) {
263
257
  return;
264
258
  }
265
259
 
266
260
  var relatedTarget = {
267
261
  relatedTarget: this._element
268
262
  };
269
- var hideEvent = $.Event(Event.HIDE, relatedTarget);
263
+ var hideEvent = $.Event(EVENT_HIDE, relatedTarget);
270
264
 
271
265
  var parent = Dropdown._getParentFromElement(this._element);
272
266
 
@@ -276,8 +270,12 @@
276
270
  return;
277
271
  }
278
272
 
279
- $(this._menu).toggleClass(ClassName.SHOW);
280
- $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
273
+ if (this._popper) {
274
+ this._popper.destroy();
275
+ }
276
+
277
+ $(this._menu).toggleClass(CLASS_NAME_SHOW);
278
+ $(parent).toggleClass(CLASS_NAME_SHOW).trigger($.Event(EVENT_HIDDEN, relatedTarget));
281
279
  };
282
280
 
283
281
  _proto.dispose = function dispose() {
@@ -305,7 +303,7 @@
305
303
  _proto._addEventListeners = function _addEventListeners() {
306
304
  var _this = this;
307
305
 
308
- $(this._element).on(Event.CLICK, function (event) {
306
+ $(this._element).on(EVENT_CLICK, function (event) {
309
307
  event.preventDefault();
310
308
  event.stopPropagation();
311
309
 
@@ -314,7 +312,7 @@
314
312
  };
315
313
 
316
314
  _proto._getConfig = function _getConfig(config) {
317
- config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);
315
+ config = _objectSpread2(_objectSpread2(_objectSpread2({}, this.constructor.Default), $(this._element).data()), config);
318
316
  Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
319
317
  return config;
320
318
  };
@@ -324,7 +322,7 @@
324
322
  var parent = Dropdown._getParentFromElement(this._element);
325
323
 
326
324
  if (parent) {
327
- this._menu = parent.querySelector(Selector.MENU);
325
+ this._menu = parent.querySelector(SELECTOR_MENU);
328
326
  }
329
327
  }
330
328
 
@@ -333,20 +331,16 @@
333
331
 
334
332
  _proto._getPlacement = function _getPlacement() {
335
333
  var $parentDropdown = $(this._element.parentNode);
336
- var placement = AttachmentMap.BOTTOM; // Handle dropup
337
-
338
- if ($parentDropdown.hasClass(ClassName.DROPUP)) {
339
- placement = AttachmentMap.TOP;
340
-
341
- if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
342
- placement = AttachmentMap.TOPEND;
343
- }
344
- } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {
345
- placement = AttachmentMap.RIGHT;
346
- } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {
347
- placement = AttachmentMap.LEFT;
348
- } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
349
- placement = AttachmentMap.BOTTOMEND;
334
+ var placement = PLACEMENT_BOTTOM; // Handle dropup
335
+
336
+ if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {
337
+ placement = $(this._menu).hasClass(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP;
338
+ } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {
339
+ placement = PLACEMENT_RIGHT;
340
+ } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {
341
+ placement = PLACEMENT_LEFT;
342
+ } else if ($(this._menu).hasClass(CLASS_NAME_MENURIGHT)) {
343
+ placement = PLACEMENT_BOTTOMEND;
350
344
  }
351
345
 
352
346
  return placement;
@@ -363,7 +357,7 @@
363
357
 
364
358
  if (typeof this._config.offset === 'function') {
365
359
  offset.fn = function (data) {
366
- data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
360
+ data.offsets = _objectSpread2(_objectSpread2({}, data.offsets), _this2._config.offset(data.offsets, _this2._element) || {});
367
361
  return data;
368
362
  };
369
363
  } else {
@@ -384,9 +378,8 @@
384
378
  preventOverflow: {
385
379
  boundariesElement: this._config.boundary
386
380
  }
387
- } // Disable Popper.js if we have a static display
388
-
389
- };
381
+ }
382
+ }; // Disable Popper.js if we have a static display
390
383
 
391
384
  if (this._config.display === 'static') {
392
385
  popperConfig.modifiers.applyStyle = {
@@ -394,7 +387,7 @@
394
387
  };
395
388
  }
396
389
 
397
- return popperConfig;
390
+ return _objectSpread2(_objectSpread2({}, popperConfig), this._config.popperConfig);
398
391
  } // Static
399
392
  ;
400
393
 
@@ -424,7 +417,7 @@
424
417
  return;
425
418
  }
426
419
 
427
- var toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
420
+ var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE));
428
421
 
429
422
  for (var i = 0, len = toggles.length; i < len; i++) {
430
423
  var parent = Dropdown._getParentFromElement(toggles[i]);
@@ -444,7 +437,7 @@
444
437
 
445
438
  var dropdownMenu = context._menu;
446
439
 
447
- if (!$(parent).hasClass(ClassName.SHOW)) {
440
+ if (!$(parent).hasClass(CLASS_NAME_SHOW)) {
448
441
  continue;
449
442
  }
450
443
 
@@ -452,7 +445,7 @@
452
445
  continue;
453
446
  }
454
447
 
455
- var hideEvent = $.Event(Event.HIDE, relatedTarget);
448
+ var hideEvent = $.Event(EVENT_HIDE, relatedTarget);
456
449
  $(parent).trigger(hideEvent);
457
450
 
458
451
  if (hideEvent.isDefaultPrevented()) {
@@ -466,8 +459,13 @@
466
459
  }
467
460
 
468
461
  toggles[i].setAttribute('aria-expanded', 'false');
469
- $(dropdownMenu).removeClass(ClassName.SHOW);
470
- $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
462
+
463
+ if (context._popper) {
464
+ context._popper.destroy();
465
+ }
466
+
467
+ $(dropdownMenu).removeClass(CLASS_NAME_SHOW);
468
+ $(parent).removeClass(CLASS_NAME_SHOW).trigger($.Event(EVENT_HIDDEN, relatedTarget));
471
469
  }
472
470
  };
473
471
 
@@ -491,32 +489,37 @@
491
489
  // - If key is other than escape
492
490
  // - If key is not up or down => not a dropdown command
493
491
  // - If trigger inside the menu => not a dropdown command
494
- if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
492
+ if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
495
493
  return;
496
494
  }
497
495
 
498
- event.preventDefault();
499
- event.stopPropagation();
500
-
501
- if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
496
+ if (this.disabled || $(this).hasClass(CLASS_NAME_DISABLED)) {
502
497
  return;
503
498
  }
504
499
 
505
500
  var parent = Dropdown._getParentFromElement(this);
506
501
 
507
- var isActive = $(parent).hasClass(ClassName.SHOW);
502
+ var isActive = $(parent).hasClass(CLASS_NAME_SHOW);
503
+
504
+ if (!isActive && event.which === ESCAPE_KEYCODE) {
505
+ return;
506
+ }
507
+
508
+ event.preventDefault();
509
+ event.stopPropagation();
508
510
 
509
511
  if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
510
512
  if (event.which === ESCAPE_KEYCODE) {
511
- var toggle = parent.querySelector(Selector.DATA_TOGGLE);
512
- $(toggle).trigger('focus');
513
+ $(parent.querySelector(SELECTOR_DATA_TOGGLE)).trigger('focus');
513
514
  }
514
515
 
515
516
  $(this).trigger('click');
516
517
  return;
517
518
  }
518
519
 
519
- var items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS));
520
+ var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) {
521
+ return $(item).is(':visible');
522
+ });
520
523
 
521
524
  if (items.length === 0) {
522
525
  return;
@@ -567,12 +570,12 @@
567
570
  */
568
571
 
569
572
 
570
- $(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) {
573
+ $(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) {
571
574
  event.preventDefault();
572
575
  event.stopPropagation();
573
576
 
574
577
  Dropdown._jQueryInterface.call($(this), 'toggle');
575
- }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
578
+ }).on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, function (e) {
576
579
  e.stopPropagation();
577
580
  });
578
581
  /**
@@ -591,4 +594,4 @@
591
594
 
592
595
  return Dropdown;
593
596
 
594
- }));
597
+ })));