bootstrap 4.3.1 → 5.3.0

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 (179) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +55 -0
  3. data/CHANGELOG.md +2 -14
  4. data/README.md +28 -5
  5. data/assets/javascripts/bootstrap/alert.js +54 -163
  6. data/assets/javascripts/bootstrap/base-component.js +83 -0
  7. data/assets/javascripts/bootstrap/button.js +44 -152
  8. data/assets/javascripts/bootstrap/carousel.js +289 -569
  9. data/assets/javascripts/bootstrap/collapse.js +170 -349
  10. data/assets/javascripts/bootstrap/dom/data.js +62 -0
  11. data/assets/javascripts/bootstrap/dom/event-handler.js +236 -0
  12. data/assets/javascripts/bootstrap/dom/manipulator.js +71 -0
  13. data/assets/javascripts/bootstrap/dom/selector-engine.js +103 -0
  14. data/assets/javascripts/bootstrap/dropdown.js +303 -496
  15. data/assets/javascripts/bootstrap/modal.js +229 -559
  16. data/assets/javascripts/bootstrap/offcanvas.js +245 -0
  17. data/assets/javascripts/bootstrap/popover.js +61 -226
  18. data/assets/javascripts/bootstrap/scrollspy.js +217 -317
  19. data/assets/javascripts/bootstrap/tab.js +220 -212
  20. data/assets/javascripts/bootstrap/toast.js +145 -229
  21. data/assets/javascripts/bootstrap/tooltip.js +421 -782
  22. data/assets/javascripts/bootstrap/util/backdrop.js +139 -0
  23. data/assets/javascripts/bootstrap/util/component-functions.js +41 -0
  24. data/assets/javascripts/bootstrap/util/config.js +67 -0
  25. data/assets/javascripts/bootstrap/util/focustrap.js +113 -0
  26. data/assets/javascripts/bootstrap/util/index.js +281 -0
  27. data/assets/javascripts/bootstrap/util/sanitizer.js +110 -0
  28. data/assets/javascripts/bootstrap/util/scrollbar.js +112 -0
  29. data/assets/javascripts/bootstrap/util/swipe.js +134 -0
  30. data/assets/javascripts/bootstrap/util/template-factory.js +150 -0
  31. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  32. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  33. data/assets/javascripts/bootstrap-sprockets.js +23 -7
  34. data/assets/javascripts/bootstrap.js +3690 -3639
  35. data/assets/javascripts/bootstrap.min.js +4 -4
  36. data/assets/stylesheets/_bootstrap-grid.scss +53 -20
  37. data/assets/stylesheets/_bootstrap-reboot.scss +5 -7
  38. data/assets/stylesheets/_bootstrap.scss +21 -13
  39. data/assets/stylesheets/bootstrap/_accordion.scss +158 -0
  40. data/assets/stylesheets/bootstrap/_alert.scss +32 -15
  41. data/assets/stylesheets/bootstrap/_badge.scss +15 -31
  42. data/assets/stylesheets/bootstrap/_breadcrumb.scss +23 -24
  43. data/assets/stylesheets/bootstrap/_button-group.scss +27 -48
  44. data/assets/stylesheets/bootstrap/_buttons.scss +139 -69
  45. data/assets/stylesheets/bootstrap/_card.scss +91 -141
  46. data/assets/stylesheets/bootstrap/_carousel.scss +86 -39
  47. data/assets/stylesheets/bootstrap/_close.scss +51 -29
  48. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  49. data/assets/stylesheets/bootstrap/_dropdown.scss +131 -72
  50. data/assets/stylesheets/bootstrap/_forms.scss +9 -330
  51. data/assets/stylesheets/bootstrap/_functions.scss +244 -28
  52. data/assets/stylesheets/bootstrap/_grid.scss +18 -31
  53. data/assets/stylesheets/bootstrap/_helpers.scss +12 -0
  54. data/assets/stylesheets/bootstrap/_images.scss +3 -3
  55. data/assets/stylesheets/bootstrap/_list-group.scss +101 -53
  56. data/assets/stylesheets/bootstrap/_maps.scss +174 -0
  57. data/assets/stylesheets/bootstrap/_mixins.scss +13 -18
  58. data/assets/stylesheets/bootstrap/_modal.scss +120 -112
  59. data/assets/stylesheets/bootstrap/_nav.scss +113 -24
  60. data/assets/stylesheets/bootstrap/_navbar.scss +145 -150
  61. data/assets/stylesheets/bootstrap/_offcanvas.scss +146 -0
  62. data/assets/stylesheets/bootstrap/_pagination.scss +74 -38
  63. data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
  64. data/assets/stylesheets/bootstrap/_popover.scss +99 -74
  65. data/assets/stylesheets/bootstrap/_progress.scss +40 -15
  66. data/assets/stylesheets/bootstrap/_reboot.scss +342 -215
  67. data/assets/stylesheets/bootstrap/_root.scss +174 -9
  68. data/assets/stylesheets/bootstrap/_spinners.scss +52 -22
  69. data/assets/stylesheets/bootstrap/_tables.scss +101 -115
  70. data/assets/stylesheets/bootstrap/_toasts.scss +54 -25
  71. data/assets/stylesheets/bootstrap/_tooltip.scss +67 -63
  72. data/assets/stylesheets/bootstrap/_transitions.scss +8 -1
  73. data/assets/stylesheets/bootstrap/_type.scss +42 -61
  74. data/assets/stylesheets/bootstrap/_utilities.scss +806 -17
  75. data/assets/stylesheets/bootstrap/_variables-dark.scss +85 -0
  76. data/assets/stylesheets/bootstrap/_variables.scss +1235 -615
  77. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +19 -0
  78. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +94 -0
  79. data/assets/stylesheets/bootstrap/forms/_form-check.scss +188 -0
  80. data/assets/stylesheets/bootstrap/forms/_form-control.scss +214 -0
  81. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  82. data/assets/stylesheets/bootstrap/forms/_form-select.scss +80 -0
  83. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  84. data/assets/stylesheets/bootstrap/forms/_input-group.scss +132 -0
  85. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  86. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  87. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +8 -0
  88. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +30 -0
  89. data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
  90. data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
  91. data/assets/stylesheets/bootstrap/helpers/_position.scss +36 -0
  92. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  93. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  94. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  95. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  96. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  97. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  98. data/assets/stylesheets/bootstrap/mixins/_alert.scss +11 -6
  99. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  100. data/assets/stylesheets/bootstrap/mixins/_banner.scss +7 -0
  101. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +37 -22
  102. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
  103. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +20 -16
  104. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +60 -97
  105. data/assets/stylesheets/bootstrap/mixins/_caret.scss +34 -27
  106. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  107. data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
  108. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  109. data/assets/stylesheets/bootstrap/mixins/_container.scss +11 -0
  110. data/assets/stylesheets/bootstrap/mixins/_forms.scss +77 -116
  111. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  112. data/assets/stylesheets/bootstrap/mixins/_grid.scss +133 -33
  113. data/assets/stylesheets/bootstrap/mixins/_image.scss +0 -20
  114. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +7 -2
  115. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +7 -19
  116. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  117. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +24 -0
  118. data/assets/stylesheets/bootstrap/mixins/_transition.scss +18 -8
  119. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +97 -0
  120. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +33 -0
  121. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  122. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +276 -132
  123. data/bootstrap.gemspec +4 -6
  124. data/lib/bootstrap/version.rb +2 -2
  125. data/tasks/updater/js.rb +31 -7
  126. data/tasks/updater/network.rb +10 -4
  127. data/tasks/updater/scss.rb +1 -1
  128. data/tasks/updater.rb +2 -2
  129. data/test/dummy_rails/app/assets/config/manifest.js +3 -0
  130. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  131. data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
  132. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  133. data/test/dummy_rails/app/views/pages/root.html +89 -0
  134. data/test/dummy_rails/config/application.rb +0 -3
  135. data/test/gemfiles/rails_5_2.gemfile +8 -0
  136. data/test/gemfiles/rails_6_0.gemfile +7 -0
  137. data/test/gemfiles/rails_6_1.gemfile +7 -0
  138. data/test/gemfiles/rails_7_0.gemfile +7 -0
  139. data/test/support/dummy_rails_integration.rb +3 -1
  140. data/test/test_helper.rb +18 -12
  141. metadata +86 -84
  142. data/.travis.yml +0 -17
  143. data/assets/javascripts/bootstrap/util.js +0 -171
  144. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  145. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -507
  146. data/assets/stylesheets/bootstrap/_input-group.scss +0 -193
  147. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  148. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  149. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  150. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
  151. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  152. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  153. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -66
  154. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  155. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
  156. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -33
  157. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  158. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  159. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -16
  160. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  161. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  162. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  163. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  164. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  165. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  166. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  167. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  168. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  169. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  170. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  171. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  172. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  173. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  174. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  175. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  176. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  177. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  178. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
  179. /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
@@ -1,426 +1,247 @@
1
1
  /*!
2
- * Bootstrap collapse.js v4.3.1 (https://getbootstrap.com/)
3
- * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2
+ * Bootstrap collapse.js v5.3.0 (https://getbootstrap.com/)
3
+ * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
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 = global || self, global.Collapse = 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.Collapse = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Index));
10
+ })(this, (function (BaseComponent, EventHandler, SelectorEngine, index_js) { 'use strict';
11
11
 
12
- $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
13
- Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
14
-
15
- function _defineProperties(target, props) {
16
- for (var i = 0; i < props.length; i++) {
17
- var descriptor = props[i];
18
- descriptor.enumerable = descriptor.enumerable || false;
19
- descriptor.configurable = true;
20
- if ("value" in descriptor) descriptor.writable = true;
21
- Object.defineProperty(target, descriptor.key, descriptor);
22
- }
23
- }
24
-
25
- function _createClass(Constructor, protoProps, staticProps) {
26
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
27
- if (staticProps) _defineProperties(Constructor, staticProps);
28
- return Constructor;
29
- }
30
-
31
- function _defineProperty(obj, key, value) {
32
- if (key in obj) {
33
- Object.defineProperty(obj, key, {
34
- value: value,
35
- enumerable: true,
36
- configurable: true,
37
- writable: true
38
- });
39
- } else {
40
- obj[key] = value;
41
- }
42
-
43
- return obj;
44
- }
45
-
46
- function _objectSpread(target) {
47
- for (var i = 1; i < arguments.length; i++) {
48
- var source = arguments[i] != null ? arguments[i] : {};
49
- var ownKeys = Object.keys(source);
50
-
51
- if (typeof Object.getOwnPropertySymbols === 'function') {
52
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
53
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
54
- }));
55
- }
56
-
57
- ownKeys.forEach(function (key) {
58
- _defineProperty(target, key, source[key]);
59
- });
60
- }
12
+ /**
13
+ * --------------------------------------------------------------------------
14
+ * Bootstrap collapse.js
15
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
+ * --------------------------------------------------------------------------
17
+ */
61
18
 
62
- return target;
63
- }
64
19
 
65
20
  /**
66
- * ------------------------------------------------------------------------
67
21
  * Constants
68
- * ------------------------------------------------------------------------
69
22
  */
70
23
 
71
- var NAME = 'collapse';
72
- var VERSION = '4.3.1';
73
- var DATA_KEY = 'bs.collapse';
74
- var EVENT_KEY = "." + DATA_KEY;
75
- var DATA_API_KEY = '.data-api';
76
- var JQUERY_NO_CONFLICT = $.fn[NAME];
77
- var Default = {
78
- toggle: true,
79
- parent: ''
24
+ const NAME = 'collapse';
25
+ const DATA_KEY = 'bs.collapse';
26
+ const EVENT_KEY = `.${DATA_KEY}`;
27
+ const DATA_API_KEY = '.data-api';
28
+ const EVENT_SHOW = `show${EVENT_KEY}`;
29
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
30
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
31
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
32
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
33
+ const CLASS_NAME_SHOW = 'show';
34
+ const CLASS_NAME_COLLAPSE = 'collapse';
35
+ const CLASS_NAME_COLLAPSING = 'collapsing';
36
+ const CLASS_NAME_COLLAPSED = 'collapsed';
37
+ const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
38
+ const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
39
+ const WIDTH = 'width';
40
+ const HEIGHT = 'height';
41
+ const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
42
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]';
43
+ const Default = {
44
+ parent: null,
45
+ toggle: true
80
46
  };
81
- var DefaultType = {
82
- toggle: 'boolean',
83
- parent: '(string|element)'
47
+ const DefaultType = {
48
+ parent: '(null|element)',
49
+ toggle: 'boolean'
84
50
  };
85
- var Event = {
86
- SHOW: "show" + EVENT_KEY,
87
- SHOWN: "shown" + EVENT_KEY,
88
- HIDE: "hide" + EVENT_KEY,
89
- HIDDEN: "hidden" + EVENT_KEY,
90
- CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
91
- };
92
- var ClassName = {
93
- SHOW: 'show',
94
- COLLAPSE: 'collapse',
95
- COLLAPSING: 'collapsing',
96
- COLLAPSED: 'collapsed'
97
- };
98
- var Dimension = {
99
- WIDTH: 'width',
100
- HEIGHT: 'height'
101
- };
102
- var Selector = {
103
- ACTIVES: '.show, .collapsing',
104
- DATA_TOGGLE: '[data-toggle="collapse"]'
105
- /**
106
- * ------------------------------------------------------------------------
107
- * Class Definition
108
- * ------------------------------------------------------------------------
109
- */
110
51
 
111
- };
52
+ /**
53
+ * Class definition
54
+ */
112
55
 
113
- var Collapse =
114
- /*#__PURE__*/
115
- function () {
116
- function Collapse(element, config) {
56
+ class Collapse extends BaseComponent {
57
+ constructor(element, config) {
58
+ super(element, config);
117
59
  this._isTransitioning = false;
118
- this._element = element;
119
- this._config = this._getConfig(config);
120
- this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
121
- var toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
122
-
123
- for (var i = 0, len = toggleList.length; i < len; i++) {
124
- var elem = toggleList[i];
125
- var selector = Util.getSelectorFromElement(elem);
126
- var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
127
- return foundElem === element;
128
- });
129
-
130
- if (selector !== null && filterElement.length > 0) {
131
- this._selector = selector;
132
-
60
+ this._triggerArray = [];
61
+ const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE);
62
+ for (const elem of toggleList) {
63
+ const selector = SelectorEngine.getSelectorFromElement(elem);
64
+ const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);
65
+ if (selector !== null && filterElement.length) {
133
66
  this._triggerArray.push(elem);
134
67
  }
135
68
  }
136
-
137
- this._parent = this._config.parent ? this._getParent() : null;
138
-
69
+ this._initializeChildren();
139
70
  if (!this._config.parent) {
140
- this._addAriaAndCollapsedClass(this._element, this._triggerArray);
71
+ this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
141
72
  }
142
-
143
73
  if (this._config.toggle) {
144
74
  this.toggle();
145
75
  }
146
- } // Getters
147
-
76
+ }
148
77
 
149
- var _proto = Collapse.prototype;
78
+ // Getters
79
+ static get Default() {
80
+ return Default;
81
+ }
82
+ static get DefaultType() {
83
+ return DefaultType;
84
+ }
85
+ static get NAME() {
86
+ return NAME;
87
+ }
150
88
 
151
89
  // Public
152
- _proto.toggle = function toggle() {
153
- if ($(this._element).hasClass(ClassName.SHOW)) {
90
+ toggle() {
91
+ if (this._isShown()) {
154
92
  this.hide();
155
93
  } else {
156
94
  this.show();
157
95
  }
158
- };
159
-
160
- _proto.show = function show() {
161
- var _this = this;
162
-
163
- if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) {
96
+ }
97
+ show() {
98
+ if (this._isTransitioning || this._isShown()) {
164
99
  return;
165
100
  }
101
+ let activeChildren = [];
166
102
 
167
- var actives;
168
- var activesData;
169
-
170
- if (this._parent) {
171
- actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES)).filter(function (elem) {
172
- if (typeof _this._config.parent === 'string') {
173
- return elem.getAttribute('data-parent') === _this._config.parent;
174
- }
175
-
176
- return elem.classList.contains(ClassName.COLLAPSE);
177
- });
178
-
179
- if (actives.length === 0) {
180
- actives = null;
181
- }
103
+ // find active children
104
+ if (this._config.parent) {
105
+ activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {
106
+ toggle: false
107
+ }));
182
108
  }
183
-
184
- if (actives) {
185
- activesData = $(actives).not(this._selector).data(DATA_KEY);
186
-
187
- if (activesData && activesData._isTransitioning) {
188
- return;
189
- }
109
+ if (activeChildren.length && activeChildren[0]._isTransitioning) {
110
+ return;
190
111
  }
191
-
192
- var startEvent = $.Event(Event.SHOW);
193
- $(this._element).trigger(startEvent);
194
-
195
- if (startEvent.isDefaultPrevented()) {
112
+ const startEvent = EventHandler.trigger(this._element, EVENT_SHOW);
113
+ if (startEvent.defaultPrevented) {
196
114
  return;
197
115
  }
198
-
199
- if (actives) {
200
- Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');
201
-
202
- if (!activesData) {
203
- $(actives).data(DATA_KEY, null);
204
- }
116
+ for (const activeInstance of activeChildren) {
117
+ activeInstance.hide();
205
118
  }
206
-
207
- var dimension = this._getDimension();
208
-
209
- $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
119
+ const dimension = this._getDimension();
120
+ this._element.classList.remove(CLASS_NAME_COLLAPSE);
121
+ this._element.classList.add(CLASS_NAME_COLLAPSING);
210
122
  this._element.style[dimension] = 0;
211
-
212
- if (this._triggerArray.length) {
213
- $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
214
- }
215
-
216
- this.setTransitioning(true);
217
-
218
- var complete = function complete() {
219
- $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
220
- _this._element.style[dimension] = '';
221
-
222
- _this.setTransitioning(false);
223
-
224
- $(_this._element).trigger(Event.SHOWN);
123
+ this._addAriaAndCollapsedClass(this._triggerArray, true);
124
+ this._isTransitioning = true;
125
+ const complete = () => {
126
+ this._isTransitioning = false;
127
+ this._element.classList.remove(CLASS_NAME_COLLAPSING);
128
+ this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
129
+ this._element.style[dimension] = '';
130
+ EventHandler.trigger(this._element, EVENT_SHOWN);
225
131
  };
226
-
227
- var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
228
- var scrollSize = "scroll" + capitalizedDimension;
229
- var transitionDuration = Util.getTransitionDurationFromElement(this._element);
230
- $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
231
- this._element.style[dimension] = this._element[scrollSize] + "px";
232
- };
233
-
234
- _proto.hide = function hide() {
235
- var _this2 = this;
236
-
237
- if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) {
132
+ const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
133
+ const scrollSize = `scroll${capitalizedDimension}`;
134
+ this._queueCallback(complete, this._element, true);
135
+ this._element.style[dimension] = `${this._element[scrollSize]}px`;
136
+ }
137
+ hide() {
138
+ if (this._isTransitioning || !this._isShown()) {
238
139
  return;
239
140
  }
240
-
241
- var startEvent = $.Event(Event.HIDE);
242
- $(this._element).trigger(startEvent);
243
-
244
- if (startEvent.isDefaultPrevented()) {
141
+ const startEvent = EventHandler.trigger(this._element, EVENT_HIDE);
142
+ if (startEvent.defaultPrevented) {
245
143
  return;
246
144
  }
247
-
248
- var dimension = this._getDimension();
249
-
250
- this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
251
- Util.reflow(this._element);
252
- $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
253
- var triggerArrayLength = this._triggerArray.length;
254
-
255
- if (triggerArrayLength > 0) {
256
- for (var i = 0; i < triggerArrayLength; i++) {
257
- var trigger = this._triggerArray[i];
258
- var selector = Util.getSelectorFromElement(trigger);
259
-
260
- if (selector !== null) {
261
- var $elem = $([].slice.call(document.querySelectorAll(selector)));
262
-
263
- if (!$elem.hasClass(ClassName.SHOW)) {
264
- $(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
265
- }
266
- }
145
+ const dimension = this._getDimension();
146
+ this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
147
+ index_js.reflow(this._element);
148
+ this._element.classList.add(CLASS_NAME_COLLAPSING);
149
+ this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
150
+ for (const trigger of this._triggerArray) {
151
+ const element = SelectorEngine.getElementFromSelector(trigger);
152
+ if (element && !this._isShown(element)) {
153
+ this._addAriaAndCollapsedClass([trigger], false);
267
154
  }
268
155
  }
269
-
270
- this.setTransitioning(true);
271
-
272
- var complete = function complete() {
273
- _this2.setTransitioning(false);
274
-
275
- $(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
156
+ this._isTransitioning = true;
157
+ const complete = () => {
158
+ this._isTransitioning = false;
159
+ this._element.classList.remove(CLASS_NAME_COLLAPSING);
160
+ this._element.classList.add(CLASS_NAME_COLLAPSE);
161
+ EventHandler.trigger(this._element, EVENT_HIDDEN);
276
162
  };
277
-
278
163
  this._element.style[dimension] = '';
279
- var transitionDuration = Util.getTransitionDurationFromElement(this._element);
280
- $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
281
- };
282
-
283
- _proto.setTransitioning = function setTransitioning(isTransitioning) {
284
- this._isTransitioning = isTransitioning;
285
- };
286
-
287
- _proto.dispose = function dispose() {
288
- $.removeData(this._element, DATA_KEY);
289
- this._config = null;
290
- this._parent = null;
291
- this._element = null;
292
- this._triggerArray = null;
293
- this._isTransitioning = null;
294
- } // Private
295
- ;
164
+ this._queueCallback(complete, this._element, true);
165
+ }
166
+ _isShown(element = this._element) {
167
+ return element.classList.contains(CLASS_NAME_SHOW);
168
+ }
296
169
 
297
- _proto._getConfig = function _getConfig(config) {
298
- config = _objectSpread({}, Default, config);
170
+ // Private
171
+ _configAfterMerge(config) {
299
172
  config.toggle = Boolean(config.toggle); // Coerce string values
300
-
301
- Util.typeCheckConfig(NAME, config, DefaultType);
173
+ config.parent = index_js.getElement(config.parent);
302
174
  return config;
303
- };
304
-
305
- _proto._getDimension = function _getDimension() {
306
- var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
307
- return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
308
- };
309
-
310
- _proto._getParent = function _getParent() {
311
- var _this3 = this;
312
-
313
- var parent;
314
-
315
- if (Util.isElement(this._config.parent)) {
316
- parent = this._config.parent; // It's a jQuery object
317
-
318
- if (typeof this._config.parent.jquery !== 'undefined') {
319
- parent = this._config.parent[0];
175
+ }
176
+ _getDimension() {
177
+ return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
178
+ }
179
+ _initializeChildren() {
180
+ if (!this._config.parent) {
181
+ return;
182
+ }
183
+ const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE);
184
+ for (const element of children) {
185
+ const selected = SelectorEngine.getElementFromSelector(element);
186
+ if (selected) {
187
+ this._addAriaAndCollapsedClass([element], this._isShown(selected));
320
188
  }
321
- } else {
322
- parent = document.querySelector(this._config.parent);
323
189
  }
324
-
325
- var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
326
- var children = [].slice.call(parent.querySelectorAll(selector));
327
- $(children).each(function (i, element) {
328
- _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
329
- });
330
- return parent;
331
- };
332
-
333
- _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
334
- var isOpen = $(element).hasClass(ClassName.SHOW);
335
-
336
- if (triggerArray.length) {
337
- $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
190
+ }
191
+ _getFirstLevelChildren(selector) {
192
+ const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
193
+ // remove children if greater depth
194
+ return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));
195
+ }
196
+ _addAriaAndCollapsedClass(triggerArray, isOpen) {
197
+ if (!triggerArray.length) {
198
+ return;
338
199
  }
339
- } // Static
340
- ;
341
-
342
- Collapse._getTargetFromElement = function _getTargetFromElement(element) {
343
- var selector = Util.getSelectorFromElement(element);
344
- return selector ? document.querySelector(selector) : null;
345
- };
200
+ for (const element of triggerArray) {
201
+ element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);
202
+ element.setAttribute('aria-expanded', isOpen);
203
+ }
204
+ }
346
205
 
347
- Collapse._jQueryInterface = function _jQueryInterface(config) {
206
+ // Static
207
+ static jQueryInterface(config) {
208
+ const _config = {};
209
+ if (typeof config === 'string' && /show|hide/.test(config)) {
210
+ _config.toggle = false;
211
+ }
348
212
  return this.each(function () {
349
- var $this = $(this);
350
- var data = $this.data(DATA_KEY);
351
-
352
- var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config ? config : {});
353
-
354
- if (!data && _config.toggle && /show|hide/.test(config)) {
355
- _config.toggle = false;
356
- }
357
-
358
- if (!data) {
359
- data = new Collapse(this, _config);
360
- $this.data(DATA_KEY, data);
361
- }
362
-
213
+ const data = Collapse.getOrCreateInstance(this, _config);
363
214
  if (typeof config === 'string') {
364
215
  if (typeof data[config] === 'undefined') {
365
- throw new TypeError("No method named \"" + config + "\"");
216
+ throw new TypeError(`No method named "${config}"`);
366
217
  }
367
-
368
218
  data[config]();
369
219
  }
370
220
  });
371
- };
372
-
373
- _createClass(Collapse, null, [{
374
- key: "VERSION",
375
- get: function get() {
376
- return VERSION;
377
- }
378
- }, {
379
- key: "Default",
380
- get: function get() {
381
- return Default;
382
- }
383
- }]);
221
+ }
222
+ }
384
223
 
385
- return Collapse;
386
- }();
387
224
  /**
388
- * ------------------------------------------------------------------------
389
- * Data Api implementation
390
- * ------------------------------------------------------------------------
225
+ * Data API implementation
391
226
  */
392
227
 
393
-
394
- $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
228
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
395
229
  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
396
- if (event.currentTarget.tagName === 'A') {
230
+ if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
397
231
  event.preventDefault();
398
232
  }
399
-
400
- var $trigger = $(this);
401
- var selector = Util.getSelectorFromElement(this);
402
- var selectors = [].slice.call(document.querySelectorAll(selector));
403
- $(selectors).each(function () {
404
- var $target = $(this);
405
- var data = $target.data(DATA_KEY);
406
- var config = data ? 'toggle' : $trigger.data();
407
-
408
- Collapse._jQueryInterface.call($target, config);
409
- });
233
+ for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {
234
+ Collapse.getOrCreateInstance(element, {
235
+ toggle: false
236
+ }).toggle();
237
+ }
410
238
  });
239
+
411
240
  /**
412
- * ------------------------------------------------------------------------
413
241
  * jQuery
414
- * ------------------------------------------------------------------------
415
242
  */
416
243
 
417
- $.fn[NAME] = Collapse._jQueryInterface;
418
- $.fn[NAME].Constructor = Collapse;
419
-
420
- $.fn[NAME].noConflict = function () {
421
- $.fn[NAME] = JQUERY_NO_CONFLICT;
422
- return Collapse._jQueryInterface;
423
- };
244
+ index_js.defineJQueryPlugin(Collapse);
424
245
 
425
246
  return Collapse;
426
247
 
@@ -0,0 +1,62 @@
1
+ /*!
2
+ * Bootstrap data.js v5.3.0 (https://getbootstrap.com/)
3
+ * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ */
6
+ (function (global, factory) {
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
8
+ typeof define === 'function' && define.amd ? define(factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Data = factory());
10
+ })(this, (function () { 'use strict';
11
+
12
+ /**
13
+ * --------------------------------------------------------------------------
14
+ * Bootstrap dom/data.js
15
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
+ * --------------------------------------------------------------------------
17
+ */
18
+
19
+ /**
20
+ * Constants
21
+ */
22
+
23
+ const elementMap = new Map();
24
+ const data = {
25
+ set(element, key, instance) {
26
+ if (!elementMap.has(element)) {
27
+ elementMap.set(element, new Map());
28
+ }
29
+ const instanceMap = elementMap.get(element);
30
+
31
+ // make it clear we only want one instance per element
32
+ // can be removed later when multiple key/instances are fine to be used
33
+ if (!instanceMap.has(key) && instanceMap.size !== 0) {
34
+ // eslint-disable-next-line no-console
35
+ console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
36
+ return;
37
+ }
38
+ instanceMap.set(key, instance);
39
+ },
40
+ get(element, key) {
41
+ if (elementMap.has(element)) {
42
+ return elementMap.get(element).get(key) || null;
43
+ }
44
+ return null;
45
+ },
46
+ remove(element, key) {
47
+ if (!elementMap.has(element)) {
48
+ return;
49
+ }
50
+ const instanceMap = elementMap.get(element);
51
+ instanceMap.delete(key);
52
+
53
+ // free up element references if there are no instances left for an element
54
+ if (instanceMap.size === 0) {
55
+ elementMap.delete(element);
56
+ }
57
+ }
58
+ };
59
+
60
+ return data;
61
+
62
+ }));