bootstrap 5.0.0.beta2 → 5.0.2

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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/assets/javascripts/bootstrap-sprockets.js +8 -7
  4. data/assets/javascripts/bootstrap.js +2525 -2460
  5. data/assets/javascripts/bootstrap.min.js +2 -2
  6. data/assets/javascripts/bootstrap/alert.js +77 -179
  7. data/assets/javascripts/bootstrap/base-component.js +140 -38
  8. data/assets/javascripts/bootstrap/button.js +54 -100
  9. data/assets/javascripts/bootstrap/carousel.js +335 -451
  10. data/assets/javascripts/bootstrap/collapse.js +195 -303
  11. data/assets/javascripts/bootstrap/dom/data.js +34 -47
  12. data/assets/javascripts/bootstrap/dom/event-handler.js +95 -90
  13. data/assets/javascripts/bootstrap/dom/manipulator.js +23 -21
  14. data/assets/javascripts/bootstrap/dom/selector-engine.js +20 -28
  15. data/assets/javascripts/bootstrap/dropdown.js +323 -358
  16. data/assets/javascripts/bootstrap/modal.js +537 -489
  17. data/assets/javascripts/bootstrap/offcanvas.js +720 -0
  18. data/assets/javascripts/bootstrap/popover.js +112 -180
  19. data/assets/javascripts/bootstrap/scrollspy.js +167 -235
  20. data/assets/javascripts/bootstrap/tab.js +121 -188
  21. data/assets/javascripts/bootstrap/toast.js +166 -243
  22. data/assets/javascripts/bootstrap/tooltip.js +333 -495
  23. data/assets/stylesheets/_bootstrap-grid.scss +1 -1
  24. data/assets/stylesheets/_bootstrap-reboot.scss +1 -1
  25. data/assets/stylesheets/_bootstrap.scss +2 -1
  26. data/assets/stylesheets/bootstrap/_accordion.scss +24 -32
  27. data/assets/stylesheets/bootstrap/_buttons.scss +2 -0
  28. data/assets/stylesheets/bootstrap/_card.scss +6 -6
  29. data/assets/stylesheets/bootstrap/_carousel.scss +2 -2
  30. data/assets/stylesheets/bootstrap/_dropdown.scss +14 -23
  31. data/assets/stylesheets/bootstrap/_functions.scss +61 -3
  32. data/assets/stylesheets/bootstrap/_images.scss +1 -1
  33. data/assets/stylesheets/bootstrap/_list-group.scss +16 -5
  34. data/assets/stylesheets/bootstrap/_mixins.scss +1 -0
  35. data/assets/stylesheets/bootstrap/_modal.scss +8 -24
  36. data/assets/stylesheets/bootstrap/_nav.scss +7 -0
  37. data/assets/stylesheets/bootstrap/_navbar.scss +2 -0
  38. data/assets/stylesheets/bootstrap/_offcanvas.scss +79 -0
  39. data/assets/stylesheets/bootstrap/_popover.scss +10 -10
  40. data/assets/stylesheets/bootstrap/_progress.scss +3 -0
  41. data/assets/stylesheets/bootstrap/_reboot.scss +7 -21
  42. data/assets/stylesheets/bootstrap/_spinners.scss +6 -2
  43. data/assets/stylesheets/bootstrap/_tables.scss +1 -0
  44. data/assets/stylesheets/bootstrap/_toasts.scss +1 -1
  45. data/assets/stylesheets/bootstrap/_tooltip.scss +4 -4
  46. data/assets/stylesheets/bootstrap/_transitions.scss +2 -0
  47. data/assets/stylesheets/bootstrap/_utilities.scss +65 -37
  48. data/assets/stylesheets/bootstrap/_variables.scss +162 -50
  49. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +1 -1
  50. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +3 -1
  51. data/assets/stylesheets/bootstrap/forms/_form-check.scss +1 -1
  52. data/assets/stylesheets/bootstrap/forms/_form-control.scss +0 -4
  53. data/assets/stylesheets/bootstrap/forms/_form-range.scss +1 -1
  54. data/assets/stylesheets/bootstrap/forms/_form-select.scss +3 -0
  55. data/assets/stylesheets/bootstrap/mixins/_alert.scss +2 -0
  56. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +2 -0
  57. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +7 -2
  58. data/assets/stylesheets/bootstrap/mixins/_caret.scss +2 -0
  59. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  60. data/assets/stylesheets/bootstrap/mixins/_forms.scss +25 -5
  61. data/assets/stylesheets/bootstrap/mixins/_grid.scss +23 -11
  62. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +2 -0
  63. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +2 -0
  64. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +55 -13
  65. data/bootstrap.gemspec +1 -1
  66. data/lib/bootstrap/version.rb +2 -2
  67. data/tasks/updater/js.rb +1 -1
  68. data/tasks/updater/network.rb +7 -1
  69. metadata +9 -6
@@ -1,67 +1,25 @@
1
1
  /*!
2
- * Bootstrap tab.js v5.0.0-beta2 (https://getbootstrap.com/)
2
+ * Bootstrap tab.js v5.0.2 (https://getbootstrap.com/)
3
3
  * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
7
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./base-component.js')) :
8
- typeof define === 'function' && define.amd ? define(['./dom/data', './dom/event-handler', './dom/selector-engine', './base-component'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tab = factory(global.Data, global.EventHandler, global.SelectorEngine, global.Base));
10
- }(this, (function (Data, EventHandler, SelectorEngine, BaseComponent) { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/selector-engine.js'), require('./dom/event-handler.js'), require('./base-component.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./dom/selector-engine', './dom/event-handler', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tab = factory(global.SelectorEngine, global.EventHandler, global.Base));
10
+ }(this, (function (SelectorEngine, EventHandler, BaseComponent) { 'use strict';
11
11
 
12
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
13
 
14
- var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
15
- var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
16
14
  var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
15
+ var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
17
16
  var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
18
17
 
19
- function _defineProperties(target, props) {
20
- for (var i = 0; i < props.length; i++) {
21
- var descriptor = props[i];
22
- descriptor.enumerable = descriptor.enumerable || false;
23
- descriptor.configurable = true;
24
- if ("value" in descriptor) descriptor.writable = true;
25
- Object.defineProperty(target, descriptor.key, descriptor);
26
- }
27
- }
28
-
29
- function _createClass(Constructor, protoProps, staticProps) {
30
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
31
- if (staticProps) _defineProperties(Constructor, staticProps);
32
- return Constructor;
33
- }
34
-
35
- function _inheritsLoose(subClass, superClass) {
36
- subClass.prototype = Object.create(superClass.prototype);
37
- subClass.prototype.constructor = subClass;
38
-
39
- _setPrototypeOf(subClass, superClass);
40
- }
41
-
42
- function _setPrototypeOf(o, p) {
43
- _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
44
- o.__proto__ = p;
45
- return o;
46
- };
47
-
48
- return _setPrototypeOf(o, p);
49
- }
50
-
51
- /**
52
- * --------------------------------------------------------------------------
53
- * Bootstrap (v5.0.0-beta2): util/index.js
54
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
55
- * --------------------------------------------------------------------------
56
- */
57
- var MILLISECONDS_MULTIPLIER = 1000;
58
- var TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
59
-
60
- var getSelector = function getSelector(element) {
61
- var selector = element.getAttribute('data-bs-target');
18
+ const getSelector = element => {
19
+ let selector = element.getAttribute('data-bs-target');
62
20
 
63
21
  if (!selector || selector === '#') {
64
- var hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
22
+ let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
65
23
  // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
66
24
  // `document.querySelector` will rightfully complain it is invalid.
67
25
  // See https://github.com/twbs/bootstrap/issues/32273
@@ -72,7 +30,7 @@
72
30
 
73
31
 
74
32
  if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
75
- hrefAttr = '#' + hrefAttr.split('#')[1];
33
+ hrefAttr = `#${hrefAttr.split('#')[1]}`;
76
34
  }
77
35
 
78
36
  selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
@@ -81,63 +39,33 @@
81
39
  return selector;
82
40
  };
83
41
 
84
- var getElementFromSelector = function getElementFromSelector(element) {
85
- var selector = getSelector(element);
42
+ const getElementFromSelector = element => {
43
+ const selector = getSelector(element);
86
44
  return selector ? document.querySelector(selector) : null;
87
45
  };
88
46
 
89
- var getTransitionDurationFromElement = function getTransitionDurationFromElement(element) {
90
- if (!element) {
91
- return 0;
92
- } // Get transition-duration of the element
93
-
94
-
95
- var _window$getComputedSt = window.getComputedStyle(element),
96
- transitionDuration = _window$getComputedSt.transitionDuration,
97
- transitionDelay = _window$getComputedSt.transitionDelay;
98
-
99
- var floatTransitionDuration = Number.parseFloat(transitionDuration);
100
- var floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
101
-
102
- if (!floatTransitionDuration && !floatTransitionDelay) {
103
- return 0;
104
- } // If multiple durations are defined, take the first
105
-
106
-
107
- transitionDuration = transitionDuration.split(',')[0];
108
- transitionDelay = transitionDelay.split(',')[0];
109
- return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
110
- };
111
-
112
- var triggerTransitionEnd = function triggerTransitionEnd(element) {
113
- element.dispatchEvent(new Event(TRANSITION_END));
114
- };
47
+ const isDisabled = element => {
48
+ if (!element || element.nodeType !== Node.ELEMENT_NODE) {
49
+ return true;
50
+ }
115
51
 
116
- var emulateTransitionEnd = function emulateTransitionEnd(element, duration) {
117
- var called = false;
118
- var durationPadding = 5;
119
- var emulatedDuration = duration + durationPadding;
52
+ if (element.classList.contains('disabled')) {
53
+ return true;
54
+ }
120
55
 
121
- function listener() {
122
- called = true;
123
- element.removeEventListener(TRANSITION_END, listener);
56
+ if (typeof element.disabled !== 'undefined') {
57
+ return element.disabled;
124
58
  }
125
59
 
126
- element.addEventListener(TRANSITION_END, listener);
127
- setTimeout(function () {
128
- if (!called) {
129
- triggerTransitionEnd(element);
130
- }
131
- }, emulatedDuration);
60
+ return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
132
61
  };
133
62
 
134
- var reflow = function reflow(element) {
135
- return element.offsetHeight;
136
- };
63
+ const reflow = element => element.offsetHeight;
137
64
 
138
- var getjQuery = function getjQuery() {
139
- var _window = window,
140
- jQuery = _window.jQuery;
65
+ const getjQuery = () => {
66
+ const {
67
+ jQuery
68
+ } = window;
141
69
 
142
70
  if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
143
71
  return jQuery;
@@ -146,27 +74,35 @@
146
74
  return null;
147
75
  };
148
76
 
149
- var onDOMContentLoaded = function onDOMContentLoaded(callback) {
77
+ const DOMContentLoadedCallbacks = [];
78
+
79
+ const onDOMContentLoaded = callback => {
150
80
  if (document.readyState === 'loading') {
151
- document.addEventListener('DOMContentLoaded', callback);
81
+ // add listener on the first call when the document is in loading state
82
+ if (!DOMContentLoadedCallbacks.length) {
83
+ document.addEventListener('DOMContentLoaded', () => {
84
+ DOMContentLoadedCallbacks.forEach(callback => callback());
85
+ });
86
+ }
87
+
88
+ DOMContentLoadedCallbacks.push(callback);
152
89
  } else {
153
90
  callback();
154
91
  }
155
92
  };
156
93
 
157
- document.documentElement.dir === 'rtl';
158
-
159
- var defineJQueryPlugin = function defineJQueryPlugin(name, plugin) {
160
- onDOMContentLoaded(function () {
161
- var $ = getjQuery();
94
+ const defineJQueryPlugin = plugin => {
95
+ onDOMContentLoaded(() => {
96
+ const $ = getjQuery();
162
97
  /* istanbul ignore if */
163
98
 
164
99
  if ($) {
165
- var JQUERY_NO_CONFLICT = $.fn[name];
100
+ const name = plugin.NAME;
101
+ const JQUERY_NO_CONFLICT = $.fn[name];
166
102
  $.fn[name] = plugin.jQueryInterface;
167
103
  $.fn[name].Constructor = plugin;
168
104
 
169
- $.fn[name].noConflict = function () {
105
+ $.fn[name].noConflict = () => {
170
106
  $.fn[name] = JQUERY_NO_CONFLICT;
171
107
  return plugin.jQueryInterface;
172
108
  };
@@ -174,71 +110,71 @@
174
110
  });
175
111
  };
176
112
 
113
+ /**
114
+ * --------------------------------------------------------------------------
115
+ * Bootstrap (v5.0.2): tab.js
116
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
117
+ * --------------------------------------------------------------------------
118
+ */
177
119
  /**
178
120
  * ------------------------------------------------------------------------
179
121
  * Constants
180
122
  * ------------------------------------------------------------------------
181
123
  */
182
124
 
183
- var NAME = 'tab';
184
- var DATA_KEY = 'bs.tab';
185
- var EVENT_KEY = "." + DATA_KEY;
186
- var DATA_API_KEY = '.data-api';
187
- var EVENT_HIDE = "hide" + EVENT_KEY;
188
- var EVENT_HIDDEN = "hidden" + EVENT_KEY;
189
- var EVENT_SHOW = "show" + EVENT_KEY;
190
- var EVENT_SHOWN = "shown" + EVENT_KEY;
191
- var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
192
- var CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';
193
- var CLASS_NAME_ACTIVE = 'active';
194
- var CLASS_NAME_DISABLED = 'disabled';
195
- var CLASS_NAME_FADE = 'fade';
196
- var CLASS_NAME_SHOW = 'show';
197
- var SELECTOR_DROPDOWN = '.dropdown';
198
- var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
199
- var SELECTOR_ACTIVE = '.active';
200
- var SELECTOR_ACTIVE_UL = ':scope > li > .active';
201
- var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]';
202
- var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
203
- var SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active';
125
+ const NAME = 'tab';
126
+ const DATA_KEY = 'bs.tab';
127
+ const EVENT_KEY = `.${DATA_KEY}`;
128
+ const DATA_API_KEY = '.data-api';
129
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
130
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
131
+ const EVENT_SHOW = `show${EVENT_KEY}`;
132
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
133
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
134
+ const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';
135
+ const CLASS_NAME_ACTIVE = 'active';
136
+ const CLASS_NAME_FADE = 'fade';
137
+ const CLASS_NAME_SHOW = 'show';
138
+ const SELECTOR_DROPDOWN = '.dropdown';
139
+ const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
140
+ const SELECTOR_ACTIVE = '.active';
141
+ const SELECTOR_ACTIVE_UL = ':scope > li > .active';
142
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]';
143
+ const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
144
+ const SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active';
204
145
  /**
205
146
  * ------------------------------------------------------------------------
206
147
  * Class Definition
207
148
  * ------------------------------------------------------------------------
208
149
  */
209
150
 
210
- var Tab = /*#__PURE__*/function (_BaseComponent) {
211
- _inheritsLoose(Tab, _BaseComponent);
212
-
213
- function Tab() {
214
- return _BaseComponent.apply(this, arguments) || this;
215
- }
216
-
217
- var _proto = Tab.prototype;
151
+ class Tab extends BaseComponent__default['default'] {
152
+ // Getters
153
+ static get NAME() {
154
+ return NAME;
155
+ } // Public
218
156
 
219
- // Public
220
- _proto.show = function show() {
221
- var _this = this;
222
157
 
223
- if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(CLASS_NAME_ACTIVE) || this._element.classList.contains(CLASS_NAME_DISABLED)) {
158
+ show() {
159
+ if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(CLASS_NAME_ACTIVE)) {
224
160
  return;
225
161
  }
226
162
 
227
- var previous;
228
- var target = getElementFromSelector(this._element);
163
+ let previous;
164
+ const target = getElementFromSelector(this._element);
229
165
 
230
- var listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP);
166
+ const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP);
231
167
 
232
168
  if (listElement) {
233
- var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;
169
+ const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;
234
170
  previous = SelectorEngine__default['default'].find(itemSelector, listElement);
235
171
  previous = previous[previous.length - 1];
236
172
  }
237
173
 
238
- var hideEvent = previous ? EventHandler__default['default'].trigger(previous, EVENT_HIDE, {
174
+ const hideEvent = previous ? EventHandler__default['default'].trigger(previous, EVENT_HIDE, {
239
175
  relatedTarget: this._element
240
176
  }) : null;
241
- var showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
177
+ const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
242
178
  relatedTarget: previous
243
179
  });
244
180
 
@@ -248,11 +184,11 @@
248
184
 
249
185
  this._activate(this._element, listElement);
250
186
 
251
- var complete = function complete() {
187
+ const complete = () => {
252
188
  EventHandler__default['default'].trigger(previous, EVENT_HIDDEN, {
253
- relatedTarget: _this._element
189
+ relatedTarget: this._element
254
190
  });
255
- EventHandler__default['default'].trigger(_this._element, EVENT_SHOWN, {
191
+ EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
256
192
  relatedTarget: previous
257
193
  });
258
194
  };
@@ -263,33 +199,28 @@
263
199
  complete();
264
200
  }
265
201
  } // Private
266
- ;
267
202
 
268
- _proto._activate = function _activate(element, container, callback) {
269
- var _this2 = this;
270
203
 
271
- var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? SelectorEngine__default['default'].find(SELECTOR_ACTIVE_UL, container) : SelectorEngine__default['default'].children(container, SELECTOR_ACTIVE);
272
- var active = activeElements[0];
273
- var isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE);
204
+ _activate(element, container, callback) {
205
+ const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? SelectorEngine__default['default'].find(SELECTOR_ACTIVE_UL, container) : SelectorEngine__default['default'].children(container, SELECTOR_ACTIVE);
206
+ const active = activeElements[0];
207
+ const isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE);
274
208
 
275
- var complete = function complete() {
276
- return _this2._transitionComplete(element, active, callback);
277
- };
209
+ const complete = () => this._transitionComplete(element, active, callback);
278
210
 
279
211
  if (active && isTransitioning) {
280
- var transitionDuration = getTransitionDurationFromElement(active);
281
212
  active.classList.remove(CLASS_NAME_SHOW);
282
- EventHandler__default['default'].one(active, 'transitionend', complete);
283
- emulateTransitionEnd(active, transitionDuration);
213
+
214
+ this._queueCallback(complete, element, true);
284
215
  } else {
285
216
  complete();
286
217
  }
287
- };
218
+ }
288
219
 
289
- _proto._transitionComplete = function _transitionComplete(element, active, callback) {
220
+ _transitionComplete(element, active, callback) {
290
221
  if (active) {
291
222
  active.classList.remove(CLASS_NAME_ACTIVE);
292
- var dropdownChild = SelectorEngine__default['default'].findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode);
223
+ const dropdownChild = SelectorEngine__default['default'].findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode);
293
224
 
294
225
  if (dropdownChild) {
295
226
  dropdownChild.classList.remove(CLASS_NAME_ACTIVE);
@@ -312,13 +243,17 @@
312
243
  element.classList.add(CLASS_NAME_SHOW);
313
244
  }
314
245
 
315
- if (element.parentNode && element.parentNode.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {
316
- var dropdownElement = element.closest(SELECTOR_DROPDOWN);
246
+ let parent = element.parentNode;
247
+
248
+ if (parent && parent.nodeName === 'LI') {
249
+ parent = parent.parentNode;
250
+ }
251
+
252
+ if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {
253
+ const dropdownElement = element.closest(SELECTOR_DROPDOWN);
317
254
 
318
255
  if (dropdownElement) {
319
- SelectorEngine__default['default'].find(SELECTOR_DROPDOWN_TOGGLE).forEach(function (dropdown) {
320
- return dropdown.classList.add(CLASS_NAME_ACTIVE);
321
- });
256
+ SelectorEngine__default['default'].find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement).forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE));
322
257
  }
323
258
 
324
259
  element.setAttribute('aria-expanded', true);
@@ -328,32 +263,23 @@
328
263
  callback();
329
264
  }
330
265
  } // Static
331
- ;
332
266
 
333
- Tab.jQueryInterface = function jQueryInterface(config) {
267
+
268
+ static jQueryInterface(config) {
334
269
  return this.each(function () {
335
- var data = Data__default['default'].getData(this, DATA_KEY) || new Tab(this);
270
+ const data = Tab.getOrCreateInstance(this);
336
271
 
337
272
  if (typeof config === 'string') {
338
273
  if (typeof data[config] === 'undefined') {
339
- throw new TypeError("No method named \"" + config + "\"");
274
+ throw new TypeError(`No method named "${config}"`);
340
275
  }
341
276
 
342
277
  data[config]();
343
278
  }
344
279
  });
345
- };
346
-
347
- _createClass(Tab, null, [{
348
- key: "DATA_KEY",
349
- get: // Getters
350
- function get() {
351
- return DATA_KEY;
352
- }
353
- }]);
280
+ }
354
281
 
355
- return Tab;
356
- }(BaseComponent__default['default']);
282
+ }
357
283
  /**
358
284
  * ------------------------------------------------------------------------
359
285
  * Data Api implementation
@@ -362,8 +288,15 @@
362
288
 
363
289
 
364
290
  EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
365
- event.preventDefault();
366
- var data = Data__default['default'].getData(this, DATA_KEY) || new Tab(this);
291
+ if (['A', 'AREA'].includes(this.tagName)) {
292
+ event.preventDefault();
293
+ }
294
+
295
+ if (isDisabled(this)) {
296
+ return;
297
+ }
298
+
299
+ const data = Tab.getOrCreateInstance(this);
367
300
  data.show();
368
301
  });
369
302
  /**
@@ -373,7 +306,7 @@
373
306
  * add .Tab to jQuery only if jQuery is present
374
307
  */
375
308
 
376
- defineJQueryPlugin(NAME, Tab);
309
+ defineJQueryPlugin(Tab);
377
310
 
378
311
  return Tab;
379
312