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