bootstrap 5.0.0.alpha2 → 5.0.0

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