bootstrap 4.5.3 → 5.2.3

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 (171) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +55 -0
  3. data/README.md +28 -5
  4. data/assets/javascripts/bootstrap/alert.js +54 -133
  5. data/assets/javascripts/bootstrap/base-component.js +99 -0
  6. data/assets/javascripts/bootstrap/button.js +44 -183
  7. data/assets/javascripts/bootstrap/carousel.js +308 -450
  8. data/assets/javascripts/bootstrap/collapse.js +180 -243
  9. data/assets/javascripts/bootstrap/dom/data.js +66 -0
  10. data/assets/javascripts/bootstrap/dom/event-handler.js +283 -0
  11. data/assets/javascripts/bootstrap/dom/manipulator.js +84 -0
  12. data/assets/javascripts/bootstrap/dom/selector-engine.js +85 -0
  13. data/assets/javascripts/bootstrap/dropdown.js +320 -387
  14. data/assets/javascripts/bootstrap/modal.js +238 -478
  15. data/assets/javascripts/bootstrap/offcanvas.js +297 -0
  16. data/assets/javascripts/bootstrap/popover.js +58 -163
  17. data/assets/javascripts/bootstrap/scrollspy.js +223 -228
  18. data/assets/javascripts/bootstrap/tab.js +251 -166
  19. data/assets/javascripts/bootstrap/toast.js +147 -149
  20. data/assets/javascripts/bootstrap/tooltip.js +434 -646
  21. data/assets/javascripts/bootstrap/util/backdrop.js +165 -0
  22. data/assets/javascripts/bootstrap/util/component-functions.js +46 -0
  23. data/assets/javascripts/bootstrap/util/config.js +79 -0
  24. data/assets/javascripts/bootstrap/util/focustrap.js +129 -0
  25. data/assets/javascripts/bootstrap/util/index.js +350 -0
  26. data/assets/javascripts/bootstrap/util/sanitizer.js +122 -0
  27. data/assets/javascripts/bootstrap/util/scrollbar.js +138 -0
  28. data/assets/javascripts/bootstrap/util/swipe.js +155 -0
  29. data/assets/javascripts/bootstrap/util/template-factory.js +177 -0
  30. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  31. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  32. data/assets/javascripts/bootstrap-sprockets.js +24 -8
  33. data/assets/javascripts/bootstrap.js +4037 -3206
  34. data/assets/javascripts/bootstrap.min.js +3 -3
  35. data/assets/stylesheets/_bootstrap-grid.scss +56 -21
  36. data/assets/stylesheets/_bootstrap-reboot.scss +4 -7
  37. data/assets/stylesheets/_bootstrap.scss +20 -13
  38. data/assets/stylesheets/bootstrap/_accordion.scss +149 -0
  39. data/assets/stylesheets/bootstrap/_alert.scss +33 -14
  40. data/assets/stylesheets/bootstrap/_badge.scss +15 -31
  41. data/assets/stylesheets/bootstrap/_breadcrumb.scss +23 -27
  42. data/assets/stylesheets/bootstrap/_button-group.scss +25 -46
  43. data/assets/stylesheets/bootstrap/_buttons.scss +136 -71
  44. data/assets/stylesheets/bootstrap/_card.scss +61 -113
  45. data/assets/stylesheets/bootstrap/_carousel.scss +64 -35
  46. data/assets/stylesheets/bootstrap/_close.scss +30 -30
  47. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  48. data/assets/stylesheets/bootstrap/_dropdown.scss +128 -71
  49. data/assets/stylesheets/bootstrap/_forms.scss +9 -347
  50. data/assets/stylesheets/bootstrap/_functions.scss +181 -23
  51. data/assets/stylesheets/bootstrap/_grid.scss +13 -53
  52. data/assets/stylesheets/bootstrap/_helpers.scss +10 -0
  53. data/assets/stylesheets/bootstrap/_images.scss +1 -1
  54. data/assets/stylesheets/bootstrap/_list-group.scss +72 -34
  55. data/assets/stylesheets/bootstrap/_maps.scss +54 -0
  56. data/assets/stylesheets/bootstrap/_mixins.scss +9 -13
  57. data/assets/stylesheets/bootstrap/_modal.scss +107 -110
  58. data/assets/stylesheets/bootstrap/_nav.scss +72 -23
  59. data/assets/stylesheets/bootstrap/_navbar.scss +127 -173
  60. data/assets/stylesheets/bootstrap/_offcanvas.scss +144 -0
  61. data/assets/stylesheets/bootstrap/_pagination.scss +72 -37
  62. data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
  63. data/assets/stylesheets/bootstrap/_popover.scss +99 -73
  64. data/assets/stylesheets/bootstrap/_progress.scss +26 -14
  65. data/assets/stylesheets/bootstrap/_reboot.scss +326 -200
  66. data/assets/stylesheets/bootstrap/_root.scss +62 -9
  67. data/assets/stylesheets/bootstrap/_spinners.scss +51 -22
  68. data/assets/stylesheets/bootstrap/_tables.scss +94 -115
  69. data/assets/stylesheets/bootstrap/_toasts.scss +54 -27
  70. data/assets/stylesheets/bootstrap/_tooltip.scss +68 -63
  71. data/assets/stylesheets/bootstrap/_transitions.scss +8 -1
  72. data/assets/stylesheets/bootstrap/_type.scss +40 -59
  73. data/assets/stylesheets/bootstrap/_utilities.scss +647 -18
  74. data/assets/stylesheets/bootstrap/_variables.scss +1018 -526
  75. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
  76. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +75 -0
  77. data/assets/stylesheets/bootstrap/forms/_form-check.scss +175 -0
  78. data/assets/stylesheets/bootstrap/forms/_form-control.scss +194 -0
  79. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  80. data/assets/stylesheets/bootstrap/forms/_form-select.scss +71 -0
  81. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  82. data/assets/stylesheets/bootstrap/forms/_input-group.scss +132 -0
  83. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  84. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  85. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +10 -0
  86. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
  87. data/assets/stylesheets/bootstrap/helpers/_position.scss +36 -0
  88. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  89. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  90. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  91. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  92. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  93. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  94. data/assets/stylesheets/bootstrap/mixins/_alert.scss +8 -6
  95. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  96. data/assets/stylesheets/bootstrap/mixins/_banner.scss +9 -0
  97. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +10 -8
  98. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
  99. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +20 -16
  100. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +60 -100
  101. data/assets/stylesheets/bootstrap/mixins/_caret.scss +10 -8
  102. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  103. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  104. data/assets/stylesheets/bootstrap/mixins/_container.scss +11 -0
  105. data/assets/stylesheets/bootstrap/mixins/_forms.scss +48 -74
  106. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  107. data/assets/stylesheets/bootstrap/mixins/_grid.scss +119 -37
  108. data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -21
  109. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
  110. data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
  111. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +7 -19
  112. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +3 -3
  113. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +24 -0
  114. data/assets/stylesheets/bootstrap/mixins/_transition.scss +1 -1
  115. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +97 -0
  116. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
  117. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  118. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +278 -128
  119. data/bootstrap.gemspec +3 -5
  120. data/lib/bootstrap/version.rb +2 -2
  121. data/tasks/updater/js.rb +31 -7
  122. data/tasks/updater/network.rb +9 -3
  123. data/tasks/updater.rb +2 -2
  124. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  125. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  126. data/test/dummy_rails/app/views/pages/root.html +89 -0
  127. data/test/dummy_rails/config/application.rb +0 -3
  128. data/test/gemfiles/rails_5_2.gemfile +8 -0
  129. data/test/gemfiles/rails_6_1.gemfile +7 -0
  130. data/test/gemfiles/rails_7_0.gemfile +7 -0
  131. data/test/test_helper.rb +3 -2
  132. metadata +70 -78
  133. data/.travis.yml +0 -31
  134. data/assets/javascripts/bootstrap/util.js +0 -192
  135. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  136. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -524
  137. data/assets/stylesheets/bootstrap/_input-group.scss +0 -192
  138. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  139. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  140. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  141. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -23
  142. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  143. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  144. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -80
  145. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  146. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -11
  147. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -34
  148. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  149. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  150. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -17
  151. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  152. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  153. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  154. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  155. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  156. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  157. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  158. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  159. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  160. data/assets/stylesheets/bootstrap/utilities/_interactions.scss +0 -5
  161. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  162. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  163. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  164. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  165. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  166. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  167. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  168. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  169. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  170. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
  171. /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
@@ -1,248 +1,333 @@
1
1
  /*!
2
- * Bootstrap tab.js v4.5.3 (https://getbootstrap.com/)
3
- * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap tab.js v5.2.3 (https://getbootstrap.com/)
3
+ * Copyright 2011-2022 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('jquery'), require('./util.js')) :
8
- typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tab = factory(global.jQuery, global.Util));
10
- }(this, (function ($, Util) { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./util/index'), require('./dom/event-handler'), require('./dom/selector-engine'), require('./base-component')) :
8
+ typeof define === 'function' && define.amd ? define(['./util/index', './dom/event-handler', './dom/selector-engine', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tab = factory(global.Index, global.EventHandler, global.SelectorEngine, global.BaseComponent));
10
+ })(this, (function (index, EventHandler, SelectorEngine, BaseComponent) { 'use strict';
11
11
 
12
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
+ const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
13
13
 
14
- var $__default = /*#__PURE__*/_interopDefaultLegacy($);
15
- var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);
14
+ const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
15
+ const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
16
+ const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
16
17
 
17
- 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); } }
18
-
19
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
20
18
  /**
21
- * ------------------------------------------------------------------------
19
+ * --------------------------------------------------------------------------
20
+ * Bootstrap (v5.2.3): tab.js
21
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
22
+ * --------------------------------------------------------------------------
23
+ */
24
+ /**
22
25
  * Constants
23
- * ------------------------------------------------------------------------
24
26
  */
25
27
 
26
- var NAME = 'tab';
27
- var VERSION = '4.5.3';
28
- var DATA_KEY = 'bs.tab';
29
- var EVENT_KEY = "." + DATA_KEY;
30
- var DATA_API_KEY = '.data-api';
31
- var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
32
- var EVENT_HIDE = "hide" + EVENT_KEY;
33
- var EVENT_HIDDEN = "hidden" + EVENT_KEY;
34
- var EVENT_SHOW = "show" + EVENT_KEY;
35
- var EVENT_SHOWN = "shown" + EVENT_KEY;
36
- var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
37
- var CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';
38
- var CLASS_NAME_ACTIVE = 'active';
39
- var CLASS_NAME_DISABLED = 'disabled';
40
- var CLASS_NAME_FADE = 'fade';
41
- var CLASS_NAME_SHOW = 'show';
42
- var SELECTOR_DROPDOWN = '.dropdown';
43
- var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
44
- var SELECTOR_ACTIVE = '.active';
45
- var SELECTOR_ACTIVE_UL = '> li > .active';
46
- var SELECTOR_DATA_TOGGLE = '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]';
47
- var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
48
- var SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active';
28
+ const NAME = 'tab';
29
+ const DATA_KEY = 'bs.tab';
30
+ const EVENT_KEY = `.${DATA_KEY}`;
31
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
32
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
33
+ const EVENT_SHOW = `show${EVENT_KEY}`;
34
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
35
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}`;
36
+ const EVENT_KEYDOWN = `keydown${EVENT_KEY}`;
37
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY}`;
38
+ const ARROW_LEFT_KEY = 'ArrowLeft';
39
+ const ARROW_RIGHT_KEY = 'ArrowRight';
40
+ const ARROW_UP_KEY = 'ArrowUp';
41
+ const ARROW_DOWN_KEY = 'ArrowDown';
42
+ const CLASS_NAME_ACTIVE = 'active';
43
+ const CLASS_NAME_FADE = 'fade';
44
+ const CLASS_NAME_SHOW = 'show';
45
+ const CLASS_DROPDOWN = 'dropdown';
46
+ const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
47
+ const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';
48
+ const NOT_SELECTOR_DROPDOWN_TOGGLE = ':not(.dropdown-toggle)';
49
+ const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
50
+ const SELECTOR_OUTER = '.nav-item, .list-group-item';
51
+ const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
52
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; // todo:v6: could be only `tab`
53
+
54
+ const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
55
+ const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;
49
56
  /**
50
- * ------------------------------------------------------------------------
51
- * Class Definition
52
- * ------------------------------------------------------------------------
57
+ * Class definition
53
58
  */
54
59
 
55
- var Tab = /*#__PURE__*/function () {
56
- function Tab(element) {
57
- this._element = element;
60
+ class Tab extends BaseComponent__default.default {
61
+ constructor(element) {
62
+ super(element);
63
+ this._parent = this._element.closest(SELECTOR_TAB_PANEL);
64
+
65
+ if (!this._parent) {
66
+ return; // todo: should Throw exception on v6
67
+ // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)
68
+ } // Set up initial aria attributes
69
+
70
+
71
+ this._setInitialAttributes(this._parent, this._getChildren());
72
+
73
+ EventHandler__default.default.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));
58
74
  } // Getters
59
75
 
60
76
 
61
- var _proto = Tab.prototype;
77
+ static get NAME() {
78
+ return NAME;
79
+ } // Public
80
+
62
81
 
63
- // Public
64
- _proto.show = function show() {
65
- var _this = this;
82
+ show() {
83
+ // Shows this elem and deactivate the active sibling if exists
84
+ const innerElem = this._element;
66
85
 
67
- if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $__default['default'](this._element).hasClass(CLASS_NAME_ACTIVE) || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED)) {
86
+ if (this._elemIsActive(innerElem)) {
68
87
  return;
69
- }
88
+ } // Search for active tab on same parent to deactivate it
70
89
 
71
- var target;
72
- var previous;
73
- var listElement = $__default['default'](this._element).closest(SELECTOR_NAV_LIST_GROUP)[0];
74
- var selector = Util__default['default'].getSelectorFromElement(this._element);
75
90
 
76
- if (listElement) {
77
- var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;
78
- previous = $__default['default'].makeArray($__default['default'](listElement).find(itemSelector));
79
- previous = previous[previous.length - 1];
80
- }
91
+ const active = this._getActiveElem();
81
92
 
82
- var hideEvent = $__default['default'].Event(EVENT_HIDE, {
83
- relatedTarget: this._element
84
- });
85
- var showEvent = $__default['default'].Event(EVENT_SHOW, {
86
- relatedTarget: previous
93
+ const hideEvent = active ? EventHandler__default.default.trigger(active, EVENT_HIDE, {
94
+ relatedTarget: innerElem
95
+ }) : null;
96
+ const showEvent = EventHandler__default.default.trigger(innerElem, EVENT_SHOW, {
97
+ relatedTarget: active
87
98
  });
88
99
 
89
- if (previous) {
90
- $__default['default'](previous).trigger(hideEvent);
100
+ if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {
101
+ return;
91
102
  }
92
103
 
93
- $__default['default'](this._element).trigger(showEvent);
104
+ this._deactivate(active, innerElem);
105
+
106
+ this._activate(innerElem, active);
107
+ } // Private
108
+
94
109
 
95
- if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
110
+ _activate(element, relatedElem) {
111
+ if (!element) {
96
112
  return;
97
113
  }
98
114
 
99
- if (selector) {
100
- target = document.querySelector(selector);
101
- }
115
+ element.classList.add(CLASS_NAME_ACTIVE);
102
116
 
103
- this._activate(this._element, listElement);
117
+ this._activate(index.getElementFromSelector(element)); // Search and activate/show the proper section
104
118
 
105
- var complete = function complete() {
106
- var hiddenEvent = $__default['default'].Event(EVENT_HIDDEN, {
107
- relatedTarget: _this._element
108
- });
109
- var shownEvent = $__default['default'].Event(EVENT_SHOWN, {
110
- relatedTarget: previous
119
+
120
+ const complete = () => {
121
+ if (element.getAttribute('role') !== 'tab') {
122
+ element.classList.add(CLASS_NAME_SHOW);
123
+ return;
124
+ }
125
+
126
+ element.removeAttribute('tabindex');
127
+ element.setAttribute('aria-selected', true);
128
+
129
+ this._toggleDropDown(element, true);
130
+
131
+ EventHandler__default.default.trigger(element, EVENT_SHOWN, {
132
+ relatedTarget: relatedElem
111
133
  });
112
- $__default['default'](previous).trigger(hiddenEvent);
113
- $__default['default'](_this._element).trigger(shownEvent);
114
134
  };
115
135
 
116
- if (target) {
117
- this._activate(target, target.parentNode, complete);
118
- } else {
119
- complete();
136
+ this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE));
137
+ }
138
+
139
+ _deactivate(element, relatedElem) {
140
+ if (!element) {
141
+ return;
120
142
  }
121
- };
122
143
 
123
- _proto.dispose = function dispose() {
124
- $__default['default'].removeData(this._element, DATA_KEY);
125
- this._element = null;
126
- } // Private
127
- ;
144
+ element.classList.remove(CLASS_NAME_ACTIVE);
145
+ element.blur();
146
+
147
+ this._deactivate(index.getElementFromSelector(element)); // Search and deactivate the shown section too
128
148
 
129
- _proto._activate = function _activate(element, container, callback) {
130
- var _this2 = this;
131
149
 
132
- var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $__default['default'](container).find(SELECTOR_ACTIVE_UL) : $__default['default'](container).children(SELECTOR_ACTIVE);
133
- var active = activeElements[0];
134
- var isTransitioning = callback && active && $__default['default'](active).hasClass(CLASS_NAME_FADE);
150
+ const complete = () => {
151
+ if (element.getAttribute('role') !== 'tab') {
152
+ element.classList.remove(CLASS_NAME_SHOW);
153
+ return;
154
+ }
155
+
156
+ element.setAttribute('aria-selected', false);
157
+ element.setAttribute('tabindex', '-1');
135
158
 
136
- var complete = function complete() {
137
- return _this2._transitionComplete(element, active, callback);
159
+ this._toggleDropDown(element, false);
160
+
161
+ EventHandler__default.default.trigger(element, EVENT_HIDDEN, {
162
+ relatedTarget: relatedElem
163
+ });
138
164
  };
139
165
 
140
- if (active && isTransitioning) {
141
- var transitionDuration = Util__default['default'].getTransitionDurationFromElement(active);
142
- $__default['default'](active).removeClass(CLASS_NAME_SHOW).one(Util__default['default'].TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
143
- } else {
144
- complete();
166
+ this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE));
167
+ }
168
+
169
+ _keydown(event) {
170
+ if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)) {
171
+ return;
145
172
  }
146
- };
147
173
 
148
- _proto._transitionComplete = function _transitionComplete(element, active, callback) {
149
- if (active) {
150
- $__default['default'](active).removeClass(CLASS_NAME_ACTIVE);
151
- var dropdownChild = $__default['default'](active.parentNode).find(SELECTOR_DROPDOWN_ACTIVE_CHILD)[0];
174
+ event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page
152
175
 
153
- if (dropdownChild) {
154
- $__default['default'](dropdownChild).removeClass(CLASS_NAME_ACTIVE);
155
- }
176
+ event.preventDefault();
177
+ const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
178
+ const nextActiveElement = index.getNextActiveElement(this._getChildren().filter(element => !index.isDisabled(element)), event.target, isNext, true);
156
179
 
157
- if (active.getAttribute('role') === 'tab') {
158
- active.setAttribute('aria-selected', false);
159
- }
180
+ if (nextActiveElement) {
181
+ nextActiveElement.focus({
182
+ preventScroll: true
183
+ });
184
+ Tab.getOrCreateInstance(nextActiveElement).show();
160
185
  }
186
+ }
161
187
 
162
- $__default['default'](element).addClass(CLASS_NAME_ACTIVE);
188
+ _getChildren() {
189
+ // collection of inner elements
190
+ return SelectorEngine__default.default.find(SELECTOR_INNER_ELEM, this._parent);
191
+ }
163
192
 
164
- if (element.getAttribute('role') === 'tab') {
165
- element.setAttribute('aria-selected', true);
193
+ _getActiveElem() {
194
+ return this._getChildren().find(child => this._elemIsActive(child)) || null;
195
+ }
196
+
197
+ _setInitialAttributes(parent, children) {
198
+ this._setAttributeIfNotExists(parent, 'role', 'tablist');
199
+
200
+ for (const child of children) {
201
+ this._setInitialAttributesOnChild(child);
166
202
  }
203
+ }
204
+
205
+ _setInitialAttributesOnChild(child) {
206
+ child = this._getInnerElement(child);
207
+
208
+ const isActive = this._elemIsActive(child);
209
+
210
+ const outerElem = this._getOuterElement(child);
211
+
212
+ child.setAttribute('aria-selected', isActive);
167
213
 
168
- Util__default['default'].reflow(element);
214
+ if (outerElem !== child) {
215
+ this._setAttributeIfNotExists(outerElem, 'role', 'presentation');
216
+ }
169
217
 
170
- if (element.classList.contains(CLASS_NAME_FADE)) {
171
- element.classList.add(CLASS_NAME_SHOW);
218
+ if (!isActive) {
219
+ child.setAttribute('tabindex', '-1');
172
220
  }
173
221
 
174
- if (element.parentNode && $__default['default'](element.parentNode).hasClass(CLASS_NAME_DROPDOWN_MENU)) {
175
- var dropdownElement = $__default['default'](element).closest(SELECTOR_DROPDOWN)[0];
222
+ this._setAttributeIfNotExists(child, 'role', 'tab'); // set attributes to the related panel too
176
223
 
177
- if (dropdownElement) {
178
- var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(SELECTOR_DROPDOWN_TOGGLE));
179
- $__default['default'](dropdownToggleList).addClass(CLASS_NAME_ACTIVE);
180
- }
181
224
 
182
- element.setAttribute('aria-expanded', true);
225
+ this._setInitialAttributesOnTargetPanel(child);
226
+ }
227
+
228
+ _setInitialAttributesOnTargetPanel(child) {
229
+ const target = index.getElementFromSelector(child);
230
+
231
+ if (!target) {
232
+ return;
183
233
  }
184
234
 
185
- if (callback) {
186
- callback();
235
+ this._setAttributeIfNotExists(target, 'role', 'tabpanel');
236
+
237
+ if (child.id) {
238
+ this._setAttributeIfNotExists(target, 'aria-labelledby', `#${child.id}`);
239
+ }
240
+ }
241
+
242
+ _toggleDropDown(element, open) {
243
+ const outerElem = this._getOuterElement(element);
244
+
245
+ if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
246
+ return;
247
+ }
248
+
249
+ const toggle = (selector, className) => {
250
+ const element = SelectorEngine__default.default.findOne(selector, outerElem);
251
+
252
+ if (element) {
253
+ element.classList.toggle(className, open);
254
+ }
255
+ };
256
+
257
+ toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);
258
+ toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW);
259
+ outerElem.setAttribute('aria-expanded', open);
260
+ }
261
+
262
+ _setAttributeIfNotExists(element, attribute, value) {
263
+ if (!element.hasAttribute(attribute)) {
264
+ element.setAttribute(attribute, value);
187
265
  }
266
+ }
267
+
268
+ _elemIsActive(elem) {
269
+ return elem.classList.contains(CLASS_NAME_ACTIVE);
270
+ } // Try to get the inner element (usually the .nav-link)
271
+
272
+
273
+ _getInnerElement(elem) {
274
+ return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine__default.default.findOne(SELECTOR_INNER_ELEM, elem);
275
+ } // Try to get the outer element (usually the .nav-item)
276
+
277
+
278
+ _getOuterElement(elem) {
279
+ return elem.closest(SELECTOR_OUTER) || elem;
188
280
  } // Static
189
- ;
190
281
 
191
- Tab._jQueryInterface = function _jQueryInterface(config) {
282
+
283
+ static jQueryInterface(config) {
192
284
  return this.each(function () {
193
- var $this = $__default['default'](this);
194
- var data = $this.data(DATA_KEY);
285
+ const data = Tab.getOrCreateInstance(this);
195
286
 
196
- if (!data) {
197
- data = new Tab(this);
198
- $this.data(DATA_KEY, data);
287
+ if (typeof config !== 'string') {
288
+ return;
199
289
  }
200
290
 
201
- if (typeof config === 'string') {
202
- if (typeof data[config] === 'undefined') {
203
- throw new TypeError("No method named \"" + config + "\"");
204
- }
205
-
206
- data[config]();
291
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
292
+ throw new TypeError(`No method named "${config}"`);
207
293
  }
208
- });
209
- };
210
294
 
211
- _createClass(Tab, null, [{
212
- key: "VERSION",
213
- get: function get() {
214
- return VERSION;
215
- }
216
- }]);
295
+ data[config]();
296
+ });
297
+ }
217
298
 
218
- return Tab;
219
- }();
299
+ }
220
300
  /**
221
- * ------------------------------------------------------------------------
222
- * Data Api implementation
223
- * ------------------------------------------------------------------------
301
+ * Data API implementation
224
302
  */
225
303
 
226
304
 
227
- $__default['default'](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
228
- event.preventDefault();
305
+ EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
306
+ if (['A', 'AREA'].includes(this.tagName)) {
307
+ event.preventDefault();
308
+ }
229
309
 
230
- Tab._jQueryInterface.call($__default['default'](this), 'show');
310
+ if (index.isDisabled(this)) {
311
+ return;
312
+ }
313
+
314
+ Tab.getOrCreateInstance(this).show();
231
315
  });
232
316
  /**
233
- * ------------------------------------------------------------------------
234
- * jQuery
235
- * ------------------------------------------------------------------------
317
+ * Initialize on focus
236
318
  */
237
319
 
238
- $__default['default'].fn[NAME] = Tab._jQueryInterface;
239
- $__default['default'].fn[NAME].Constructor = Tab;
320
+ EventHandler__default.default.on(window, EVENT_LOAD_DATA_API, () => {
321
+ for (const element of SelectorEngine__default.default.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
322
+ Tab.getOrCreateInstance(element);
323
+ }
324
+ });
325
+ /**
326
+ * jQuery
327
+ */
240
328
 
241
- $__default['default'].fn[NAME].noConflict = function () {
242
- $__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
243
- return Tab._jQueryInterface;
244
- };
329
+ index.defineJQueryPlugin(Tab);
245
330
 
246
331
  return Tab;
247
332
 
248
- })));
333
+ }));