bootstrap 5.2.2 → 5.3.3

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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +61 -0
  3. data/CHANGELOG.md +4 -0
  4. data/Gemfile +1 -0
  5. data/README.md +9 -3
  6. data/Rakefile +17 -4
  7. data/assets/javascripts/bootstrap/alert.js +22 -32
  8. data/assets/javascripts/bootstrap/base-component.js +22 -38
  9. data/assets/javascripts/bootstrap/button.js +19 -22
  10. data/assets/javascripts/bootstrap/carousel.js +52 -135
  11. data/assets/javascripts/bootstrap/collapse.js +40 -102
  12. data/assets/javascripts/bootstrap/dom/data.js +8 -12
  13. data/assets/javascripts/bootstrap/dom/event-handler.js +19 -66
  14. data/assets/javascripts/bootstrap/dom/manipulator.js +4 -17
  15. data/assets/javascripts/bootstrap/dom/selector-engine.js +42 -24
  16. data/assets/javascripts/bootstrap/dropdown.js +74 -145
  17. data/assets/javascripts/bootstrap/modal.js +53 -133
  18. data/assets/javascripts/bootstrap/offcanvas.js +50 -102
  19. data/assets/javascripts/bootstrap/popover.js +23 -29
  20. data/assets/javascripts/bootstrap/scrollspy.js +53 -90
  21. data/assets/javascripts/bootstrap/tab.js +63 -112
  22. data/assets/javascripts/bootstrap/toast.js +31 -73
  23. data/assets/javascripts/bootstrap/tooltip.js +80 -191
  24. data/assets/javascripts/bootstrap/util/backdrop.js +27 -54
  25. data/assets/javascripts/bootstrap/util/component-functions.js +13 -18
  26. data/assets/javascripts/bootstrap/util/config.js +15 -27
  27. data/assets/javascripts/bootstrap/util/focustrap.js +19 -36
  28. data/assets/javascripts/bootstrap/util/index.js +42 -112
  29. data/assets/javascripts/bootstrap/util/sanitizer.js +33 -42
  30. data/assets/javascripts/bootstrap/util/scrollbar.js +24 -50
  31. data/assets/javascripts/bootstrap/util/swipe.js +27 -48
  32. data/assets/javascripts/bootstrap/util/template-factory.js +25 -52
  33. data/assets/javascripts/bootstrap-sprockets.js +8 -8
  34. data/assets/javascripts/bootstrap.js +686 -1450
  35. data/assets/javascripts/bootstrap.min.js +3 -3
  36. data/assets/stylesheets/_bootstrap-grid.scss +1 -3
  37. data/assets/stylesheets/_bootstrap-reboot.scss +1 -0
  38. data/assets/stylesheets/_bootstrap-utilities.scss +19 -0
  39. data/assets/stylesheets/_bootstrap.scss +1 -0
  40. data/assets/stylesheets/bootstrap/_accordion.scss +20 -11
  41. data/assets/stylesheets/bootstrap/_alert.scss +8 -11
  42. data/assets/stylesheets/bootstrap/_button-group.scss +2 -2
  43. data/assets/stylesheets/bootstrap/_buttons.scss +12 -3
  44. data/assets/stylesheets/bootstrap/_card.scss +5 -0
  45. data/assets/stylesheets/bootstrap/_carousel.scss +22 -15
  46. data/assets/stylesheets/bootstrap/_close.scss +32 -9
  47. data/assets/stylesheets/bootstrap/_dropdown.scss +1 -0
  48. data/assets/stylesheets/bootstrap/_functions.scss +2 -2
  49. data/assets/stylesheets/bootstrap/_grid.scss +6 -0
  50. data/assets/stylesheets/bootstrap/_helpers.scss +2 -0
  51. data/assets/stylesheets/bootstrap/_list-group.scss +12 -7
  52. data/assets/stylesheets/bootstrap/_maps.scss +120 -0
  53. data/assets/stylesheets/bootstrap/_mixins.scss +1 -2
  54. data/assets/stylesheets/bootstrap/_modal.scss +0 -1
  55. data/assets/stylesheets/bootstrap/_nav.scss +42 -17
  56. data/assets/stylesheets/bootstrap/_navbar.scss +15 -4
  57. data/assets/stylesheets/bootstrap/_offcanvas.scss +5 -6
  58. data/assets/stylesheets/bootstrap/_pagination.scss +1 -1
  59. data/assets/stylesheets/bootstrap/_progress.scss +10 -1
  60. data/assets/stylesheets/bootstrap/_reboot.scss +8 -7
  61. data/assets/stylesheets/bootstrap/_root.scss +124 -10
  62. data/assets/stylesheets/bootstrap/_tables.scss +19 -12
  63. data/assets/stylesheets/bootstrap/_tooltip.scss +4 -5
  64. data/assets/stylesheets/bootstrap/_utilities.scss +175 -16
  65. data/assets/stylesheets/bootstrap/_variables-dark.scss +87 -0
  66. data/assets/stylesheets/bootstrap/_variables.scss +289 -172
  67. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +23 -3
  68. data/assets/stylesheets/bootstrap/forms/_form-check.scss +27 -13
  69. data/assets/stylesheets/bootstrap/forms/_form-control.scss +24 -4
  70. data/assets/stylesheets/bootstrap/forms/_form-range.scss +3 -3
  71. data/assets/stylesheets/bootstrap/forms/_form-select.scss +12 -3
  72. data/assets/stylesheets/bootstrap/forms/_input-group.scss +1 -1
  73. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +1 -4
  74. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +20 -2
  75. data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
  76. data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
  77. data/assets/stylesheets/bootstrap/helpers/_vr.scss +1 -1
  78. data/assets/stylesheets/bootstrap/mixins/_alert.scss +4 -1
  79. data/assets/stylesheets/bootstrap/mixins/_banner.scss +2 -4
  80. data/assets/stylesheets/bootstrap/mixins/_caret.scss +30 -25
  81. data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
  82. data/assets/stylesheets/bootstrap/mixins/_forms.scss +20 -9
  83. data/assets/stylesheets/bootstrap/mixins/_grid.scss +2 -2
  84. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +2 -0
  85. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +1 -1
  86. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +5 -1
  87. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +23 -29
  88. data/bootstrap.gemspec +4 -3
  89. data/lib/bootstrap/engine.rb +17 -1
  90. data/lib/bootstrap/version.rb +2 -2
  91. data/tasks/updater/js.rb +1 -1
  92. data/tasks/updater/network.rb +2 -2
  93. data/tasks/updater/scss.rb +2 -2
  94. data/test/gemfiles/rails_4_2.gemfile +2 -1
  95. data/test/gemfiles/rails_5_0.gemfile +1 -1
  96. data/test/gemfiles/rails_5_1.gemfile +1 -1
  97. data/test/gemfiles/rails_5_2.gemfile +8 -0
  98. data/test/gemfiles/rails_6_0.gemfile +1 -0
  99. data/test/gemfiles/rails_6_1.gemfile +1 -0
  100. data/test/gemfiles/rails_7_0_dartsass.gemfile +8 -0
  101. data/test/gemfiles/rails_7_0_sassc.gemfile +8 -0
  102. data/test/test_helper.rb +3 -2
  103. metadata +42 -18
  104. data/.travis.yml +0 -32
  105. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +0 -15
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Bootstrap manipulator.js v5.2.2 (https://getbootstrap.com/)
3
- * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap manipulator.js v5.3.3 (https://getbootstrap.com/)
3
+ * Copyright 2011-2024 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) {
@@ -11,72 +11,59 @@
11
11
 
12
12
  /**
13
13
  * --------------------------------------------------------------------------
14
- * Bootstrap (v5.2.2): dom/manipulator.js
14
+ * Bootstrap dom/manipulator.js
15
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
16
  * --------------------------------------------------------------------------
17
17
  */
18
+
18
19
  function normalizeData(value) {
19
20
  if (value === 'true') {
20
21
  return true;
21
22
  }
22
-
23
23
  if (value === 'false') {
24
24
  return false;
25
25
  }
26
-
27
26
  if (value === Number(value).toString()) {
28
27
  return Number(value);
29
28
  }
30
-
31
29
  if (value === '' || value === 'null') {
32
30
  return null;
33
31
  }
34
-
35
32
  if (typeof value !== 'string') {
36
33
  return value;
37
34
  }
38
-
39
35
  try {
40
36
  return JSON.parse(decodeURIComponent(value));
41
37
  } catch (_unused) {
42
38
  return value;
43
39
  }
44
40
  }
45
-
46
41
  function normalizeDataKey(key) {
47
42
  return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
48
43
  }
49
-
50
44
  const Manipulator = {
51
45
  setDataAttribute(element, key, value) {
52
46
  element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
53
47
  },
54
-
55
48
  removeDataAttribute(element, key) {
56
49
  element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
57
50
  },
58
-
59
51
  getDataAttributes(element) {
60
52
  if (!element) {
61
53
  return {};
62
54
  }
63
-
64
55
  const attributes = {};
65
56
  const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));
66
-
67
57
  for (const key of bsKeys) {
68
58
  let pureKey = key.replace(/^bs/, '');
69
59
  pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
70
60
  attributes[pureKey] = normalizeData(element.dataset[key]);
71
61
  }
72
-
73
62
  return attributes;
74
63
  },
75
-
76
64
  getDataAttribute(element, key) {
77
65
  return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
78
66
  }
79
-
80
67
  };
81
68
 
82
69
  return Manipulator;
@@ -1,83 +1,101 @@
1
1
  /*!
2
- * Bootstrap selector-engine.js v5.2.2 (https://getbootstrap.com/)
3
- * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap selector-engine.js v5.3.3 (https://getbootstrap.com/)
3
+ * Copyright 2011-2024 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('../util/index')) :
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../util/index.js')) :
8
8
  typeof define === 'function' && define.amd ? define(['../util/index'], factory) :
9
9
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SelectorEngine = factory(global.Index));
10
- })(this, (function (index) { 'use strict';
10
+ })(this, (function (index_js) { 'use strict';
11
11
 
12
12
  /**
13
13
  * --------------------------------------------------------------------------
14
- * Bootstrap (v5.2.2): dom/selector-engine.js
14
+ * Bootstrap dom/selector-engine.js
15
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
16
  * --------------------------------------------------------------------------
17
17
  */
18
- /**
19
- * Constants
20
- */
21
18
 
19
+ const getSelector = element => {
20
+ let selector = element.getAttribute('data-bs-target');
21
+ if (!selector || selector === '#') {
22
+ let hrefAttribute = element.getAttribute('href');
23
+
24
+ // The only valid content that could double as a selector are IDs or classes,
25
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
26
+ // `document.querySelector` will rightfully complain it is invalid.
27
+ // See https://github.com/twbs/bootstrap/issues/32273
28
+ if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {
29
+ return null;
30
+ }
31
+
32
+ // Just in case some CMS puts out a full URL with the anchor appended
33
+ if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
34
+ hrefAttribute = `#${hrefAttribute.split('#')[1]}`;
35
+ }
36
+ selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;
37
+ }
38
+ return selector ? selector.split(',').map(sel => index_js.parseSelector(sel)).join(',') : null;
39
+ };
22
40
  const SelectorEngine = {
23
41
  find(selector, element = document.documentElement) {
24
42
  return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
25
43
  },
26
-
27
44
  findOne(selector, element = document.documentElement) {
28
45
  return Element.prototype.querySelector.call(element, selector);
29
46
  },
30
-
31
47
  children(element, selector) {
32
48
  return [].concat(...element.children).filter(child => child.matches(selector));
33
49
  },
34
-
35
50
  parents(element, selector) {
36
51
  const parents = [];
37
52
  let ancestor = element.parentNode.closest(selector);
38
-
39
53
  while (ancestor) {
40
54
  parents.push(ancestor);
41
55
  ancestor = ancestor.parentNode.closest(selector);
42
56
  }
43
-
44
57
  return parents;
45
58
  },
46
-
47
59
  prev(element, selector) {
48
60
  let previous = element.previousElementSibling;
49
-
50
61
  while (previous) {
51
62
  if (previous.matches(selector)) {
52
63
  return [previous];
53
64
  }
54
-
55
65
  previous = previous.previousElementSibling;
56
66
  }
57
-
58
67
  return [];
59
68
  },
60
-
61
69
  // TODO: this is now unused; remove later along with prev()
62
70
  next(element, selector) {
63
71
  let next = element.nextElementSibling;
64
-
65
72
  while (next) {
66
73
  if (next.matches(selector)) {
67
74
  return [next];
68
75
  }
69
-
70
76
  next = next.nextElementSibling;
71
77
  }
72
-
73
78
  return [];
74
79
  },
75
-
76
80
  focusableChildren(element) {
77
81
  const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(',');
78
- return this.find(focusables, element).filter(el => !index.isDisabled(el) && index.isVisible(el));
82
+ return this.find(focusables, element).filter(el => !index_js.isDisabled(el) && index_js.isVisible(el));
83
+ },
84
+ getSelectorFromElement(element) {
85
+ const selector = getSelector(element);
86
+ if (selector) {
87
+ return SelectorEngine.findOne(selector) ? selector : null;
88
+ }
89
+ return null;
90
+ },
91
+ getElementFromSelector(element) {
92
+ const selector = getSelector(element);
93
+ return selector ? SelectorEngine.findOne(selector) : null;
94
+ },
95
+ getMultipleElementsFromSelector(element) {
96
+ const selector = getSelector(element);
97
+ return selector ? SelectorEngine.find(selector) : [];
79
98
  }
80
-
81
99
  };
82
100
 
83
101
  return SelectorEngine;