bootstrap 4.4.1 → 5.0.1

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 (149) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +13 -2
  3. data/README.md +7 -4
  4. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  5. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  6. data/assets/javascripts/bootstrap-sprockets.js +15 -8
  7. data/assets/javascripts/bootstrap.js +3244 -2770
  8. data/assets/javascripts/bootstrap.min.js +4 -4
  9. data/assets/javascripts/bootstrap/alert.js +130 -124
  10. data/assets/javascripts/bootstrap/base-component.js +168 -0
  11. data/assets/javascripts/bootstrap/button.js +85 -179
  12. data/assets/javascripts/bootstrap/carousel.js +430 -405
  13. data/assets/javascripts/bootstrap/collapse.js +325 -264
  14. data/assets/javascripts/bootstrap/dom/data.js +68 -0
  15. data/assets/javascripts/bootstrap/dom/event-handler.js +315 -0
  16. data/assets/javascripts/bootstrap/dom/manipulator.js +88 -0
  17. data/assets/javascripts/bootstrap/dom/selector-engine.js +85 -0
  18. data/assets/javascripts/bootstrap/dropdown.js +464 -400
  19. data/assets/javascripts/bootstrap/modal.js +604 -464
  20. data/assets/javascripts/bootstrap/offcanvas.js +671 -0
  21. data/assets/javascripts/bootstrap/popover.js +119 -192
  22. data/assets/javascripts/bootstrap/scrollspy.js +250 -238
  23. data/assets/javascripts/bootstrap/tab.js +189 -151
  24. data/assets/javascripts/bootstrap/toast.js +215 -192
  25. data/assets/javascripts/bootstrap/tooltip.js +604 -544
  26. data/assets/stylesheets/_bootstrap-grid.scss +54 -18
  27. data/assets/stylesheets/_bootstrap-reboot.scss +7 -4
  28. data/assets/stylesheets/_bootstrap.scss +19 -11
  29. data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
  30. data/assets/stylesheets/bootstrap/_alert.scss +15 -9
  31. data/assets/stylesheets/bootstrap/_badge.scss +2 -27
  32. data/assets/stylesheets/bootstrap/_breadcrumb.scss +4 -18
  33. data/assets/stylesheets/bootstrap/_button-group.scss +21 -45
  34. data/assets/stylesheets/bootstrap/_buttons.scss +27 -55
  35. data/assets/stylesheets/bootstrap/_card.scss +43 -106
  36. data/assets/stylesheets/bootstrap/_carousel.scss +65 -33
  37. data/assets/stylesheets/bootstrap/_close.scss +30 -31
  38. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  39. data/assets/stylesheets/bootstrap/_dropdown.scss +87 -38
  40. data/assets/stylesheets/bootstrap/_forms.scss +9 -338
  41. data/assets/stylesheets/bootstrap/_functions.scss +99 -28
  42. data/assets/stylesheets/bootstrap/_grid.scss +3 -50
  43. data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
  44. data/assets/stylesheets/bootstrap/_list-group.scss +38 -22
  45. data/assets/stylesheets/bootstrap/_mixins.scss +8 -13
  46. data/assets/stylesheets/bootstrap/_modal.scss +45 -65
  47. data/assets/stylesheets/bootstrap/_nav.scss +28 -9
  48. data/assets/stylesheets/bootstrap/_navbar.scss +51 -69
  49. data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
  50. data/assets/stylesheets/bootstrap/_pagination.scss +11 -20
  51. data/assets/stylesheets/bootstrap/_popover.scss +15 -27
  52. data/assets/stylesheets/bootstrap/_progress.scss +6 -4
  53. data/assets/stylesheets/bootstrap/_reboot.scss +339 -200
  54. data/assets/stylesheets/bootstrap/_root.scss +5 -9
  55. data/assets/stylesheets/bootstrap/_spinners.scss +21 -7
  56. data/assets/stylesheets/bootstrap/_tables.scss +80 -114
  57. data/assets/stylesheets/bootstrap/_toasts.scss +21 -14
  58. data/assets/stylesheets/bootstrap/_tooltip.scss +17 -17
  59. data/assets/stylesheets/bootstrap/_transitions.scss +2 -1
  60. data/assets/stylesheets/bootstrap/_type.scss +38 -59
  61. data/assets/stylesheets/bootstrap/_utilities.scss +594 -17
  62. data/assets/stylesheets/bootstrap/_variables.scss +810 -489
  63. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
  64. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
  65. data/assets/stylesheets/bootstrap/forms/_form-check.scss +152 -0
  66. data/assets/stylesheets/bootstrap/forms/_form-control.scss +219 -0
  67. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  68. data/assets/stylesheets/bootstrap/forms/_form-select.scss +67 -0
  69. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  70. data/assets/stylesheets/bootstrap/forms/_input-group.scss +121 -0
  71. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  72. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  73. data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
  74. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
  75. data/assets/stylesheets/bootstrap/helpers/_position.scss +30 -0
  76. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  77. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  78. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  79. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  80. data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -5
  81. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +37 -22
  82. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
  83. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +14 -10
  84. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +75 -52
  85. data/assets/stylesheets/bootstrap/mixins/_caret.scss +10 -8
  86. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  87. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  88. data/assets/stylesheets/bootstrap/mixins/_container.scss +9 -0
  89. data/assets/stylesheets/bootstrap/mixins/_forms.scss +42 -75
  90. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  91. data/assets/stylesheets/bootstrap/mixins/_grid.scss +90 -34
  92. data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -21
  93. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
  94. data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
  95. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +17 -8
  96. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  97. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
  98. data/assets/stylesheets/bootstrap/mixins/_transition.scss +18 -8
  99. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +68 -0
  100. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
  101. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  102. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +234 -126
  103. data/bootstrap.gemspec +1 -3
  104. data/lib/bootstrap/version.rb +2 -2
  105. data/tasks/updater/js.rb +20 -5
  106. data/tasks/updater/network.rb +8 -2
  107. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  108. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  109. data/test/dummy_rails/app/views/pages/root.html +89 -0
  110. data/test/dummy_rails/config/application.rb +0 -3
  111. data/test/gemfiles/rails_6_0.gemfile +7 -0
  112. data/test/gemfiles/rails_6_1.gemfile +7 -0
  113. metadata +48 -73
  114. data/assets/javascripts/bootstrap/util.js +0 -188
  115. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  116. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -521
  117. data/assets/stylesheets/bootstrap/_input-group.scss +0 -191
  118. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  119. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  120. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  121. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -22
  122. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  123. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  124. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -71
  125. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  126. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -11
  127. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -34
  128. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  129. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  130. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -17
  131. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  132. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  133. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  134. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  135. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  136. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  137. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  138. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  139. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  140. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  141. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  142. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  143. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  144. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  145. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  146. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  147. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  148. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  149. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
@@ -0,0 +1,671 @@
1
+ /*!
2
+ * Bootstrap offcanvas.js v5.0.1 (https://getbootstrap.com/)
3
+ * Copyright 2011-2021 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('./dom/manipulator.js'), require('./dom/data.js'), require('./dom/event-handler.js'), require('./base-component.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./dom/selector-engine', './dom/manipulator', './dom/data', './dom/event-handler', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Offcanvas = factory(global.SelectorEngine, global.Manipulator, global.Data, global.EventHandler, global.Base));
10
+ }(this, (function (SelectorEngine, Manipulator, Data, EventHandler, BaseComponent) { 'use strict';
11
+
12
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
+
14
+ var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
15
+ var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
16
+ var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
17
+ var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
18
+ var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
19
+
20
+ const MILLISECONDS_MULTIPLIER = 1000;
21
+ const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
22
+
23
+ const toType = obj => {
24
+ if (obj === null || obj === undefined) {
25
+ return `${obj}`;
26
+ }
27
+
28
+ return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
29
+ };
30
+
31
+ const getSelector = element => {
32
+ let selector = element.getAttribute('data-bs-target');
33
+
34
+ if (!selector || selector === '#') {
35
+ let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
36
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
37
+ // `document.querySelector` will rightfully complain it is invalid.
38
+ // See https://github.com/twbs/bootstrap/issues/32273
39
+
40
+ if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
41
+ return null;
42
+ } // Just in case some CMS puts out a full URL with the anchor appended
43
+
44
+
45
+ if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
46
+ hrefAttr = `#${hrefAttr.split('#')[1]}`;
47
+ }
48
+
49
+ selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
50
+ }
51
+
52
+ return selector;
53
+ };
54
+
55
+ const getElementFromSelector = element => {
56
+ const selector = getSelector(element);
57
+ return selector ? document.querySelector(selector) : null;
58
+ };
59
+
60
+ const getTransitionDurationFromElement = element => {
61
+ if (!element) {
62
+ return 0;
63
+ } // Get transition-duration of the element
64
+
65
+
66
+ let {
67
+ transitionDuration,
68
+ transitionDelay
69
+ } = window.getComputedStyle(element);
70
+ const floatTransitionDuration = Number.parseFloat(transitionDuration);
71
+ const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
72
+
73
+ if (!floatTransitionDuration && !floatTransitionDelay) {
74
+ return 0;
75
+ } // If multiple durations are defined, take the first
76
+
77
+
78
+ transitionDuration = transitionDuration.split(',')[0];
79
+ transitionDelay = transitionDelay.split(',')[0];
80
+ return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
81
+ };
82
+
83
+ const triggerTransitionEnd = element => {
84
+ element.dispatchEvent(new Event(TRANSITION_END));
85
+ };
86
+
87
+ const isElement = obj => {
88
+ if (!obj || typeof obj !== 'object') {
89
+ return false;
90
+ }
91
+
92
+ if (typeof obj.jquery !== 'undefined') {
93
+ obj = obj[0];
94
+ }
95
+
96
+ return typeof obj.nodeType !== 'undefined';
97
+ };
98
+
99
+ const emulateTransitionEnd = (element, duration) => {
100
+ let called = false;
101
+ const durationPadding = 5;
102
+ const emulatedDuration = duration + durationPadding;
103
+
104
+ function listener() {
105
+ called = true;
106
+ element.removeEventListener(TRANSITION_END, listener);
107
+ }
108
+
109
+ element.addEventListener(TRANSITION_END, listener);
110
+ setTimeout(() => {
111
+ if (!called) {
112
+ triggerTransitionEnd(element);
113
+ }
114
+ }, emulatedDuration);
115
+ };
116
+
117
+ const typeCheckConfig = (componentName, config, configTypes) => {
118
+ Object.keys(configTypes).forEach(property => {
119
+ const expectedTypes = configTypes[property];
120
+ const value = config[property];
121
+ const valueType = value && isElement(value) ? 'element' : toType(value);
122
+
123
+ if (!new RegExp(expectedTypes).test(valueType)) {
124
+ throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
125
+ }
126
+ });
127
+ };
128
+
129
+ const isVisible = element => {
130
+ if (!element) {
131
+ return false;
132
+ }
133
+
134
+ if (element.style && element.parentNode && element.parentNode.style) {
135
+ const elementStyle = getComputedStyle(element);
136
+ const parentNodeStyle = getComputedStyle(element.parentNode);
137
+ return elementStyle.display !== 'none' && parentNodeStyle.display !== 'none' && elementStyle.visibility !== 'hidden';
138
+ }
139
+
140
+ return false;
141
+ };
142
+
143
+ const isDisabled = element => {
144
+ if (!element || element.nodeType !== Node.ELEMENT_NODE) {
145
+ return true;
146
+ }
147
+
148
+ if (element.classList.contains('disabled')) {
149
+ return true;
150
+ }
151
+
152
+ if (typeof element.disabled !== 'undefined') {
153
+ return element.disabled;
154
+ }
155
+
156
+ return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
157
+ };
158
+
159
+ const reflow = element => element.offsetHeight;
160
+
161
+ const getjQuery = () => {
162
+ const {
163
+ jQuery
164
+ } = window;
165
+
166
+ if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
167
+ return jQuery;
168
+ }
169
+
170
+ return null;
171
+ };
172
+
173
+ const onDOMContentLoaded = callback => {
174
+ if (document.readyState === 'loading') {
175
+ document.addEventListener('DOMContentLoaded', callback);
176
+ } else {
177
+ callback();
178
+ }
179
+ };
180
+
181
+ const defineJQueryPlugin = plugin => {
182
+ onDOMContentLoaded(() => {
183
+ const $ = getjQuery();
184
+ /* istanbul ignore if */
185
+
186
+ if ($) {
187
+ const name = plugin.NAME;
188
+ const JQUERY_NO_CONFLICT = $.fn[name];
189
+ $.fn[name] = plugin.jQueryInterface;
190
+ $.fn[name].Constructor = plugin;
191
+
192
+ $.fn[name].noConflict = () => {
193
+ $.fn[name] = JQUERY_NO_CONFLICT;
194
+ return plugin.jQueryInterface;
195
+ };
196
+ }
197
+ });
198
+ };
199
+
200
+ const execute = callback => {
201
+ if (typeof callback === 'function') {
202
+ callback();
203
+ }
204
+ };
205
+
206
+ /**
207
+ * --------------------------------------------------------------------------
208
+ * Bootstrap (v5.0.1): util/scrollBar.js
209
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
210
+ * --------------------------------------------------------------------------
211
+ */
212
+ const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
213
+ const SELECTOR_STICKY_CONTENT = '.sticky-top';
214
+
215
+ const getWidth = () => {
216
+ // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
217
+ const documentWidth = document.documentElement.clientWidth;
218
+ return Math.abs(window.innerWidth - documentWidth);
219
+ };
220
+
221
+ const hide = (width = getWidth()) => {
222
+ _disableOverFlow(); // give padding to element to balances the hidden scrollbar width
223
+
224
+
225
+ _setElementAttributes('body', 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements, to keep shown fullwidth
226
+
227
+
228
+ _setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
229
+
230
+ _setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
231
+ };
232
+
233
+ const _disableOverFlow = () => {
234
+ const actualValue = document.body.style.overflow;
235
+
236
+ if (actualValue) {
237
+ Manipulator__default['default'].setDataAttribute(document.body, 'overflow', actualValue);
238
+ }
239
+
240
+ document.body.style.overflow = 'hidden';
241
+ };
242
+
243
+ const _setElementAttributes = (selector, styleProp, callback) => {
244
+ const scrollbarWidth = getWidth();
245
+ SelectorEngine__default['default'].find(selector).forEach(element => {
246
+ if (element !== document.body && window.innerWidth > element.clientWidth + scrollbarWidth) {
247
+ return;
248
+ }
249
+
250
+ const actualValue = element.style[styleProp];
251
+ const calculatedValue = window.getComputedStyle(element)[styleProp];
252
+ Manipulator__default['default'].setDataAttribute(element, styleProp, actualValue);
253
+ element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
254
+ });
255
+ };
256
+
257
+ const reset = () => {
258
+ _resetElementAttributes('body', 'overflow');
259
+
260
+ _resetElementAttributes('body', 'paddingRight');
261
+
262
+ _resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
263
+
264
+ _resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
265
+ };
266
+
267
+ const _resetElementAttributes = (selector, styleProp) => {
268
+ SelectorEngine__default['default'].find(selector).forEach(element => {
269
+ const value = Manipulator__default['default'].getDataAttribute(element, styleProp);
270
+
271
+ if (typeof value === 'undefined') {
272
+ element.style.removeProperty(styleProp);
273
+ } else {
274
+ Manipulator__default['default'].removeDataAttribute(element, styleProp);
275
+ element.style[styleProp] = value;
276
+ }
277
+ });
278
+ };
279
+
280
+ /**
281
+ * --------------------------------------------------------------------------
282
+ * Bootstrap (v5.0.1): util/backdrop.js
283
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
284
+ * --------------------------------------------------------------------------
285
+ */
286
+ const Default$1 = {
287
+ isVisible: true,
288
+ // if false, we use the backdrop helper without adding any element to the dom
289
+ isAnimated: false,
290
+ rootElement: document.body,
291
+ // give the choice to place backdrop under different elements
292
+ clickCallback: null
293
+ };
294
+ const DefaultType$1 = {
295
+ isVisible: 'boolean',
296
+ isAnimated: 'boolean',
297
+ rootElement: 'element',
298
+ clickCallback: '(function|null)'
299
+ };
300
+ const NAME$1 = 'backdrop';
301
+ const CLASS_NAME_BACKDROP = 'modal-backdrop';
302
+ const CLASS_NAME_FADE = 'fade';
303
+ const CLASS_NAME_SHOW$1 = 'show';
304
+ const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$1}`;
305
+
306
+ class Backdrop {
307
+ constructor(config) {
308
+ this._config = this._getConfig(config);
309
+ this._isAppended = false;
310
+ this._element = null;
311
+ }
312
+
313
+ show(callback) {
314
+ if (!this._config.isVisible) {
315
+ execute(callback);
316
+ return;
317
+ }
318
+
319
+ this._append();
320
+
321
+ if (this._config.isAnimated) {
322
+ reflow(this._getElement());
323
+ }
324
+
325
+ this._getElement().classList.add(CLASS_NAME_SHOW$1);
326
+
327
+ this._emulateAnimation(() => {
328
+ execute(callback);
329
+ });
330
+ }
331
+
332
+ hide(callback) {
333
+ if (!this._config.isVisible) {
334
+ execute(callback);
335
+ return;
336
+ }
337
+
338
+ this._getElement().classList.remove(CLASS_NAME_SHOW$1);
339
+
340
+ this._emulateAnimation(() => {
341
+ this.dispose();
342
+ execute(callback);
343
+ });
344
+ } // Private
345
+
346
+
347
+ _getElement() {
348
+ if (!this._element) {
349
+ const backdrop = document.createElement('div');
350
+ backdrop.className = CLASS_NAME_BACKDROP;
351
+
352
+ if (this._config.isAnimated) {
353
+ backdrop.classList.add(CLASS_NAME_FADE);
354
+ }
355
+
356
+ this._element = backdrop;
357
+ }
358
+
359
+ return this._element;
360
+ }
361
+
362
+ _getConfig(config) {
363
+ config = { ...Default$1,
364
+ ...(typeof config === 'object' ? config : {})
365
+ };
366
+ config.rootElement = config.rootElement || document.body;
367
+ typeCheckConfig(NAME$1, config, DefaultType$1);
368
+ return config;
369
+ }
370
+
371
+ _append() {
372
+ if (this._isAppended) {
373
+ return;
374
+ }
375
+
376
+ this._config.rootElement.appendChild(this._getElement());
377
+
378
+ EventHandler__default['default'].on(this._getElement(), EVENT_MOUSEDOWN, () => {
379
+ execute(this._config.clickCallback);
380
+ });
381
+ this._isAppended = true;
382
+ }
383
+
384
+ dispose() {
385
+ if (!this._isAppended) {
386
+ return;
387
+ }
388
+
389
+ EventHandler__default['default'].off(this._element, EVENT_MOUSEDOWN);
390
+
391
+ this._getElement().parentNode.removeChild(this._element);
392
+
393
+ this._isAppended = false;
394
+ }
395
+
396
+ _emulateAnimation(callback) {
397
+ if (!this._config.isAnimated) {
398
+ execute(callback);
399
+ return;
400
+ }
401
+
402
+ const backdropTransitionDuration = getTransitionDurationFromElement(this._getElement());
403
+ EventHandler__default['default'].one(this._getElement(), 'transitionend', () => execute(callback));
404
+ emulateTransitionEnd(this._getElement(), backdropTransitionDuration);
405
+ }
406
+
407
+ }
408
+
409
+ /**
410
+ * --------------------------------------------------------------------------
411
+ * Bootstrap (v5.0.1): offcanvas.js
412
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
413
+ * --------------------------------------------------------------------------
414
+ */
415
+ /**
416
+ * ------------------------------------------------------------------------
417
+ * Constants
418
+ * ------------------------------------------------------------------------
419
+ */
420
+
421
+ const NAME = 'offcanvas';
422
+ const DATA_KEY = 'bs.offcanvas';
423
+ const EVENT_KEY = `.${DATA_KEY}`;
424
+ const DATA_API_KEY = '.data-api';
425
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;
426
+ const ESCAPE_KEY = 'Escape';
427
+ const Default = {
428
+ backdrop: true,
429
+ keyboard: true,
430
+ scroll: false
431
+ };
432
+ const DefaultType = {
433
+ backdrop: 'boolean',
434
+ keyboard: 'boolean',
435
+ scroll: 'boolean'
436
+ };
437
+ const CLASS_NAME_SHOW = 'show';
438
+ const OPEN_SELECTOR = '.offcanvas.show';
439
+ const EVENT_SHOW = `show${EVENT_KEY}`;
440
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
441
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
442
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
443
+ const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
444
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
445
+ const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
446
+ const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
447
+ const SELECTOR_DATA_DISMISS = '[data-bs-dismiss="offcanvas"]';
448
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="offcanvas"]';
449
+ /**
450
+ * ------------------------------------------------------------------------
451
+ * Class Definition
452
+ * ------------------------------------------------------------------------
453
+ */
454
+
455
+ class Offcanvas extends BaseComponent__default['default'] {
456
+ constructor(element, config) {
457
+ super(element);
458
+ this._config = this._getConfig(config);
459
+ this._isShown = false;
460
+ this._backdrop = this._initializeBackDrop();
461
+
462
+ this._addEventListeners();
463
+ } // Getters
464
+
465
+
466
+ static get NAME() {
467
+ return NAME;
468
+ }
469
+
470
+ static get Default() {
471
+ return Default;
472
+ } // Public
473
+
474
+
475
+ toggle(relatedTarget) {
476
+ return this._isShown ? this.hide() : this.show(relatedTarget);
477
+ }
478
+
479
+ show(relatedTarget) {
480
+ if (this._isShown) {
481
+ return;
482
+ }
483
+
484
+ const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
485
+ relatedTarget
486
+ });
487
+
488
+ if (showEvent.defaultPrevented) {
489
+ return;
490
+ }
491
+
492
+ this._isShown = true;
493
+ this._element.style.visibility = 'visible';
494
+
495
+ this._backdrop.show();
496
+
497
+ if (!this._config.scroll) {
498
+ hide();
499
+
500
+ this._enforceFocusOnElement(this._element);
501
+ }
502
+
503
+ this._element.removeAttribute('aria-hidden');
504
+
505
+ this._element.setAttribute('aria-modal', true);
506
+
507
+ this._element.setAttribute('role', 'dialog');
508
+
509
+ this._element.classList.add(CLASS_NAME_SHOW);
510
+
511
+ const completeCallBack = () => {
512
+ EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
513
+ relatedTarget
514
+ });
515
+ };
516
+
517
+ this._queueCallback(completeCallBack, this._element, true);
518
+ }
519
+
520
+ hide() {
521
+ if (!this._isShown) {
522
+ return;
523
+ }
524
+
525
+ const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
526
+
527
+ if (hideEvent.defaultPrevented) {
528
+ return;
529
+ }
530
+
531
+ EventHandler__default['default'].off(document, EVENT_FOCUSIN);
532
+
533
+ this._element.blur();
534
+
535
+ this._isShown = false;
536
+
537
+ this._element.classList.remove(CLASS_NAME_SHOW);
538
+
539
+ this._backdrop.hide();
540
+
541
+ const completeCallback = () => {
542
+ this._element.setAttribute('aria-hidden', true);
543
+
544
+ this._element.removeAttribute('aria-modal');
545
+
546
+ this._element.removeAttribute('role');
547
+
548
+ this._element.style.visibility = 'hidden';
549
+
550
+ if (!this._config.scroll) {
551
+ reset();
552
+ }
553
+
554
+ EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
555
+ };
556
+
557
+ this._queueCallback(completeCallback, this._element, true);
558
+ }
559
+
560
+ dispose() {
561
+ this._backdrop.dispose();
562
+
563
+ super.dispose();
564
+ EventHandler__default['default'].off(document, EVENT_FOCUSIN);
565
+ } // Private
566
+
567
+
568
+ _getConfig(config) {
569
+ config = { ...Default,
570
+ ...Manipulator__default['default'].getDataAttributes(this._element),
571
+ ...(typeof config === 'object' ? config : {})
572
+ };
573
+ typeCheckConfig(NAME, config, DefaultType);
574
+ return config;
575
+ }
576
+
577
+ _initializeBackDrop() {
578
+ return new Backdrop({
579
+ isVisible: this._config.backdrop,
580
+ isAnimated: true,
581
+ rootElement: this._element.parentNode,
582
+ clickCallback: () => this.hide()
583
+ });
584
+ }
585
+
586
+ _enforceFocusOnElement(element) {
587
+ EventHandler__default['default'].off(document, EVENT_FOCUSIN); // guard against infinite focus loop
588
+
589
+ EventHandler__default['default'].on(document, EVENT_FOCUSIN, event => {
590
+ if (document !== event.target && element !== event.target && !element.contains(event.target)) {
591
+ element.focus();
592
+ }
593
+ });
594
+ element.focus();
595
+ }
596
+
597
+ _addEventListeners() {
598
+ EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide());
599
+ EventHandler__default['default'].on(this._element, EVENT_KEYDOWN_DISMISS, event => {
600
+ if (this._config.keyboard && event.key === ESCAPE_KEY) {
601
+ this.hide();
602
+ }
603
+ });
604
+ } // Static
605
+
606
+
607
+ static jQueryInterface(config) {
608
+ return this.each(function () {
609
+ const data = Data__default['default'].get(this, DATA_KEY) || new Offcanvas(this, typeof config === 'object' ? config : {});
610
+
611
+ if (typeof config !== 'string') {
612
+ return;
613
+ }
614
+
615
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
616
+ throw new TypeError(`No method named "${config}"`);
617
+ }
618
+
619
+ data[config](this);
620
+ });
621
+ }
622
+
623
+ }
624
+ /**
625
+ * ------------------------------------------------------------------------
626
+ * Data Api implementation
627
+ * ------------------------------------------------------------------------
628
+ */
629
+
630
+
631
+ EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
632
+ const target = getElementFromSelector(this);
633
+
634
+ if (['A', 'AREA'].includes(this.tagName)) {
635
+ event.preventDefault();
636
+ }
637
+
638
+ if (isDisabled(this)) {
639
+ return;
640
+ }
641
+
642
+ EventHandler__default['default'].one(target, EVENT_HIDDEN, () => {
643
+ // focus on trigger when it is closed
644
+ if (isVisible(this)) {
645
+ this.focus();
646
+ }
647
+ }); // avoid conflict when clicking a toggler of an offcanvas, while another is open
648
+
649
+ const allReadyOpen = SelectorEngine__default['default'].findOne(OPEN_SELECTOR);
650
+
651
+ if (allReadyOpen && allReadyOpen !== target) {
652
+ Offcanvas.getInstance(allReadyOpen).hide();
653
+ }
654
+
655
+ const data = Data__default['default'].get(target, DATA_KEY) || new Offcanvas(target);
656
+ data.toggle(this);
657
+ });
658
+ EventHandler__default['default'].on(window, EVENT_LOAD_DATA_API, () => {
659
+ SelectorEngine__default['default'].find(OPEN_SELECTOR).forEach(el => (Data__default['default'].get(el, DATA_KEY) || new Offcanvas(el)).show());
660
+ });
661
+ /**
662
+ * ------------------------------------------------------------------------
663
+ * jQuery
664
+ * ------------------------------------------------------------------------
665
+ */
666
+
667
+ defineJQueryPlugin(Offcanvas);
668
+
669
+ return Offcanvas;
670
+
671
+ })));