bootstrap-propshaft 5.3.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 (185) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +14 -0
  3. data/.github/workflows/ci.yml +61 -0
  4. data/.gitignore +19 -0
  5. data/CHANGELOG.md +25 -0
  6. data/Gemfile +12 -0
  7. data/LICENSE +21 -0
  8. data/README.md +138 -0
  9. data/Rakefile +89 -0
  10. data/assets/javascripts/bootstrap/alert.js +89 -0
  11. data/assets/javascripts/bootstrap/base-component.js +83 -0
  12. data/assets/javascripts/bootstrap/button.js +78 -0
  13. data/assets/javascripts/bootstrap/carousel.js +387 -0
  14. data/assets/javascripts/bootstrap/collapse.js +248 -0
  15. data/assets/javascripts/bootstrap/dom/data.js +62 -0
  16. data/assets/javascripts/bootstrap/dom/event-handler.js +236 -0
  17. data/assets/javascripts/bootstrap/dom/manipulator.js +71 -0
  18. data/assets/javascripts/bootstrap/dom/selector-engine.js +103 -0
  19. data/assets/javascripts/bootstrap/dropdown.js +401 -0
  20. data/assets/javascripts/bootstrap/modal.js +319 -0
  21. data/assets/javascripts/bootstrap/offcanvas.js +245 -0
  22. data/assets/javascripts/bootstrap/popover.js +95 -0
  23. data/assets/javascripts/bootstrap/scrollspy.js +274 -0
  24. data/assets/javascripts/bootstrap/tab.js +284 -0
  25. data/assets/javascripts/bootstrap/toast.js +198 -0
  26. data/assets/javascripts/bootstrap/tooltip.js +545 -0
  27. data/assets/javascripts/bootstrap/util/backdrop.js +139 -0
  28. data/assets/javascripts/bootstrap/util/component-functions.js +41 -0
  29. data/assets/javascripts/bootstrap/util/config.js +67 -0
  30. data/assets/javascripts/bootstrap/util/focustrap.js +113 -0
  31. data/assets/javascripts/bootstrap/util/index.js +281 -0
  32. data/assets/javascripts/bootstrap/util/sanitizer.js +110 -0
  33. data/assets/javascripts/bootstrap/util/scrollbar.js +112 -0
  34. data/assets/javascripts/bootstrap/util/swipe.js +134 -0
  35. data/assets/javascripts/bootstrap/util/template-factory.js +150 -0
  36. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  37. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  38. data/assets/javascripts/bootstrap-sprockets.js +28 -0
  39. data/assets/javascripts/bootstrap.js +4493 -0
  40. data/assets/javascripts/bootstrap.min.js +6 -0
  41. data/assets/stylesheets/_bootstrap-grid.scss +62 -0
  42. data/assets/stylesheets/_bootstrap-reboot.scss +10 -0
  43. data/assets/stylesheets/_bootstrap-utilities.scss +19 -0
  44. data/assets/stylesheets/_bootstrap.scss +52 -0
  45. data/assets/stylesheets/bootstrap/_accordion.scss +158 -0
  46. data/assets/stylesheets/bootstrap/_alert.scss +68 -0
  47. data/assets/stylesheets/bootstrap/_badge.scss +38 -0
  48. data/assets/stylesheets/bootstrap/_breadcrumb.scss +40 -0
  49. data/assets/stylesheets/bootstrap/_button-group.scss +142 -0
  50. data/assets/stylesheets/bootstrap/_buttons.scss +207 -0
  51. data/assets/stylesheets/bootstrap/_card.scss +239 -0
  52. data/assets/stylesheets/bootstrap/_carousel.scss +244 -0
  53. data/assets/stylesheets/bootstrap/_close.scss +63 -0
  54. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  55. data/assets/stylesheets/bootstrap/_dropdown.scss +250 -0
  56. data/assets/stylesheets/bootstrap/_forms.scss +9 -0
  57. data/assets/stylesheets/bootstrap/_functions.scss +302 -0
  58. data/assets/stylesheets/bootstrap/_grid.scss +39 -0
  59. data/assets/stylesheets/bootstrap/_helpers.scss +12 -0
  60. data/assets/stylesheets/bootstrap/_images.scss +42 -0
  61. data/assets/stylesheets/bootstrap/_list-group.scss +197 -0
  62. data/assets/stylesheets/bootstrap/_maps.scss +174 -0
  63. data/assets/stylesheets/bootstrap/_mixins.scss +42 -0
  64. data/assets/stylesheets/bootstrap/_modal.scss +237 -0
  65. data/assets/stylesheets/bootstrap/_nav.scss +197 -0
  66. data/assets/stylesheets/bootstrap/_navbar.scss +289 -0
  67. data/assets/stylesheets/bootstrap/_offcanvas.scss +146 -0
  68. data/assets/stylesheets/bootstrap/_pagination.scss +109 -0
  69. data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
  70. data/assets/stylesheets/bootstrap/_popover.scss +196 -0
  71. data/assets/stylesheets/bootstrap/_progress.scss +68 -0
  72. data/assets/stylesheets/bootstrap/_reboot.scss +611 -0
  73. data/assets/stylesheets/bootstrap/_root.scss +187 -0
  74. data/assets/stylesheets/bootstrap/_spinners.scss +85 -0
  75. data/assets/stylesheets/bootstrap/_tables.scss +171 -0
  76. data/assets/stylesheets/bootstrap/_toasts.scss +73 -0
  77. data/assets/stylesheets/bootstrap/_tooltip.scss +119 -0
  78. data/assets/stylesheets/bootstrap/_transitions.scss +27 -0
  79. data/assets/stylesheets/bootstrap/_type.scss +106 -0
  80. data/assets/stylesheets/bootstrap/_utilities.scss +806 -0
  81. data/assets/stylesheets/bootstrap/_variables-dark.scss +87 -0
  82. data/assets/stylesheets/bootstrap/_variables.scss +1747 -0
  83. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +95 -0
  84. data/assets/stylesheets/bootstrap/forms/_form-check.scss +189 -0
  85. data/assets/stylesheets/bootstrap/forms/_form-control.scss +214 -0
  86. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  87. data/assets/stylesheets/bootstrap/forms/_form-select.scss +80 -0
  88. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  89. data/assets/stylesheets/bootstrap/forms/_input-group.scss +132 -0
  90. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  91. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  92. data/assets/stylesheets/bootstrap/helpers/_clearfix.scss +3 -0
  93. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +7 -0
  94. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +30 -0
  95. data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
  96. data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
  97. data/assets/stylesheets/bootstrap/helpers/_position.scss +36 -0
  98. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  99. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  100. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  101. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  102. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  103. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  104. data/assets/stylesheets/bootstrap/mixins/_alert.scss +18 -0
  105. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  106. data/assets/stylesheets/bootstrap/mixins/_banner.scss +7 -0
  107. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +78 -0
  108. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +18 -0
  109. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +127 -0
  110. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +70 -0
  111. data/assets/stylesheets/bootstrap/mixins/_caret.scss +69 -0
  112. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +9 -0
  113. data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
  114. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  115. data/assets/stylesheets/bootstrap/mixins/_container.scss +11 -0
  116. data/assets/stylesheets/bootstrap/mixins/_deprecate.scss +10 -0
  117. data/assets/stylesheets/bootstrap/mixins/_forms.scss +153 -0
  118. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +47 -0
  119. data/assets/stylesheets/bootstrap/mixins/_grid.scss +151 -0
  120. data/assets/stylesheets/bootstrap/mixins/_image.scss +16 -0
  121. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +26 -0
  122. data/assets/stylesheets/bootstrap/mixins/_lists.scss +7 -0
  123. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +10 -0
  124. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +17 -0
  125. data/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
  126. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +24 -0
  127. data/assets/stylesheets/bootstrap/mixins/_text-truncate.scss +8 -0
  128. data/assets/stylesheets/bootstrap/mixins/_transition.scss +26 -0
  129. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +97 -0
  130. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +33 -0
  131. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  132. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +348 -0
  133. data/bootstrap.gemspec +39 -0
  134. data/lib/bootstrap/engine.rb +22 -0
  135. data/lib/bootstrap/version.rb +6 -0
  136. data/lib/bootstrap.rb +75 -0
  137. data/tasks/updater/js.rb +92 -0
  138. data/tasks/updater/logger.rb +57 -0
  139. data/tasks/updater/network.rb +109 -0
  140. data/tasks/updater/scss.rb +26 -0
  141. data/tasks/updater.rb +67 -0
  142. data/test/dummy_rails/README.rdoc +3 -0
  143. data/test/dummy_rails/Rakefile +6 -0
  144. data/test/dummy_rails/app/assets/config/manifest.js +3 -0
  145. data/test/dummy_rails/app/assets/images/.keep +0 -0
  146. data/test/dummy_rails/app/assets/javascripts/application.js +8 -0
  147. data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
  148. data/test/dummy_rails/app/assets/stylesheets/application.sass +4 -0
  149. data/test/dummy_rails/app/controllers/application_controller.rb +5 -0
  150. data/test/dummy_rails/app/controllers/pages_controller.rb +4 -0
  151. data/test/dummy_rails/app/helpers/application_helper.rb +2 -0
  152. data/test/dummy_rails/app/views/layouts/application.html.erb +16 -0
  153. data/test/dummy_rails/app/views/pages/root.html +89 -0
  154. data/test/dummy_rails/config/application.rb +32 -0
  155. data/test/dummy_rails/config/boot.rb +5 -0
  156. data/test/dummy_rails/config/environment.rb +5 -0
  157. data/test/dummy_rails/config/environments/development.rb +23 -0
  158. data/test/dummy_rails/config/environments/production.rb +82 -0
  159. data/test/dummy_rails/config/environments/test.rb +38 -0
  160. data/test/dummy_rails/config/initializers/backtrace_silencers.rb +7 -0
  161. data/test/dummy_rails/config/initializers/filter_parameter_logging.rb +4 -0
  162. data/test/dummy_rails/config/initializers/inflections.rb +16 -0
  163. data/test/dummy_rails/config/initializers/mime_types.rb +5 -0
  164. data/test/dummy_rails/config/initializers/secret_token.rb +18 -0
  165. data/test/dummy_rails/config/initializers/session_store.rb +3 -0
  166. data/test/dummy_rails/config/initializers/wrap_parameters.rb +14 -0
  167. data/test/dummy_rails/config/locales/en.yml +3 -0
  168. data/test/dummy_rails/config/locales/es.yml +3 -0
  169. data/test/dummy_rails/config/routes.rb +3 -0
  170. data/test/dummy_rails/config.ru +4 -0
  171. data/test/dummy_rails/log/.keep +0 -0
  172. data/test/gemfiles/rails_4_2.gemfile +7 -0
  173. data/test/gemfiles/rails_5_0.gemfile +8 -0
  174. data/test/gemfiles/rails_5_1.gemfile +8 -0
  175. data/test/gemfiles/rails_5_2.gemfile +8 -0
  176. data/test/gemfiles/rails_6_0.gemfile +8 -0
  177. data/test/gemfiles/rails_6_1.gemfile +8 -0
  178. data/test/gemfiles/rails_7_0_dartsass.gemfile +8 -0
  179. data/test/gemfiles/rails_7_0_sassc.gemfile +8 -0
  180. data/test/rails_test.rb +24 -0
  181. data/test/support/dummy_rails_integration.rb +31 -0
  182. data/test/support/reporting.rb +27 -0
  183. data/test/test_helper.rb +42 -0
  184. data/test/test_helper_rails.rb +6 -0
  185. metadata +471 -0
@@ -0,0 +1,319 @@
1
+ /*!
2
+ * Bootstrap modal.js v5.3.2 (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(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/backdrop.js'), require('./util/component-functions.js'), require('./util/focustrap.js'), require('./util/index.js'), require('./util/scrollbar.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/selector-engine', './util/backdrop', './util/component-functions', './util/focustrap', './util/index', './util/scrollbar'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Backdrop, global.ComponentFunctions, global.Focustrap, global.Index, global.Scrollbar));
10
+ })(this, (function (BaseComponent, EventHandler, SelectorEngine, Backdrop, componentFunctions_js, FocusTrap, index_js, ScrollBarHelper) { 'use strict';
11
+
12
+ /**
13
+ * --------------------------------------------------------------------------
14
+ * Bootstrap modal.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 = 'modal';
25
+ const DATA_KEY = 'bs.modal';
26
+ const EVENT_KEY = `.${DATA_KEY}`;
27
+ const DATA_API_KEY = '.data-api';
28
+ const ESCAPE_KEY = 'Escape';
29
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
30
+ const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;
31
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
32
+ const EVENT_SHOW = `show${EVENT_KEY}`;
33
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
34
+ const EVENT_RESIZE = `resize${EVENT_KEY}`;
35
+ const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
36
+ const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`;
37
+ const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
38
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
39
+ const CLASS_NAME_OPEN = 'modal-open';
40
+ const CLASS_NAME_FADE = 'fade';
41
+ const CLASS_NAME_SHOW = 'show';
42
+ const CLASS_NAME_STATIC = 'modal-static';
43
+ const OPEN_SELECTOR = '.modal.show';
44
+ const SELECTOR_DIALOG = '.modal-dialog';
45
+ const SELECTOR_MODAL_BODY = '.modal-body';
46
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]';
47
+ const Default = {
48
+ backdrop: true,
49
+ focus: true,
50
+ keyboard: true
51
+ };
52
+ const DefaultType = {
53
+ backdrop: '(boolean|string)',
54
+ focus: 'boolean',
55
+ keyboard: 'boolean'
56
+ };
57
+
58
+ /**
59
+ * Class definition
60
+ */
61
+
62
+ class Modal extends BaseComponent {
63
+ constructor(element, config) {
64
+ super(element, config);
65
+ this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
66
+ this._backdrop = this._initializeBackDrop();
67
+ this._focustrap = this._initializeFocusTrap();
68
+ this._isShown = false;
69
+ this._isTransitioning = false;
70
+ this._scrollBar = new ScrollBarHelper();
71
+ this._addEventListeners();
72
+ }
73
+
74
+ // Getters
75
+ static get Default() {
76
+ return Default;
77
+ }
78
+ static get DefaultType() {
79
+ return DefaultType;
80
+ }
81
+ static get NAME() {
82
+ return NAME;
83
+ }
84
+
85
+ // Public
86
+ toggle(relatedTarget) {
87
+ return this._isShown ? this.hide() : this.show(relatedTarget);
88
+ }
89
+ show(relatedTarget) {
90
+ if (this._isShown || this._isTransitioning) {
91
+ return;
92
+ }
93
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {
94
+ relatedTarget
95
+ });
96
+ if (showEvent.defaultPrevented) {
97
+ return;
98
+ }
99
+ this._isShown = true;
100
+ this._isTransitioning = true;
101
+ this._scrollBar.hide();
102
+ document.body.classList.add(CLASS_NAME_OPEN);
103
+ this._adjustDialog();
104
+ this._backdrop.show(() => this._showElement(relatedTarget));
105
+ }
106
+ hide() {
107
+ if (!this._isShown || this._isTransitioning) {
108
+ return;
109
+ }
110
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
111
+ if (hideEvent.defaultPrevented) {
112
+ return;
113
+ }
114
+ this._isShown = false;
115
+ this._isTransitioning = true;
116
+ this._focustrap.deactivate();
117
+ this._element.classList.remove(CLASS_NAME_SHOW);
118
+ this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
119
+ }
120
+ dispose() {
121
+ EventHandler.off(window, EVENT_KEY);
122
+ EventHandler.off(this._dialog, EVENT_KEY);
123
+ this._backdrop.dispose();
124
+ this._focustrap.deactivate();
125
+ super.dispose();
126
+ }
127
+ handleUpdate() {
128
+ this._adjustDialog();
129
+ }
130
+
131
+ // Private
132
+ _initializeBackDrop() {
133
+ return new Backdrop({
134
+ isVisible: Boolean(this._config.backdrop),
135
+ // 'static' option will be translated to true, and booleans will keep their value,
136
+ isAnimated: this._isAnimated()
137
+ });
138
+ }
139
+ _initializeFocusTrap() {
140
+ return new FocusTrap({
141
+ trapElement: this._element
142
+ });
143
+ }
144
+ _showElement(relatedTarget) {
145
+ // try to append dynamic modal
146
+ if (!document.body.contains(this._element)) {
147
+ document.body.append(this._element);
148
+ }
149
+ this._element.style.display = 'block';
150
+ this._element.removeAttribute('aria-hidden');
151
+ this._element.setAttribute('aria-modal', true);
152
+ this._element.setAttribute('role', 'dialog');
153
+ this._element.scrollTop = 0;
154
+ const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
155
+ if (modalBody) {
156
+ modalBody.scrollTop = 0;
157
+ }
158
+ index_js.reflow(this._element);
159
+ this._element.classList.add(CLASS_NAME_SHOW);
160
+ const transitionComplete = () => {
161
+ if (this._config.focus) {
162
+ this._focustrap.activate();
163
+ }
164
+ this._isTransitioning = false;
165
+ EventHandler.trigger(this._element, EVENT_SHOWN, {
166
+ relatedTarget
167
+ });
168
+ };
169
+ this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
170
+ }
171
+ _addEventListeners() {
172
+ EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
173
+ if (event.key !== ESCAPE_KEY) {
174
+ return;
175
+ }
176
+ if (this._config.keyboard) {
177
+ this.hide();
178
+ return;
179
+ }
180
+ this._triggerBackdropTransition();
181
+ });
182
+ EventHandler.on(window, EVENT_RESIZE, () => {
183
+ if (this._isShown && !this._isTransitioning) {
184
+ this._adjustDialog();
185
+ }
186
+ });
187
+ EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {
188
+ // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks
189
+ EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {
190
+ if (this._element !== event.target || this._element !== event2.target) {
191
+ return;
192
+ }
193
+ if (this._config.backdrop === 'static') {
194
+ this._triggerBackdropTransition();
195
+ return;
196
+ }
197
+ if (this._config.backdrop) {
198
+ this.hide();
199
+ }
200
+ });
201
+ });
202
+ }
203
+ _hideModal() {
204
+ this._element.style.display = 'none';
205
+ this._element.setAttribute('aria-hidden', true);
206
+ this._element.removeAttribute('aria-modal');
207
+ this._element.removeAttribute('role');
208
+ this._isTransitioning = false;
209
+ this._backdrop.hide(() => {
210
+ document.body.classList.remove(CLASS_NAME_OPEN);
211
+ this._resetAdjustments();
212
+ this._scrollBar.reset();
213
+ EventHandler.trigger(this._element, EVENT_HIDDEN);
214
+ });
215
+ }
216
+ _isAnimated() {
217
+ return this._element.classList.contains(CLASS_NAME_FADE);
218
+ }
219
+ _triggerBackdropTransition() {
220
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
221
+ if (hideEvent.defaultPrevented) {
222
+ return;
223
+ }
224
+ const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
225
+ const initialOverflowY = this._element.style.overflowY;
226
+ // return if the following background transition hasn't yet completed
227
+ if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {
228
+ return;
229
+ }
230
+ if (!isModalOverflowing) {
231
+ this._element.style.overflowY = 'hidden';
232
+ }
233
+ this._element.classList.add(CLASS_NAME_STATIC);
234
+ this._queueCallback(() => {
235
+ this._element.classList.remove(CLASS_NAME_STATIC);
236
+ this._queueCallback(() => {
237
+ this._element.style.overflowY = initialOverflowY;
238
+ }, this._dialog);
239
+ }, this._dialog);
240
+ this._element.focus();
241
+ }
242
+
243
+ /**
244
+ * The following methods are used to handle overflowing modals
245
+ */
246
+
247
+ _adjustDialog() {
248
+ const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
249
+ const scrollbarWidth = this._scrollBar.getWidth();
250
+ const isBodyOverflowing = scrollbarWidth > 0;
251
+ if (isBodyOverflowing && !isModalOverflowing) {
252
+ const property = index_js.isRTL() ? 'paddingLeft' : 'paddingRight';
253
+ this._element.style[property] = `${scrollbarWidth}px`;
254
+ }
255
+ if (!isBodyOverflowing && isModalOverflowing) {
256
+ const property = index_js.isRTL() ? 'paddingRight' : 'paddingLeft';
257
+ this._element.style[property] = `${scrollbarWidth}px`;
258
+ }
259
+ }
260
+ _resetAdjustments() {
261
+ this._element.style.paddingLeft = '';
262
+ this._element.style.paddingRight = '';
263
+ }
264
+
265
+ // Static
266
+ static jQueryInterface(config, relatedTarget) {
267
+ return this.each(function () {
268
+ const data = Modal.getOrCreateInstance(this, config);
269
+ if (typeof config !== 'string') {
270
+ return;
271
+ }
272
+ if (typeof data[config] === 'undefined') {
273
+ throw new TypeError(`No method named "${config}"`);
274
+ }
275
+ data[config](relatedTarget);
276
+ });
277
+ }
278
+ }
279
+
280
+ /**
281
+ * Data API implementation
282
+ */
283
+
284
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
285
+ const target = SelectorEngine.getElementFromSelector(this);
286
+ if (['A', 'AREA'].includes(this.tagName)) {
287
+ event.preventDefault();
288
+ }
289
+ EventHandler.one(target, EVENT_SHOW, showEvent => {
290
+ if (showEvent.defaultPrevented) {
291
+ // only register focus restorer if modal will actually get shown
292
+ return;
293
+ }
294
+ EventHandler.one(target, EVENT_HIDDEN, () => {
295
+ if (index_js.isVisible(this)) {
296
+ this.focus();
297
+ }
298
+ });
299
+ });
300
+
301
+ // avoid conflict when clicking modal toggler while another one is open
302
+ const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
303
+ if (alreadyOpen) {
304
+ Modal.getInstance(alreadyOpen).hide();
305
+ }
306
+ const data = Modal.getOrCreateInstance(target);
307
+ data.toggle(this);
308
+ });
309
+ componentFunctions_js.enableDismissTrigger(Modal);
310
+
311
+ /**
312
+ * jQuery
313
+ */
314
+
315
+ index_js.defineJQueryPlugin(Modal);
316
+
317
+ return Modal;
318
+
319
+ }));
@@ -0,0 +1,245 @@
1
+ /*!
2
+ * Bootstrap offcanvas.js v5.3.2 (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(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/backdrop.js'), require('./util/component-functions.js'), require('./util/focustrap.js'), require('./util/index.js'), require('./util/scrollbar.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/selector-engine', './util/backdrop', './util/component-functions', './util/focustrap', './util/index', './util/scrollbar'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Offcanvas = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Backdrop, global.ComponentFunctions, global.Focustrap, global.Index, global.Scrollbar));
10
+ })(this, (function (BaseComponent, EventHandler, SelectorEngine, Backdrop, componentFunctions_js, FocusTrap, index_js, ScrollBarHelper) { 'use strict';
11
+
12
+ /**
13
+ * --------------------------------------------------------------------------
14
+ * Bootstrap offcanvas.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 = 'offcanvas';
25
+ const DATA_KEY = 'bs.offcanvas';
26
+ const EVENT_KEY = `.${DATA_KEY}`;
27
+ const DATA_API_KEY = '.data-api';
28
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;
29
+ const ESCAPE_KEY = 'Escape';
30
+ const CLASS_NAME_SHOW = 'show';
31
+ const CLASS_NAME_SHOWING = 'showing';
32
+ const CLASS_NAME_HIDING = 'hiding';
33
+ const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
34
+ const OPEN_SELECTOR = '.offcanvas.show';
35
+ const EVENT_SHOW = `show${EVENT_KEY}`;
36
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
37
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
38
+ const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;
39
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
40
+ const EVENT_RESIZE = `resize${EVENT_KEY}`;
41
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
42
+ const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
43
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="offcanvas"]';
44
+ const Default = {
45
+ backdrop: true,
46
+ keyboard: true,
47
+ scroll: false
48
+ };
49
+ const DefaultType = {
50
+ backdrop: '(boolean|string)',
51
+ keyboard: 'boolean',
52
+ scroll: 'boolean'
53
+ };
54
+
55
+ /**
56
+ * Class definition
57
+ */
58
+
59
+ class Offcanvas extends BaseComponent {
60
+ constructor(element, config) {
61
+ super(element, config);
62
+ this._isShown = false;
63
+ this._backdrop = this._initializeBackDrop();
64
+ this._focustrap = this._initializeFocusTrap();
65
+ this._addEventListeners();
66
+ }
67
+
68
+ // Getters
69
+ static get Default() {
70
+ return Default;
71
+ }
72
+ static get DefaultType() {
73
+ return DefaultType;
74
+ }
75
+ static get NAME() {
76
+ return NAME;
77
+ }
78
+
79
+ // Public
80
+ toggle(relatedTarget) {
81
+ return this._isShown ? this.hide() : this.show(relatedTarget);
82
+ }
83
+ show(relatedTarget) {
84
+ if (this._isShown) {
85
+ return;
86
+ }
87
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {
88
+ relatedTarget
89
+ });
90
+ if (showEvent.defaultPrevented) {
91
+ return;
92
+ }
93
+ this._isShown = true;
94
+ this._backdrop.show();
95
+ if (!this._config.scroll) {
96
+ new ScrollBarHelper().hide();
97
+ }
98
+ this._element.setAttribute('aria-modal', true);
99
+ this._element.setAttribute('role', 'dialog');
100
+ this._element.classList.add(CLASS_NAME_SHOWING);
101
+ const completeCallBack = () => {
102
+ if (!this._config.scroll || this._config.backdrop) {
103
+ this._focustrap.activate();
104
+ }
105
+ this._element.classList.add(CLASS_NAME_SHOW);
106
+ this._element.classList.remove(CLASS_NAME_SHOWING);
107
+ EventHandler.trigger(this._element, EVENT_SHOWN, {
108
+ relatedTarget
109
+ });
110
+ };
111
+ this._queueCallback(completeCallBack, this._element, true);
112
+ }
113
+ hide() {
114
+ if (!this._isShown) {
115
+ return;
116
+ }
117
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
118
+ if (hideEvent.defaultPrevented) {
119
+ return;
120
+ }
121
+ this._focustrap.deactivate();
122
+ this._element.blur();
123
+ this._isShown = false;
124
+ this._element.classList.add(CLASS_NAME_HIDING);
125
+ this._backdrop.hide();
126
+ const completeCallback = () => {
127
+ this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING);
128
+ this._element.removeAttribute('aria-modal');
129
+ this._element.removeAttribute('role');
130
+ if (!this._config.scroll) {
131
+ new ScrollBarHelper().reset();
132
+ }
133
+ EventHandler.trigger(this._element, EVENT_HIDDEN);
134
+ };
135
+ this._queueCallback(completeCallback, this._element, true);
136
+ }
137
+ dispose() {
138
+ this._backdrop.dispose();
139
+ this._focustrap.deactivate();
140
+ super.dispose();
141
+ }
142
+
143
+ // Private
144
+ _initializeBackDrop() {
145
+ const clickCallback = () => {
146
+ if (this._config.backdrop === 'static') {
147
+ EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
148
+ return;
149
+ }
150
+ this.hide();
151
+ };
152
+
153
+ // 'static' option will be translated to true, and booleans will keep their value
154
+ const isVisible = Boolean(this._config.backdrop);
155
+ return new Backdrop({
156
+ className: CLASS_NAME_BACKDROP,
157
+ isVisible,
158
+ isAnimated: true,
159
+ rootElement: this._element.parentNode,
160
+ clickCallback: isVisible ? clickCallback : null
161
+ });
162
+ }
163
+ _initializeFocusTrap() {
164
+ return new FocusTrap({
165
+ trapElement: this._element
166
+ });
167
+ }
168
+ _addEventListeners() {
169
+ EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
170
+ if (event.key !== ESCAPE_KEY) {
171
+ return;
172
+ }
173
+ if (this._config.keyboard) {
174
+ this.hide();
175
+ return;
176
+ }
177
+ EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
178
+ });
179
+ }
180
+
181
+ // Static
182
+ static jQueryInterface(config) {
183
+ return this.each(function () {
184
+ const data = Offcanvas.getOrCreateInstance(this, config);
185
+ if (typeof config !== 'string') {
186
+ return;
187
+ }
188
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
189
+ throw new TypeError(`No method named "${config}"`);
190
+ }
191
+ data[config](this);
192
+ });
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Data API implementation
198
+ */
199
+
200
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
201
+ const target = SelectorEngine.getElementFromSelector(this);
202
+ if (['A', 'AREA'].includes(this.tagName)) {
203
+ event.preventDefault();
204
+ }
205
+ if (index_js.isDisabled(this)) {
206
+ return;
207
+ }
208
+ EventHandler.one(target, EVENT_HIDDEN, () => {
209
+ // focus on trigger when it is closed
210
+ if (index_js.isVisible(this)) {
211
+ this.focus();
212
+ }
213
+ });
214
+
215
+ // avoid conflict when clicking a toggler of an offcanvas, while another is open
216
+ const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
217
+ if (alreadyOpen && alreadyOpen !== target) {
218
+ Offcanvas.getInstance(alreadyOpen).hide();
219
+ }
220
+ const data = Offcanvas.getOrCreateInstance(target);
221
+ data.toggle(this);
222
+ });
223
+ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
224
+ for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {
225
+ Offcanvas.getOrCreateInstance(selector).show();
226
+ }
227
+ });
228
+ EventHandler.on(window, EVENT_RESIZE, () => {
229
+ for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {
230
+ if (getComputedStyle(element).position !== 'fixed') {
231
+ Offcanvas.getOrCreateInstance(element).hide();
232
+ }
233
+ }
234
+ });
235
+ componentFunctions_js.enableDismissTrigger(Offcanvas);
236
+
237
+ /**
238
+ * jQuery
239
+ */
240
+
241
+ index_js.defineJQueryPlugin(Offcanvas);
242
+
243
+ return Offcanvas;
244
+
245
+ }));
@@ -0,0 +1,95 @@
1
+ /*!
2
+ * Bootstrap popover.js v5.3.2 (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(require('./tooltip.js'), require('./util/index.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./tooltip', './util/index'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Popover = factory(global.Tooltip, global.Index));
10
+ })(this, (function (Tooltip, index_js) { 'use strict';
11
+
12
+ /**
13
+ * --------------------------------------------------------------------------
14
+ * Bootstrap popover.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 = 'popover';
25
+ const SELECTOR_TITLE = '.popover-header';
26
+ const SELECTOR_CONTENT = '.popover-body';
27
+ const Default = {
28
+ ...Tooltip.Default,
29
+ content: '',
30
+ offset: [0, 8],
31
+ placement: 'right',
32
+ template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div>' + '</div>',
33
+ trigger: 'click'
34
+ };
35
+ const DefaultType = {
36
+ ...Tooltip.DefaultType,
37
+ content: '(null|string|element|function)'
38
+ };
39
+
40
+ /**
41
+ * Class definition
42
+ */
43
+
44
+ class Popover extends Tooltip {
45
+ // Getters
46
+ static get Default() {
47
+ return Default;
48
+ }
49
+ static get DefaultType() {
50
+ return DefaultType;
51
+ }
52
+ static get NAME() {
53
+ return NAME;
54
+ }
55
+
56
+ // Overrides
57
+ _isWithContent() {
58
+ return this._getTitle() || this._getContent();
59
+ }
60
+
61
+ // Private
62
+ _getContentForTemplate() {
63
+ return {
64
+ [SELECTOR_TITLE]: this._getTitle(),
65
+ [SELECTOR_CONTENT]: this._getContent()
66
+ };
67
+ }
68
+ _getContent() {
69
+ return this._resolvePossibleFunction(this._config.content);
70
+ }
71
+
72
+ // Static
73
+ static jQueryInterface(config) {
74
+ return this.each(function () {
75
+ const data = Popover.getOrCreateInstance(this, config);
76
+ if (typeof config !== 'string') {
77
+ return;
78
+ }
79
+ if (typeof data[config] === 'undefined') {
80
+ throw new TypeError(`No method named "${config}"`);
81
+ }
82
+ data[config]();
83
+ });
84
+ }
85
+ }
86
+
87
+ /**
88
+ * jQuery
89
+ */
90
+
91
+ index_js.defineJQueryPlugin(Popover);
92
+
93
+ return Popover;
94
+
95
+ }));