bootstrap 5.1.3 → 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.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +61 -0
  3. data/CHANGELOG.md +9 -0
  4. data/Gemfile +1 -0
  5. data/README.md +35 -14
  6. data/Rakefile +16 -5
  7. data/assets/javascripts/bootstrap/alert.js +22 -167
  8. data/assets/javascripts/bootstrap/base-component.js +34 -133
  9. data/assets/javascripts/bootstrap/button.js +19 -86
  10. data/assets/javascripts/bootstrap/carousel.js +209 -564
  11. data/assets/javascripts/bootstrap/collapse.js +78 -324
  12. data/assets/javascripts/bootstrap/dom/data.js +8 -14
  13. data/assets/javascripts/bootstrap/dom/event-handler.js +89 -174
  14. data/assets/javascripts/bootstrap/dom/manipulator.js +22 -39
  15. data/assets/javascripts/bootstrap/dom/selector-engine.js +47 -71
  16. data/assets/javascripts/bootstrap/dropdown.js +135 -420
  17. data/assets/javascripts/bootstrap/modal.js +115 -837
  18. data/assets/javascripts/bootstrap/offcanvas.js +93 -714
  19. data/assets/javascripts/bootstrap/popover.js +42 -130
  20. data/assets/javascripts/bootstrap/scrollspy.js +180 -296
  21. data/assets/javascripts/bootstrap/tab.js +197 -245
  22. data/assets/javascripts/bootstrap/toast.js +52 -276
  23. data/assets/javascripts/bootstrap/tooltip.js +283 -744
  24. data/assets/javascripts/bootstrap/util/backdrop.js +138 -0
  25. data/assets/javascripts/bootstrap/util/component-functions.js +41 -0
  26. data/assets/javascripts/bootstrap/util/config.js +67 -0
  27. data/assets/javascripts/bootstrap/util/focustrap.js +112 -0
  28. data/assets/javascripts/bootstrap/util/index.js +280 -0
  29. data/assets/javascripts/bootstrap/util/sanitizer.js +113 -0
  30. data/assets/javascripts/bootstrap/util/scrollbar.js +112 -0
  31. data/assets/javascripts/bootstrap/util/swipe.js +134 -0
  32. data/assets/javascripts/bootstrap/util/template-factory.js +150 -0
  33. data/assets/javascripts/bootstrap-global-this-define.js +1 -1
  34. data/assets/javascripts/bootstrap-sprockets.js +15 -6
  35. data/assets/javascripts/bootstrap.js +2278 -2831
  36. data/assets/javascripts/bootstrap.min.js +3 -3
  37. data/assets/stylesheets/_bootstrap-grid.scss +4 -9
  38. data/assets/stylesheets/_bootstrap-reboot.scss +4 -7
  39. data/assets/stylesheets/_bootstrap-utilities.scss +19 -0
  40. data/assets/stylesheets/_bootstrap.scss +5 -6
  41. data/assets/stylesheets/bootstrap/_accordion.scss +68 -33
  42. data/assets/stylesheets/bootstrap/_alert.scss +25 -14
  43. data/assets/stylesheets/bootstrap/_badge.scss +14 -5
  44. data/assets/stylesheets/bootstrap/_breadcrumb.scss +22 -10
  45. data/assets/stylesheets/bootstrap/_button-group.scss +12 -4
  46. data/assets/stylesheets/bootstrap/_buttons.scss +133 -28
  47. data/assets/stylesheets/bootstrap/_card.scss +61 -39
  48. data/assets/stylesheets/bootstrap/_carousel.scss +22 -25
  49. data/assets/stylesheets/bootstrap/_close.scss +36 -10
  50. data/assets/stylesheets/bootstrap/_containers.scss +1 -1
  51. data/assets/stylesheets/bootstrap/_dropdown.scss +86 -76
  52. data/assets/stylesheets/bootstrap/_functions.scss +10 -10
  53. data/assets/stylesheets/bootstrap/_grid.scss +9 -3
  54. data/assets/stylesheets/bootstrap/_helpers.scss +3 -0
  55. data/assets/stylesheets/bootstrap/_list-group.scss +81 -56
  56. data/assets/stylesheets/bootstrap/_maps.scss +174 -0
  57. data/assets/stylesheets/bootstrap/_mixins.scss +1 -2
  58. data/assets/stylesheets/bootstrap/_modal.scss +76 -45
  59. data/assets/stylesheets/bootstrap/_nav.scss +87 -29
  60. data/assets/stylesheets/bootstrap/_navbar.scss +102 -148
  61. data/assets/stylesheets/bootstrap/_offcanvas.scss +125 -61
  62. data/assets/stylesheets/bootstrap/_pagination.scss +66 -21
  63. data/assets/stylesheets/bootstrap/_placeholders.scss +1 -1
  64. data/assets/stylesheets/bootstrap/_popover.scss +90 -52
  65. data/assets/stylesheets/bootstrap/_progress.scss +31 -11
  66. data/assets/stylesheets/bootstrap/_reboot.scss +32 -46
  67. data/assets/stylesheets/bootstrap/_root.scss +155 -22
  68. data/assets/stylesheets/bootstrap/_spinners.scss +38 -22
  69. data/assets/stylesheets/bootstrap/_tables.scss +40 -24
  70. data/assets/stylesheets/bootstrap/_toasts.scss +38 -16
  71. data/assets/stylesheets/bootstrap/_tooltip.scss +60 -56
  72. data/assets/stylesheets/bootstrap/_type.scss +3 -1
  73. data/assets/stylesheets/bootstrap/_utilities.scss +209 -33
  74. data/assets/stylesheets/bootstrap/_variables-dark.scss +102 -0
  75. data/assets/stylesheets/bootstrap/_variables.scss +415 -303
  76. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +39 -5
  77. data/assets/stylesheets/bootstrap/forms/_form-check.scss +51 -14
  78. data/assets/stylesheets/bootstrap/forms/_form-control.scss +36 -41
  79. data/assets/stylesheets/bootstrap/forms/_form-range.scss +3 -3
  80. data/assets/stylesheets/bootstrap/forms/_form-select.scss +12 -4
  81. data/assets/stylesheets/bootstrap/forms/_input-group.scss +20 -9
  82. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +7 -0
  83. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +20 -2
  84. data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
  85. data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
  86. data/assets/stylesheets/bootstrap/helpers/_position.scss +7 -1
  87. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +2 -2
  88. data/assets/stylesheets/bootstrap/helpers/_vr.scss +2 -2
  89. data/assets/stylesheets/bootstrap/mixins/_alert.scss +11 -4
  90. data/assets/stylesheets/bootstrap/mixins/_banner.scss +7 -0
  91. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +8 -8
  92. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +32 -95
  93. data/assets/stylesheets/bootstrap/mixins/_caret.scss +30 -25
  94. data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
  95. data/assets/stylesheets/bootstrap/mixins/_container.scss +4 -2
  96. data/assets/stylesheets/bootstrap/mixins/_forms.scss +38 -19
  97. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +1 -1
  98. data/assets/stylesheets/bootstrap/mixins/_grid.scss +15 -15
  99. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +2 -0
  100. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +4 -25
  101. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +1 -1
  102. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +12 -9
  103. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +14 -6
  104. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +6 -2
  105. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +23 -29
  106. data/bootstrap.gemspec +3 -3
  107. data/lib/bootstrap/engine.rb +17 -2
  108. data/lib/bootstrap/version.rb +2 -2
  109. data/tasks/updater/js.rb +10 -5
  110. data/tasks/updater/network.rb +2 -2
  111. data/tasks/updater/scss.rb +2 -2
  112. data/tasks/updater.rb +2 -2
  113. data/test/dummy_rails/config/application.rb +0 -2
  114. data/test/dummy_rails/public/favicon.ico +0 -0
  115. data/test/gemfiles/rails_4_2.gemfile +2 -1
  116. data/test/gemfiles/rails_5_0.gemfile +1 -2
  117. data/test/gemfiles/rails_5_1.gemfile +1 -2
  118. data/test/gemfiles/rails_5_2.gemfile +7 -0
  119. data/test/gemfiles/rails_6_0.gemfile +1 -1
  120. data/test/gemfiles/rails_6_1.gemfile +1 -1
  121. data/test/gemfiles/rails_7_0_dartsass.gemfile +7 -0
  122. data/test/gemfiles/rails_7_0_sassc.gemfile +7 -0
  123. data/test/rails_test.rb +0 -5
  124. data/test/test_helper.rb +3 -2
  125. metadata +49 -29
  126. data/.travis.yml +0 -32
  127. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +0 -18
@@ -0,0 +1,113 @@
1
+ /*!
2
+ * Bootstrap sanitizer.js v5.3.5 (https://getbootstrap.com/)
3
+ * Copyright 2011-2025 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' ? factory(exports) :
8
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Sanitizer = {}));
10
+ })(this, (function (exports) { 'use strict';
11
+
12
+ /**
13
+ * --------------------------------------------------------------------------
14
+ * Bootstrap util/sanitizer.js
15
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
+ * --------------------------------------------------------------------------
17
+ */
18
+
19
+ // js-docs-start allow-list
20
+ const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
21
+ const DefaultAllowlist = {
22
+ // Global attributes allowed on any supplied element below.
23
+ '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
24
+ a: ['target', 'href', 'title', 'rel'],
25
+ area: [],
26
+ b: [],
27
+ br: [],
28
+ col: [],
29
+ code: [],
30
+ dd: [],
31
+ div: [],
32
+ dl: [],
33
+ dt: [],
34
+ em: [],
35
+ hr: [],
36
+ h1: [],
37
+ h2: [],
38
+ h3: [],
39
+ h4: [],
40
+ h5: [],
41
+ h6: [],
42
+ i: [],
43
+ img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
44
+ li: [],
45
+ ol: [],
46
+ p: [],
47
+ pre: [],
48
+ s: [],
49
+ small: [],
50
+ span: [],
51
+ sub: [],
52
+ sup: [],
53
+ strong: [],
54
+ u: [],
55
+ ul: []
56
+ };
57
+ // js-docs-end allow-list
58
+
59
+ const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
60
+
61
+ /**
62
+ * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation
63
+ * contexts.
64
+ *
65
+ * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38
66
+ */
67
+ // eslint-disable-next-line unicorn/better-regex
68
+ const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;
69
+ const allowedAttribute = (attribute, allowedAttributeList) => {
70
+ const attributeName = attribute.nodeName.toLowerCase();
71
+ if (allowedAttributeList.includes(attributeName)) {
72
+ if (uriAttributes.has(attributeName)) {
73
+ return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));
74
+ }
75
+ return true;
76
+ }
77
+
78
+ // Check if a regular expression validates the attribute.
79
+ return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));
80
+ };
81
+ function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
82
+ if (!unsafeHtml.length) {
83
+ return unsafeHtml;
84
+ }
85
+ if (sanitizeFunction && typeof sanitizeFunction === 'function') {
86
+ return sanitizeFunction(unsafeHtml);
87
+ }
88
+ const domParser = new window.DOMParser();
89
+ const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
90
+ const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
91
+ for (const element of elements) {
92
+ const elementName = element.nodeName.toLowerCase();
93
+ if (!Object.keys(allowList).includes(elementName)) {
94
+ element.remove();
95
+ continue;
96
+ }
97
+ const attributeList = [].concat(...element.attributes);
98
+ const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);
99
+ for (const attribute of attributeList) {
100
+ if (!allowedAttribute(attribute, allowedAttributes)) {
101
+ element.removeAttribute(attribute.nodeName);
102
+ }
103
+ }
104
+ }
105
+ return createdDocument.body.innerHTML;
106
+ }
107
+
108
+ exports.DefaultAllowlist = DefaultAllowlist;
109
+ exports.sanitizeHtml = sanitizeHtml;
110
+
111
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
112
+
113
+ }));
@@ -0,0 +1,112 @@
1
+ /*!
2
+ * Bootstrap scrollbar.js v5.3.5 (https://getbootstrap.com/)
3
+ * Copyright 2011-2025 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(require('../dom/manipulator.js'), require('../dom/selector-engine.js'), require('./index.js')) :
8
+ typeof define === 'function' && define.amd ? define(['../dom/manipulator', '../dom/selector-engine', './index'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Scrollbar = factory(global.Manipulator, global.SelectorEngine, global.Index));
10
+ })(this, (function (Manipulator, SelectorEngine, index_js) { 'use strict';
11
+
12
+ /**
13
+ * --------------------------------------------------------------------------
14
+ * Bootstrap util/scrollBar.js
15
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
+ * --------------------------------------------------------------------------
17
+ */
18
+
19
+
20
+ /**
21
+ * Constants
22
+ */
23
+
24
+ const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
25
+ const SELECTOR_STICKY_CONTENT = '.sticky-top';
26
+ const PROPERTY_PADDING = 'padding-right';
27
+ const PROPERTY_MARGIN = 'margin-right';
28
+
29
+ /**
30
+ * Class definition
31
+ */
32
+
33
+ class ScrollBarHelper {
34
+ constructor() {
35
+ this._element = document.body;
36
+ }
37
+
38
+ // Public
39
+ getWidth() {
40
+ // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
41
+ const documentWidth = document.documentElement.clientWidth;
42
+ return Math.abs(window.innerWidth - documentWidth);
43
+ }
44
+ hide() {
45
+ const width = this.getWidth();
46
+ this._disableOverFlow();
47
+ // give padding to element to balance the hidden scrollbar width
48
+ this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
49
+ // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
50
+ this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
51
+ this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);
52
+ }
53
+ reset() {
54
+ this._resetElementAttributes(this._element, 'overflow');
55
+ this._resetElementAttributes(this._element, PROPERTY_PADDING);
56
+ this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);
57
+ this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);
58
+ }
59
+ isOverflowing() {
60
+ return this.getWidth() > 0;
61
+ }
62
+
63
+ // Private
64
+ _disableOverFlow() {
65
+ this._saveInitialAttribute(this._element, 'overflow');
66
+ this._element.style.overflow = 'hidden';
67
+ }
68
+ _setElementAttributes(selector, styleProperty, callback) {
69
+ const scrollbarWidth = this.getWidth();
70
+ const manipulationCallBack = element => {
71
+ if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
72
+ return;
73
+ }
74
+ this._saveInitialAttribute(element, styleProperty);
75
+ const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);
76
+ element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);
77
+ };
78
+ this._applyManipulationCallback(selector, manipulationCallBack);
79
+ }
80
+ _saveInitialAttribute(element, styleProperty) {
81
+ const actualValue = element.style.getPropertyValue(styleProperty);
82
+ if (actualValue) {
83
+ Manipulator.setDataAttribute(element, styleProperty, actualValue);
84
+ }
85
+ }
86
+ _resetElementAttributes(selector, styleProperty) {
87
+ const manipulationCallBack = element => {
88
+ const value = Manipulator.getDataAttribute(element, styleProperty);
89
+ // We only want to remove the property if the value is `null`; the value can also be zero
90
+ if (value === null) {
91
+ element.style.removeProperty(styleProperty);
92
+ return;
93
+ }
94
+ Manipulator.removeDataAttribute(element, styleProperty);
95
+ element.style.setProperty(styleProperty, value);
96
+ };
97
+ this._applyManipulationCallback(selector, manipulationCallBack);
98
+ }
99
+ _applyManipulationCallback(selector, callBack) {
100
+ if (index_js.isElement(selector)) {
101
+ callBack(selector);
102
+ return;
103
+ }
104
+ for (const sel of SelectorEngine.find(selector, this._element)) {
105
+ callBack(sel);
106
+ }
107
+ }
108
+ }
109
+
110
+ return ScrollBarHelper;
111
+
112
+ }));
@@ -0,0 +1,134 @@
1
+ /*!
2
+ * Bootstrap swipe.js v5.3.5 (https://getbootstrap.com/)
3
+ * Copyright 2011-2025 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(require('../dom/event-handler.js'), require('./config.js'), require('./index.js')) :
8
+ typeof define === 'function' && define.amd ? define(['../dom/event-handler', './config', './index'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Swipe = factory(global.EventHandler, global.Config, global.Index));
10
+ })(this, (function (EventHandler, Config, index_js) { 'use strict';
11
+
12
+ /**
13
+ * --------------------------------------------------------------------------
14
+ * Bootstrap util/swipe.js
15
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
+ * --------------------------------------------------------------------------
17
+ */
18
+
19
+
20
+ /**
21
+ * Constants
22
+ */
23
+
24
+ const NAME = 'swipe';
25
+ const EVENT_KEY = '.bs.swipe';
26
+ const EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`;
27
+ const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`;
28
+ const EVENT_TOUCHEND = `touchend${EVENT_KEY}`;
29
+ const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`;
30
+ const EVENT_POINTERUP = `pointerup${EVENT_KEY}`;
31
+ const POINTER_TYPE_TOUCH = 'touch';
32
+ const POINTER_TYPE_PEN = 'pen';
33
+ const CLASS_NAME_POINTER_EVENT = 'pointer-event';
34
+ const SWIPE_THRESHOLD = 40;
35
+ const Default = {
36
+ endCallback: null,
37
+ leftCallback: null,
38
+ rightCallback: null
39
+ };
40
+ const DefaultType = {
41
+ endCallback: '(function|null)',
42
+ leftCallback: '(function|null)',
43
+ rightCallback: '(function|null)'
44
+ };
45
+
46
+ /**
47
+ * Class definition
48
+ */
49
+
50
+ class Swipe extends Config {
51
+ constructor(element, config) {
52
+ super();
53
+ this._element = element;
54
+ if (!element || !Swipe.isSupported()) {
55
+ return;
56
+ }
57
+ this._config = this._getConfig(config);
58
+ this._deltaX = 0;
59
+ this._supportPointerEvents = Boolean(window.PointerEvent);
60
+ this._initEvents();
61
+ }
62
+
63
+ // Getters
64
+ static get Default() {
65
+ return Default;
66
+ }
67
+ static get DefaultType() {
68
+ return DefaultType;
69
+ }
70
+ static get NAME() {
71
+ return NAME;
72
+ }
73
+
74
+ // Public
75
+ dispose() {
76
+ EventHandler.off(this._element, EVENT_KEY);
77
+ }
78
+
79
+ // Private
80
+ _start(event) {
81
+ if (!this._supportPointerEvents) {
82
+ this._deltaX = event.touches[0].clientX;
83
+ return;
84
+ }
85
+ if (this._eventIsPointerPenTouch(event)) {
86
+ this._deltaX = event.clientX;
87
+ }
88
+ }
89
+ _end(event) {
90
+ if (this._eventIsPointerPenTouch(event)) {
91
+ this._deltaX = event.clientX - this._deltaX;
92
+ }
93
+ this._handleSwipe();
94
+ index_js.execute(this._config.endCallback);
95
+ }
96
+ _move(event) {
97
+ this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;
98
+ }
99
+ _handleSwipe() {
100
+ const absDeltaX = Math.abs(this._deltaX);
101
+ if (absDeltaX <= SWIPE_THRESHOLD) {
102
+ return;
103
+ }
104
+ const direction = absDeltaX / this._deltaX;
105
+ this._deltaX = 0;
106
+ if (!direction) {
107
+ return;
108
+ }
109
+ index_js.execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);
110
+ }
111
+ _initEvents() {
112
+ if (this._supportPointerEvents) {
113
+ EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));
114
+ EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));
115
+ this._element.classList.add(CLASS_NAME_POINTER_EVENT);
116
+ } else {
117
+ EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));
118
+ EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));
119
+ EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));
120
+ }
121
+ }
122
+ _eventIsPointerPenTouch(event) {
123
+ return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);
124
+ }
125
+
126
+ // Static
127
+ static isSupported() {
128
+ return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
129
+ }
130
+ }
131
+
132
+ return Swipe;
133
+
134
+ }));
@@ -0,0 +1,150 @@
1
+ /*!
2
+ * Bootstrap template-factory.js v5.3.5 (https://getbootstrap.com/)
3
+ * Copyright 2011-2025 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(require('../dom/selector-engine.js'), require('./config.js'), require('./sanitizer.js'), require('./index.js')) :
8
+ typeof define === 'function' && define.amd ? define(['../dom/selector-engine', './config', './sanitizer', './index'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.TemplateFactory = factory(global.SelectorEngine, global.Config, global.Sanitizer, global.Index));
10
+ })(this, (function (SelectorEngine, Config, sanitizer_js, index_js) { 'use strict';
11
+
12
+ /**
13
+ * --------------------------------------------------------------------------
14
+ * Bootstrap util/template-factory.js
15
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
+ * --------------------------------------------------------------------------
17
+ */
18
+
19
+
20
+ /**
21
+ * Constants
22
+ */
23
+
24
+ const NAME = 'TemplateFactory';
25
+ const Default = {
26
+ allowList: sanitizer_js.DefaultAllowlist,
27
+ content: {},
28
+ // { selector : text , selector2 : text2 , }
29
+ extraClass: '',
30
+ html: false,
31
+ sanitize: true,
32
+ sanitizeFn: null,
33
+ template: '<div></div>'
34
+ };
35
+ const DefaultType = {
36
+ allowList: 'object',
37
+ content: 'object',
38
+ extraClass: '(string|function)',
39
+ html: 'boolean',
40
+ sanitize: 'boolean',
41
+ sanitizeFn: '(null|function)',
42
+ template: 'string'
43
+ };
44
+ const DefaultContentType = {
45
+ entry: '(string|element|function|null)',
46
+ selector: '(string|element)'
47
+ };
48
+
49
+ /**
50
+ * Class definition
51
+ */
52
+
53
+ class TemplateFactory extends Config {
54
+ constructor(config) {
55
+ super();
56
+ this._config = this._getConfig(config);
57
+ }
58
+
59
+ // Getters
60
+ static get Default() {
61
+ return Default;
62
+ }
63
+ static get DefaultType() {
64
+ return DefaultType;
65
+ }
66
+ static get NAME() {
67
+ return NAME;
68
+ }
69
+
70
+ // Public
71
+ getContent() {
72
+ return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);
73
+ }
74
+ hasContent() {
75
+ return this.getContent().length > 0;
76
+ }
77
+ changeContent(content) {
78
+ this._checkContent(content);
79
+ this._config.content = {
80
+ ...this._config.content,
81
+ ...content
82
+ };
83
+ return this;
84
+ }
85
+ toHtml() {
86
+ const templateWrapper = document.createElement('div');
87
+ templateWrapper.innerHTML = this._maybeSanitize(this._config.template);
88
+ for (const [selector, text] of Object.entries(this._config.content)) {
89
+ this._setContent(templateWrapper, text, selector);
90
+ }
91
+ const template = templateWrapper.children[0];
92
+ const extraClass = this._resolvePossibleFunction(this._config.extraClass);
93
+ if (extraClass) {
94
+ template.classList.add(...extraClass.split(' '));
95
+ }
96
+ return template;
97
+ }
98
+
99
+ // Private
100
+ _typeCheckConfig(config) {
101
+ super._typeCheckConfig(config);
102
+ this._checkContent(config.content);
103
+ }
104
+ _checkContent(arg) {
105
+ for (const [selector, content] of Object.entries(arg)) {
106
+ super._typeCheckConfig({
107
+ selector,
108
+ entry: content
109
+ }, DefaultContentType);
110
+ }
111
+ }
112
+ _setContent(template, content, selector) {
113
+ const templateElement = SelectorEngine.findOne(selector, template);
114
+ if (!templateElement) {
115
+ return;
116
+ }
117
+ content = this._resolvePossibleFunction(content);
118
+ if (!content) {
119
+ templateElement.remove();
120
+ return;
121
+ }
122
+ if (index_js.isElement(content)) {
123
+ this._putElementInTemplate(index_js.getElement(content), templateElement);
124
+ return;
125
+ }
126
+ if (this._config.html) {
127
+ templateElement.innerHTML = this._maybeSanitize(content);
128
+ return;
129
+ }
130
+ templateElement.textContent = content;
131
+ }
132
+ _maybeSanitize(arg) {
133
+ return this._config.sanitize ? sanitizer_js.sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;
134
+ }
135
+ _resolvePossibleFunction(arg) {
136
+ return index_js.execute(arg, [undefined, this]);
137
+ }
138
+ _putElementInTemplate(element, templateElement) {
139
+ if (this._config.html) {
140
+ templateElement.innerHTML = '';
141
+ templateElement.append(element);
142
+ return;
143
+ }
144
+ templateElement.textContent = element.textContent;
145
+ }
146
+ }
147
+
148
+ return TemplateFactory;
149
+
150
+ }));
@@ -1,6 +1,6 @@
1
1
  // Set a `globalThis` so that bootstrap components are defined on window.bootstrap instead of window.
2
2
  window['bootstrap'] = {
3
- Popper: window.Popper,
3
+ "@popperjs/core": window.Popper,
4
4
  _originalGlobalThis: window['globalThis']
5
5
  };
6
6
  window['globalThis'] = window['bootstrap'];
@@ -1,19 +1,28 @@
1
1
  //= require ./bootstrap-global-this-define
2
2
  //= require ./bootstrap/dom/data
3
+ //= require ./bootstrap/util/index
3
4
  //= require ./bootstrap/dom/event-handler
5
+ //= require ./bootstrap/dom/manipulator
6
+ //= require ./bootstrap/util/config
4
7
  //= require ./bootstrap/base-component
5
- //= require ./bootstrap/alert
6
8
  //= require ./bootstrap/button
7
- //= require ./bootstrap/dom/manipulator
8
9
  //= require ./bootstrap/dom/selector-engine
10
+ //= require ./bootstrap/scrollspy
11
+ //= require ./bootstrap/util/scrollbar
12
+ //= require ./bootstrap/util/sanitizer
13
+ //= require ./bootstrap/util/swipe
9
14
  //= require ./bootstrap/carousel
10
15
  //= require ./bootstrap/collapse
11
- //= require ./bootstrap/dropdown
16
+ //= require ./bootstrap/util/backdrop
17
+ //= require ./bootstrap/util/component-functions
18
+ //= require ./bootstrap/util/focustrap
12
19
  //= require ./bootstrap/modal
13
- //= require ./bootstrap/offcanvas
20
+ //= require ./bootstrap/alert
21
+ //= require ./bootstrap/util/template-factory
14
22
  //= require ./bootstrap/tooltip
15
23
  //= require ./bootstrap/popover
16
- //= require ./bootstrap/scrollspy
17
- //= require ./bootstrap/tab
24
+ //= require ./bootstrap/offcanvas
18
25
  //= require ./bootstrap/toast
26
+ //= require ./bootstrap/dropdown
27
+ //= require ./bootstrap/tab
19
28
  //= require ./bootstrap-global-this-undefine