bootstrap 4.6.2.1 → 5.3.5
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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +61 -0
- data/CHANGELOG.md +7 -2
- data/Gemfile +1 -0
- data/README.md +33 -15
- data/Rakefile +1 -2
- data/assets/javascripts/bootstrap/alert.js +50 -147
- data/assets/javascripts/bootstrap/base-component.js +83 -0
- data/assets/javascripts/bootstrap/button.js +40 -190
- data/assets/javascripts/bootstrap/carousel.js +282 -537
- data/assets/javascripts/bootstrap/collapse.js +166 -314
- data/assets/javascripts/bootstrap/dom/data.js +62 -0
- data/assets/javascripts/bootstrap/dom/event-handler.js +236 -0
- data/assets/javascripts/bootstrap/dom/manipulator.js +71 -0
- data/assets/javascripts/bootstrap/dom/selector-engine.js +103 -0
- data/assets/javascripts/bootstrap/dropdown.js +297 -455
- data/assets/javascripts/bootstrap/modal.js +223 -566
- data/assets/javascripts/bootstrap/offcanvas.js +245 -0
- data/assets/javascripts/bootstrap/popover.js +59 -208
- data/assets/javascripts/bootstrap/scrollspy.js +213 -276
- data/assets/javascripts/bootstrap/tab.js +222 -200
- data/assets/javascripts/bootstrap/toast.js +137 -206
- data/assets/javascripts/bootstrap/tooltip.js +403 -747
- data/assets/javascripts/bootstrap/util/backdrop.js +138 -0
- data/assets/javascripts/bootstrap/util/component-functions.js +41 -0
- data/assets/javascripts/bootstrap/util/config.js +67 -0
- data/assets/javascripts/bootstrap/util/focustrap.js +112 -0
- data/assets/javascripts/bootstrap/util/index.js +280 -0
- data/assets/javascripts/bootstrap/util/sanitizer.js +113 -0
- data/assets/javascripts/bootstrap/util/scrollbar.js +112 -0
- data/assets/javascripts/bootstrap/util/swipe.js +134 -0
- data/assets/javascripts/bootstrap/util/template-factory.js +150 -0
- data/assets/javascripts/bootstrap-global-this-define.js +6 -0
- data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
- data/assets/javascripts/bootstrap-sprockets.js +21 -5
- data/assets/javascripts/bootstrap.js +3625 -3488
- data/assets/javascripts/bootstrap.min.js +3 -3
- data/assets/stylesheets/_bootstrap-grid.scss +53 -21
- data/assets/stylesheets/_bootstrap-reboot.scss +5 -7
- data/assets/stylesheets/_bootstrap-utilities.scss +19 -0
- data/assets/stylesheets/_bootstrap.scss +21 -13
- data/assets/stylesheets/bootstrap/_accordion.scss +153 -0
- data/assets/stylesheets/bootstrap/_alert.scss +32 -16
- data/assets/stylesheets/bootstrap/_badge.scss +15 -31
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +22 -24
- data/assets/stylesheets/bootstrap/_button-group.scss +32 -48
- data/assets/stylesheets/bootstrap/_buttons.scss +145 -71
- data/assets/stylesheets/bootstrap/_card.scss +67 -115
- data/assets/stylesheets/bootstrap/_carousel.scss +63 -37
- data/assets/stylesheets/bootstrap/_close.scss +53 -27
- data/assets/stylesheets/bootstrap/_containers.scss +41 -0
- data/assets/stylesheets/bootstrap/_dropdown.scss +129 -71
- data/assets/stylesheets/bootstrap/_forms.scss +9 -347
- data/assets/stylesheets/bootstrap/_functions.scss +135 -23
- data/assets/stylesheets/bootstrap/_grid.scss +18 -52
- data/assets/stylesheets/bootstrap/_helpers.scss +12 -0
- data/assets/stylesheets/bootstrap/_list-group.scss +93 -48
- data/assets/stylesheets/bootstrap/_maps.scss +174 -0
- data/assets/stylesheets/bootstrap/_mixins.scss +10 -15
- data/assets/stylesheets/bootstrap/_modal.scss +112 -112
- data/assets/stylesheets/bootstrap/_nav.scss +100 -28
- data/assets/stylesheets/bootstrap/_navbar.scss +130 -173
- data/assets/stylesheets/bootstrap/_offcanvas.scss +147 -0
- data/assets/stylesheets/bootstrap/_pagination.scss +72 -37
- data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
- data/assets/stylesheets/bootstrap/_popover.scss +99 -73
- data/assets/stylesheets/bootstrap/_progress.scss +35 -14
- data/assets/stylesheets/bootstrap/_reboot.scss +319 -192
- data/assets/stylesheets/bootstrap/_root.scss +177 -9
- data/assets/stylesheets/bootstrap/_spinners.scss +43 -23
- data/assets/stylesheets/bootstrap/_tables.scss +101 -115
- data/assets/stylesheets/bootstrap/_toasts.scss +54 -27
- data/assets/stylesheets/bootstrap/_tooltip.scss +67 -63
- data/assets/stylesheets/bootstrap/_transitions.scss +3 -2
- data/assets/stylesheets/bootstrap/_type.scss +40 -59
- data/assets/stylesheets/bootstrap/_utilities.scss +806 -18
- data/assets/stylesheets/bootstrap/_variables-dark.scss +102 -0
- data/assets/stylesheets/bootstrap/_variables.scss +1210 -606
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +97 -0
- data/assets/stylesheets/bootstrap/forms/_form-check.scss +189 -0
- data/assets/stylesheets/bootstrap/forms/_form-control.scss +214 -0
- data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
- data/assets/stylesheets/bootstrap/forms/_form-select.scss +80 -0
- data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
- data/assets/stylesheets/bootstrap/forms/_input-group.scss +132 -0
- data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
- data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
- data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +7 -0
- data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +30 -0
- data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
- data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
- data/assets/stylesheets/bootstrap/helpers/_position.scss +36 -0
- data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
- data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
- data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
- data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
- data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
- data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
- data/assets/stylesheets/bootstrap/mixins/_alert.scss +11 -6
- data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
- data/assets/stylesheets/bootstrap/mixins/_banner.scss +7 -0
- data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +10 -8
- data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
- data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +20 -16
- data/assets/stylesheets/bootstrap/mixins/_buttons.scss +60 -100
- data/assets/stylesheets/bootstrap/mixins/_caret.scss +34 -27
- data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
- data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
- data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
- data/assets/stylesheets/bootstrap/mixins/_container.scss +11 -0
- data/assets/stylesheets/bootstrap/mixins/_forms.scss +64 -96
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +118 -36
- data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -21
- data/assets/stylesheets/bootstrap/mixins/_list-group.scss +7 -2
- data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +7 -19
- data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
- data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +24 -0
- data/assets/stylesheets/bootstrap/mixins/_transition.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_utilities.scss +97 -0
- data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +33 -0
- data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
- data/assets/stylesheets/bootstrap/vendor/_rfs.scss +211 -91
- data/bootstrap.gemspec +6 -6
- data/lib/bootstrap/engine.rb +0 -1
- data/lib/bootstrap/version.rb +2 -2
- data/tasks/updater/js.rb +17 -5
- data/tasks/updater/network.rb +2 -2
- data/tasks/updater/scss.rb +2 -2
- data/tasks/updater.rb +2 -2
- data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
- data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
- data/test/dummy_rails/app/views/pages/root.html +89 -0
- data/test/dummy_rails/config/application.rb +0 -5
- data/test/dummy_rails/public/favicon.ico +0 -0
- data/test/gemfiles/rails_4_2.gemfile +2 -1
- data/test/gemfiles/rails_5_0.gemfile +1 -2
- data/test/gemfiles/rails_5_1.gemfile +1 -2
- data/test/gemfiles/rails_5_2.gemfile +7 -0
- data/test/gemfiles/rails_6_0.gemfile +1 -1
- data/test/gemfiles/rails_6_1.gemfile +7 -0
- data/test/gemfiles/rails_7_0_dartsass.gemfile +0 -1
- data/test/gemfiles/rails_7_0_sassc.gemfile +0 -1
- data/test/rails_test.rb +0 -5
- data/test/test_helper.rb +3 -2
- metadata +92 -86
- data/.travis.yml +0 -31
- data/assets/javascripts/bootstrap/util.js +0 -189
- data/assets/stylesheets/bootstrap/_code.scss +0 -48
- data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -526
- data/assets/stylesheets/bootstrap/_input-group.scss +0 -211
- data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
- data/assets/stylesheets/bootstrap/_media.scss +0 -8
- data/assets/stylesheets/bootstrap/_print.scss +0 -132
- data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -23
- data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
- data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
- data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -80
- data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
- data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -11
- data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -34
- data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
- data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
- data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -17
- data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
- data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
- data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
- data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
- data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
- data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
- data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
- data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
- data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
- data/assets/stylesheets/bootstrap/utilities/_interactions.scss +0 -5
- data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
- data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
- data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
- data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
- data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
- data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
- data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
- data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
- data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
- data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
- /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
@@ -1,261 +1,283 @@
|
|
1
1
|
/*!
|
2
|
-
* Bootstrap tab.js
|
3
|
-
* Copyright 2011-
|
2
|
+
* Bootstrap tab.js v5.3.5 (https://getbootstrap.com/)
|
3
|
+
* Copyright 2011-2025 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('
|
8
|
-
typeof define === 'function' && define.amd ? define(['
|
9
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tab = factory(global.
|
10
|
-
})(this, (function (
|
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
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
-
Object.defineProperty(Constructor, "prototype", {
|
31
|
-
writable: false
|
32
|
-
});
|
33
|
-
return Constructor;
|
34
|
-
}
|
35
19
|
|
36
20
|
/**
|
37
21
|
* Constants
|
38
22
|
*/
|
39
23
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
+
|
63
54
|
/**
|
64
55
|
* Class definition
|
65
56
|
*/
|
66
57
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
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
|
+
}
|
71
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
|
+
}
|
72
72
|
|
73
|
-
|
73
|
+
// Getters
|
74
|
+
static get NAME() {
|
75
|
+
return NAME;
|
76
|
+
}
|
74
77
|
|
75
78
|
// Public
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
if (this.
|
79
|
+
show() {
|
80
|
+
// Shows this elem and deactivate the active sibling if exists
|
81
|
+
const innerElem = this._element;
|
82
|
+
if (this._elemIsActive(innerElem)) {
|
80
83
|
return;
|
81
84
|
}
|
82
85
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
previous = $__default["default"].makeArray($__default["default"](listElement).find(itemSelector));
|
91
|
-
previous = previous[previous.length - 1];
|
92
|
-
}
|
93
|
-
|
94
|
-
var hideEvent = $__default["default"].Event(EVENT_HIDE, {
|
95
|
-
relatedTarget: this._element
|
96
|
-
});
|
97
|
-
var showEvent = $__default["default"].Event(EVENT_SHOW, {
|
98
|
-
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
|
99
93
|
});
|
100
|
-
|
101
|
-
if (previous) {
|
102
|
-
$__default["default"](previous).trigger(hideEvent);
|
103
|
-
}
|
104
|
-
|
105
|
-
$__default["default"](this._element).trigger(showEvent);
|
106
|
-
|
107
|
-
if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
|
94
|
+
if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {
|
108
95
|
return;
|
109
96
|
}
|
97
|
+
this._deactivate(active, innerElem);
|
98
|
+
this._activate(innerElem, active);
|
99
|
+
}
|
110
100
|
|
111
|
-
|
112
|
-
|
101
|
+
// Private
|
102
|
+
_activate(element, relatedElem) {
|
103
|
+
if (!element) {
|
104
|
+
return;
|
113
105
|
}
|
106
|
+
element.classList.add(CLASS_NAME_ACTIVE);
|
107
|
+
this._activate(SelectorEngine.getElementFromSelector(element)); // Search and activate/show the proper section
|
114
108
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
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
|
123
119
|
});
|
124
|
-
$__default["default"](previous).trigger(hiddenEvent);
|
125
|
-
$__default["default"](_this._element).trigger(shownEvent);
|
126
120
|
};
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
121
|
+
this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE));
|
122
|
+
}
|
123
|
+
_deactivate(element, relatedElem) {
|
124
|
+
if (!element) {
|
125
|
+
return;
|
132
126
|
}
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
var complete = function complete() {
|
149
|
-
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
|
+
});
|
150
142
|
};
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
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];
|
155
155
|
} else {
|
156
|
-
|
156
|
+
const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
|
157
|
+
nextActiveElement = index_js.getNextActiveElement(children, event.target, isNext, true);
|
157
158
|
}
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
var dropdownChild = $__default["default"](active.parentNode).find(SELECTOR_DROPDOWN_ACTIVE_CHILD)[0];
|
164
|
-
|
165
|
-
if (dropdownChild) {
|
166
|
-
$__default["default"](dropdownChild).removeClass(CLASS_NAME_ACTIVE);
|
167
|
-
}
|
168
|
-
|
169
|
-
if (active.getAttribute('role') === 'tab') {
|
170
|
-
active.setAttribute('aria-selected', false);
|
171
|
-
}
|
159
|
+
if (nextActiveElement) {
|
160
|
+
nextActiveElement.focus({
|
161
|
+
preventScroll: true
|
162
|
+
});
|
163
|
+
Tab.getOrCreateInstance(nextActiveElement).show();
|
172
164
|
}
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
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);
|
178
177
|
}
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
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');
|
184
186
|
}
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
if (parent && parent.nodeName === 'LI') {
|
189
|
-
parent = parent.parentNode;
|
187
|
+
if (!isActive) {
|
188
|
+
child.setAttribute('tabindex', '-1');
|
190
189
|
}
|
190
|
+
this._setAttributeIfNotExists(child, 'role', 'tab');
|
191
191
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
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);
|
198
214
|
}
|
199
|
-
|
200
|
-
|
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);
|
201
223
|
}
|
224
|
+
}
|
225
|
+
_elemIsActive(elem) {
|
226
|
+
return elem.classList.contains(CLASS_NAME_ACTIVE);
|
227
|
+
}
|
202
228
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
}
|
207
|
-
;
|
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
|
+
}
|
208
233
|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
234
|
+
// Try to get the outer element (usually the .nav-item)
|
235
|
+
_getOuterElement(elem) {
|
236
|
+
return elem.closest(SELECTOR_OUTER) || elem;
|
237
|
+
}
|
213
238
|
|
214
|
-
|
215
|
-
|
216
|
-
|
239
|
+
// Static
|
240
|
+
static jQueryInterface(config) {
|
241
|
+
return this.each(function () {
|
242
|
+
const data = Tab.getOrCreateInstance(this);
|
243
|
+
if (typeof config !== 'string') {
|
244
|
+
return;
|
217
245
|
}
|
218
|
-
|
219
|
-
|
220
|
-
if (typeof data[config] === 'undefined') {
|
221
|
-
throw new TypeError("No method named \"" + config + "\"");
|
222
|
-
}
|
223
|
-
|
224
|
-
data[config]();
|
246
|
+
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
|
247
|
+
throw new TypeError(`No method named "${config}"`);
|
225
248
|
}
|
249
|
+
data[config]();
|
226
250
|
});
|
227
|
-
}
|
228
|
-
|
229
|
-
_createClass(Tab, null, [{
|
230
|
-
key: "VERSION",
|
231
|
-
get: function get() {
|
232
|
-
return VERSION;
|
233
|
-
}
|
234
|
-
}]);
|
251
|
+
}
|
252
|
+
}
|
235
253
|
|
236
|
-
return Tab;
|
237
|
-
}();
|
238
254
|
/**
|
239
255
|
* Data API implementation
|
240
256
|
*/
|
241
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
|
+
});
|
242
267
|
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
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
|
+
}
|
247
275
|
});
|
248
276
|
/**
|
249
277
|
* jQuery
|
250
278
|
*/
|
251
279
|
|
252
|
-
|
253
|
-
$__default["default"].fn[NAME].Constructor = Tab;
|
254
|
-
|
255
|
-
$__default["default"].fn[NAME].noConflict = function () {
|
256
|
-
$__default["default"].fn[NAME] = JQUERY_NO_CONFLICT;
|
257
|
-
return Tab._jQueryInterface;
|
258
|
-
};
|
280
|
+
index_js.defineJQueryPlugin(Tab);
|
259
281
|
|
260
282
|
return Tab;
|
261
283
|
|