bootstrap 4.6.0 → 5.3.2

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