bootstrap 4.5.3 → 5.2.3

Sign up to get free protection for your applications and to get access to all the features.
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
+ }));