bootstrap 5.0.1 → 5.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/assets/javascripts/bootstrap/alert.js +89 -58
  4. data/assets/javascripts/bootstrap/base-component.js +53 -39
  5. data/assets/javascripts/bootstrap/button.js +31 -25
  6. data/assets/javascripts/bootstrap/carousel.js +126 -89
  7. data/assets/javascripts/bootstrap/collapse.js +125 -133
  8. data/assets/javascripts/bootstrap/dom/data.js +5 -5
  9. data/assets/javascripts/bootstrap/dom/event-handler.js +11 -5
  10. data/assets/javascripts/bootstrap/dom/manipulator.js +6 -6
  11. data/assets/javascripts/bootstrap/dom/selector-engine.js +49 -7
  12. data/assets/javascripts/bootstrap/dropdown.js +147 -140
  13. data/assets/javascripts/bootstrap/modal.js +397 -180
  14. data/assets/javascripts/bootstrap/offcanvas.js +333 -138
  15. data/assets/javascripts/bootstrap/popover.js +36 -54
  16. data/assets/javascripts/bootstrap/scrollspy.js +58 -68
  17. data/assets/javascripts/bootstrap/tab.js +53 -26
  18. data/assets/javascripts/bootstrap/toast.js +138 -41
  19. data/assets/javascripts/bootstrap/tooltip.js +137 -120
  20. data/assets/javascripts/bootstrap-sprockets.js +8 -8
  21. data/assets/javascripts/bootstrap.js +937 -886
  22. data/assets/javascripts/bootstrap.min.js +2 -2
  23. data/assets/stylesheets/_bootstrap-grid.scss +3 -1
  24. data/assets/stylesheets/_bootstrap-reboot.scss +2 -4
  25. data/assets/stylesheets/_bootstrap.scss +2 -1
  26. data/assets/stylesheets/bootstrap/_buttons.scss +1 -0
  27. data/assets/stylesheets/bootstrap/_card.scss +7 -6
  28. data/assets/stylesheets/bootstrap/_carousel.scss +2 -2
  29. data/assets/stylesheets/bootstrap/_dropdown.scss +4 -4
  30. data/assets/stylesheets/bootstrap/_functions.scss +100 -3
  31. data/assets/stylesheets/bootstrap/_grid.scss +11 -0
  32. data/assets/stylesheets/bootstrap/_helpers.scss +2 -0
  33. data/assets/stylesheets/bootstrap/_images.scss +1 -1
  34. data/assets/stylesheets/bootstrap/_mixins.scss +1 -0
  35. data/assets/stylesheets/bootstrap/_modal.scss +5 -15
  36. data/assets/stylesheets/bootstrap/_navbar.scss +30 -1
  37. data/assets/stylesheets/bootstrap/_offcanvas.scss +8 -2
  38. data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
  39. data/assets/stylesheets/bootstrap/_popover.scss +10 -10
  40. data/assets/stylesheets/bootstrap/_reboot.scss +12 -8
  41. data/assets/stylesheets/bootstrap/_root.scss +40 -2
  42. data/assets/stylesheets/bootstrap/_tables.scss +9 -5
  43. data/assets/stylesheets/bootstrap/_toasts.scss +3 -3
  44. data/assets/stylesheets/bootstrap/_tooltip.scss +4 -4
  45. data/assets/stylesheets/bootstrap/_transitions.scss +6 -0
  46. data/assets/stylesheets/bootstrap/_utilities.scss +44 -8
  47. data/assets/stylesheets/bootstrap/_variables.scss +206 -29
  48. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +1 -1
  49. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +3 -1
  50. data/assets/stylesheets/bootstrap/forms/_form-check.scss +1 -1
  51. data/assets/stylesheets/bootstrap/forms/_form-control.scss +1 -1
  52. data/assets/stylesheets/bootstrap/forms/_form-range.scss +1 -1
  53. data/assets/stylesheets/bootstrap/forms/_form-select.scss +5 -0
  54. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  55. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  56. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  57. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +1 -1
  58. data/assets/stylesheets/bootstrap/mixins/_grid.scss +35 -9
  59. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +27 -6
  60. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +1 -1
  61. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +55 -13
  62. data/bootstrap.gemspec +3 -3
  63. data/lib/bootstrap/version.rb +2 -2
  64. data/tasks/updater/js.rb +6 -2
  65. metadata +12 -8
@@ -1,20 +1,26 @@
1
1
  /*!
2
- * Bootstrap toast.js v5.0.1 (https://getbootstrap.com/)
2
+ * Bootstrap toast.js v5.1.2 (https://getbootstrap.com/)
3
3
  * Copyright 2011-2021 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('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./base-component.js')) :
8
- typeof define === 'function' && define.amd ? define(['./dom/data', './dom/event-handler', './dom/manipulator', './base-component'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Toast = factory(global.Data, global.EventHandler, global.Manipulator, global.Base));
10
- }(this, (function (Data, EventHandler, Manipulator, BaseComponent) { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./base-component.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./dom/event-handler', './dom/manipulator', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Toast = factory(global.EventHandler, global.Manipulator, global.Base));
10
+ })(this, (function (EventHandler, Manipulator, BaseComponent) { 'use strict';
11
11
 
12
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
+ const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
13
13
 
14
- var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
15
- var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
16
- var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
17
- var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
14
+ const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
15
+ const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
16
+ const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
17
+
18
+ /**
19
+ * --------------------------------------------------------------------------
20
+ * Bootstrap (v5.1.2): util/index.js
21
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
22
+ * --------------------------------------------------------------------------
23
+ */
18
24
 
19
25
  const toType = obj => {
20
26
  if (obj === null || obj === undefined) {
@@ -24,6 +30,35 @@
24
30
  return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
25
31
  };
26
32
 
33
+ const getSelector = element => {
34
+ let selector = element.getAttribute('data-bs-target');
35
+
36
+ if (!selector || selector === '#') {
37
+ let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
38
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
39
+ // `document.querySelector` will rightfully complain it is invalid.
40
+ // See https://github.com/twbs/bootstrap/issues/32273
41
+
42
+ if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
43
+ return null;
44
+ } // Just in case some CMS puts out a full URL with the anchor appended
45
+
46
+
47
+ if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
48
+ hrefAttr = `#${hrefAttr.split('#')[1]}`;
49
+ }
50
+
51
+ selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
52
+ }
53
+
54
+ return selector;
55
+ };
56
+
57
+ const getElementFromSelector = element => {
58
+ const selector = getSelector(element);
59
+ return selector ? document.querySelector(selector) : null;
60
+ };
61
+
27
62
  const isElement = obj => {
28
63
  if (!obj || typeof obj !== 'object') {
29
64
  return false;
@@ -48,7 +83,35 @@
48
83
  });
49
84
  };
50
85
 
51
- const reflow = element => element.offsetHeight;
86
+ const isDisabled = element => {
87
+ if (!element || element.nodeType !== Node.ELEMENT_NODE) {
88
+ return true;
89
+ }
90
+
91
+ if (element.classList.contains('disabled')) {
92
+ return true;
93
+ }
94
+
95
+ if (typeof element.disabled !== 'undefined') {
96
+ return element.disabled;
97
+ }
98
+
99
+ return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
100
+ };
101
+ /**
102
+ * Trick to restart an element's animation
103
+ *
104
+ * @param {HTMLElement} element
105
+ * @return void
106
+ *
107
+ * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
108
+ */
109
+
110
+
111
+ const reflow = element => {
112
+ // eslint-disable-next-line no-unused-expressions
113
+ element.offsetHeight;
114
+ };
52
115
 
53
116
  const getjQuery = () => {
54
117
  const {
@@ -62,9 +125,18 @@
62
125
  return null;
63
126
  };
64
127
 
128
+ const DOMContentLoadedCallbacks = [];
129
+
65
130
  const onDOMContentLoaded = callback => {
66
131
  if (document.readyState === 'loading') {
67
- document.addEventListener('DOMContentLoaded', callback);
132
+ // add listener on the first call when the document is in loading state
133
+ if (!DOMContentLoadedCallbacks.length) {
134
+ document.addEventListener('DOMContentLoaded', () => {
135
+ DOMContentLoadedCallbacks.forEach(callback => callback());
136
+ });
137
+ }
138
+
139
+ DOMContentLoadedCallbacks.push(callback);
68
140
  } else {
69
141
  callback();
70
142
  }
@@ -91,7 +163,33 @@
91
163
 
92
164
  /**
93
165
  * --------------------------------------------------------------------------
94
- * Bootstrap (v5.0.1): toast.js
166
+ * Bootstrap (v5.1.2): util/component-functions.js
167
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
168
+ * --------------------------------------------------------------------------
169
+ */
170
+
171
+ const enableDismissTrigger = (component, method = 'hide') => {
172
+ const clickEvent = `click.dismiss${component.EVENT_KEY}`;
173
+ const name = component.NAME;
174
+ EventHandler__default.default.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
175
+ if (['A', 'AREA'].includes(this.tagName)) {
176
+ event.preventDefault();
177
+ }
178
+
179
+ if (isDisabled(this)) {
180
+ return;
181
+ }
182
+
183
+ const target = getElementFromSelector(this) || this.closest(`.${name}`);
184
+ const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
185
+
186
+ instance[method]();
187
+ });
188
+ };
189
+
190
+ /**
191
+ * --------------------------------------------------------------------------
192
+ * Bootstrap (v5.1.2): toast.js
95
193
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
96
194
  * --------------------------------------------------------------------------
97
195
  */
@@ -104,7 +202,6 @@
104
202
  const NAME = 'toast';
105
203
  const DATA_KEY = 'bs.toast';
106
204
  const EVENT_KEY = `.${DATA_KEY}`;
107
- const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
108
205
  const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
109
206
  const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
110
207
  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
@@ -114,7 +211,8 @@
114
211
  const EVENT_SHOW = `show${EVENT_KEY}`;
115
212
  const EVENT_SHOWN = `shown${EVENT_KEY}`;
116
213
  const CLASS_NAME_FADE = 'fade';
117
- const CLASS_NAME_HIDE = 'hide';
214
+ const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
215
+
118
216
  const CLASS_NAME_SHOW = 'show';
119
217
  const CLASS_NAME_SHOWING = 'showing';
120
218
  const DefaultType = {
@@ -127,14 +225,13 @@
127
225
  autohide: true,
128
226
  delay: 5000
129
227
  };
130
- const SELECTOR_DATA_DISMISS = '[data-bs-dismiss="toast"]';
131
228
  /**
132
229
  * ------------------------------------------------------------------------
133
230
  * Class Definition
134
231
  * ------------------------------------------------------------------------
135
232
  */
136
233
 
137
- class Toast extends BaseComponent__default['default'] {
234
+ class Toast extends BaseComponent__default.default {
138
235
  constructor(element, config) {
139
236
  super(element);
140
237
  this._config = this._getConfig(config);
@@ -160,7 +257,7 @@
160
257
 
161
258
 
162
259
  show() {
163
- const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW);
260
+ const showEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW);
164
261
 
165
262
  if (showEvent.defaultPrevented) {
166
263
  return;
@@ -175,17 +272,18 @@
175
272
  const complete = () => {
176
273
  this._element.classList.remove(CLASS_NAME_SHOWING);
177
274
 
178
- this._element.classList.add(CLASS_NAME_SHOW);
179
-
180
- EventHandler__default['default'].trigger(this._element, EVENT_SHOWN);
275
+ EventHandler__default.default.trigger(this._element, EVENT_SHOWN);
181
276
 
182
277
  this._maybeScheduleHide();
183
278
  };
184
279
 
185
- this._element.classList.remove(CLASS_NAME_HIDE);
280
+ this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated
281
+
186
282
 
187
283
  reflow(this._element);
188
284
 
285
+ this._element.classList.add(CLASS_NAME_SHOW);
286
+
189
287
  this._element.classList.add(CLASS_NAME_SHOWING);
190
288
 
191
289
  this._queueCallback(complete, this._element, this._config.animation);
@@ -196,19 +294,24 @@
196
294
  return;
197
295
  }
198
296
 
199
- const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
297
+ const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
200
298
 
201
299
  if (hideEvent.defaultPrevented) {
202
300
  return;
203
301
  }
204
302
 
205
303
  const complete = () => {
206
- this._element.classList.add(CLASS_NAME_HIDE);
304
+ this._element.classList.add(CLASS_NAME_HIDE); // @deprecated
207
305
 
208
- EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
306
+
307
+ this._element.classList.remove(CLASS_NAME_SHOWING);
308
+
309
+ this._element.classList.remove(CLASS_NAME_SHOW);
310
+
311
+ EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
209
312
  };
210
313
 
211
- this._element.classList.remove(CLASS_NAME_SHOW);
314
+ this._element.classList.add(CLASS_NAME_SHOWING);
212
315
 
213
316
  this._queueCallback(complete, this._element, this._config.animation);
214
317
  }
@@ -226,7 +329,7 @@
226
329
 
227
330
  _getConfig(config) {
228
331
  config = { ...Default,
229
- ...Manipulator__default['default'].getDataAttributes(this._element),
332
+ ...Manipulator__default.default.getDataAttributes(this._element),
230
333
  ...(typeof config === 'object' && config ? config : {})
231
334
  };
232
335
  typeCheckConfig(NAME, config, this.constructor.DefaultType);
@@ -276,11 +379,10 @@
276
379
  }
277
380
 
278
381
  _setListeners() {
279
- EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide());
280
- EventHandler__default['default'].on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));
281
- EventHandler__default['default'].on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));
282
- EventHandler__default['default'].on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));
283
- EventHandler__default['default'].on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));
382
+ EventHandler__default.default.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));
383
+ EventHandler__default.default.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));
384
+ EventHandler__default.default.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));
385
+ EventHandler__default.default.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));
284
386
  }
285
387
 
286
388
  _clearTimeout() {
@@ -291,13 +393,7 @@
291
393
 
292
394
  static jQueryInterface(config) {
293
395
  return this.each(function () {
294
- let data = Data__default['default'].get(this, DATA_KEY);
295
-
296
- const _config = typeof config === 'object' && config;
297
-
298
- if (!data) {
299
- data = new Toast(this, _config);
300
- }
396
+ const data = Toast.getOrCreateInstance(this, config);
301
397
 
302
398
  if (typeof config === 'string') {
303
399
  if (typeof data[config] === 'undefined') {
@@ -310,6 +406,8 @@
310
406
  }
311
407
 
312
408
  }
409
+
410
+ enableDismissTrigger(Toast);
313
411
  /**
314
412
  * ------------------------------------------------------------------------
315
413
  * jQuery
@@ -317,9 +415,8 @@
317
415
  * add .Toast to jQuery only if jQuery is present
318
416
  */
319
417
 
320
-
321
418
  defineJQueryPlugin(Toast);
322
419
 
323
420
  return Toast;
324
421
 
325
- })));
422
+ }));