bootstrap 4.1.3 → 5.0.0

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 (156) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +17 -2
  3. data/CHANGELOG.md +2 -14
  4. data/README.md +7 -4
  5. data/Rakefile +2 -2
  6. data/assets/javascripts/bootstrap/alert.js +226 -166
  7. data/assets/javascripts/bootstrap/base-component.js +63 -0
  8. data/assets/javascripts/bootstrap/button.js +119 -165
  9. data/assets/javascripts/bootstrap/carousel.js +634 -445
  10. data/assets/javascripts/bootstrap/collapse.js +447 -327
  11. data/assets/javascripts/bootstrap/dom/data.js +68 -0
  12. data/assets/javascripts/bootstrap/dom/event-handler.js +322 -0
  13. data/assets/javascripts/bootstrap/dom/manipulator.js +88 -0
  14. data/assets/javascripts/bootstrap/dom/selector-engine.js +85 -0
  15. data/assets/javascripts/bootstrap/dropdown.js +550 -425
  16. data/assets/javascripts/bootstrap/modal.js +695 -492
  17. data/assets/javascripts/bootstrap/offcanvas.js +671 -0
  18. data/assets/javascripts/bootstrap/popover.js +167 -217
  19. data/assets/javascripts/bootstrap/scrollspy.js +319 -302
  20. data/assets/javascripts/bootstrap/tab.js +303 -221
  21. data/assets/javascripts/bootstrap/toast.js +333 -0
  22. data/assets/javascripts/bootstrap/tooltip.js +896 -577
  23. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  24. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  25. data/assets/javascripts/bootstrap-sprockets.js +15 -7
  26. data/assets/javascripts/bootstrap.js +4262 -3163
  27. data/assets/javascripts/bootstrap.min.js +4 -4
  28. data/assets/stylesheets/_bootstrap-grid.scss +54 -21
  29. data/assets/stylesheets/_bootstrap-reboot.scss +7 -4
  30. data/assets/stylesheets/_bootstrap.scss +21 -11
  31. data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
  32. data/assets/stylesheets/bootstrap/_alert.scss +15 -9
  33. data/assets/stylesheets/bootstrap/_badge.scss +3 -21
  34. data/assets/stylesheets/bootstrap/_breadcrumb.scss +5 -18
  35. data/assets/stylesheets/bootstrap/_button-group.scss +29 -62
  36. data/assets/stylesheets/bootstrap/_buttons.scss +33 -65
  37. data/assets/stylesheets/bootstrap/_card.scss +55 -141
  38. data/assets/stylesheets/bootstrap/_carousel.scss +94 -101
  39. data/assets/stylesheets/bootstrap/_close.scss +33 -28
  40. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  41. data/assets/stylesheets/bootstrap/_dropdown.scss +114 -40
  42. data/assets/stylesheets/bootstrap/_forms.scss +9 -333
  43. data/assets/stylesheets/bootstrap/_functions.scss +148 -29
  44. data/assets/stylesheets/bootstrap/_grid.scss +4 -34
  45. data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
  46. data/assets/stylesheets/bootstrap/_images.scss +4 -4
  47. data/assets/stylesheets/bootstrap/_list-group.scss +86 -27
  48. data/assets/stylesheets/bootstrap/_mixins.scss +17 -16
  49. data/assets/stylesheets/bootstrap/_modal.scss +90 -42
  50. data/assets/stylesheets/bootstrap/_nav.scss +31 -10
  51. data/assets/stylesheets/bootstrap/_navbar.scss +68 -61
  52. data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
  53. data/assets/stylesheets/bootstrap/_pagination.scss +13 -27
  54. data/assets/stylesheets/bootstrap/_popover.scss +63 -88
  55. data/assets/stylesheets/bootstrap/_progress.scss +20 -6
  56. data/assets/stylesheets/bootstrap/_reboot.scss +349 -211
  57. data/assets/stylesheets/bootstrap/_root.scss +5 -8
  58. data/assets/stylesheets/bootstrap/_spinners.scss +69 -0
  59. data/assets/stylesheets/bootstrap/_tables.scss +79 -116
  60. data/assets/stylesheets/bootstrap/_toasts.scss +51 -0
  61. data/assets/stylesheets/bootstrap/_tooltip.scss +18 -18
  62. data/assets/stylesheets/bootstrap/_transitions.scss +2 -3
  63. data/assets/stylesheets/bootstrap/_type.scss +42 -63
  64. data/assets/stylesheets/bootstrap/_utilities.scss +594 -15
  65. data/assets/stylesheets/bootstrap/_variables.scss +952 -440
  66. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
  67. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
  68. data/assets/stylesheets/bootstrap/forms/_form-check.scss +152 -0
  69. data/assets/stylesheets/bootstrap/forms/_form-control.scss +219 -0
  70. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  71. data/assets/stylesheets/bootstrap/forms/_form-select.scss +67 -0
  72. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  73. data/assets/stylesheets/bootstrap/forms/_input-group.scss +121 -0
  74. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  75. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  76. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
  77. data/assets/stylesheets/bootstrap/helpers/_position.scss +30 -0
  78. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  79. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  80. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  81. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  82. data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -5
  83. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +57 -14
  84. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +14 -1
  85. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +13 -9
  86. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +77 -53
  87. data/assets/stylesheets/bootstrap/mixins/_caret.scss +14 -16
  88. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  89. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  90. data/assets/stylesheets/bootstrap/mixins/_container.scss +9 -0
  91. data/assets/stylesheets/bootstrap/mixins/_deprecate.scss +10 -0
  92. data/assets/stylesheets/bootstrap/mixins/_forms.scss +87 -97
  93. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  94. data/assets/stylesheets/bootstrap/mixins/_grid.scss +106 -33
  95. data/assets/stylesheets/bootstrap/mixins/_image.scss +0 -20
  96. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
  97. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +18 -9
  98. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  99. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
  100. data/assets/stylesheets/bootstrap/mixins/_transition.scss +19 -6
  101. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +68 -0
  102. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
  103. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  104. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +312 -0
  105. data/bootstrap.gemspec +7 -6
  106. data/lib/bootstrap/engine.rb +3 -0
  107. data/lib/bootstrap/version.rb +4 -2
  108. data/lib/bootstrap.rb +10 -7
  109. data/tasks/updater/js.rb +20 -5
  110. data/tasks/updater/network.rb +8 -2
  111. data/test/dummy_rails/app/assets/config/manifest.js +3 -0
  112. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  113. data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
  114. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  115. data/test/dummy_rails/app/views/pages/root.html +89 -0
  116. data/test/dummy_rails/config/application.rb +0 -3
  117. data/test/gemfiles/rails_6_0.gemfile +7 -0
  118. data/test/gemfiles/rails_6_1.gemfile +7 -0
  119. data/test/support/dummy_rails_integration.rb +3 -1
  120. data/test/test_helper.rb +18 -13
  121. metadata +64 -79
  122. data/assets/javascripts/bootstrap/util.js +0 -143
  123. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  124. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -433
  125. data/assets/stylesheets/bootstrap/_input-group.scss +0 -173
  126. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -16
  127. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  128. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  129. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
  130. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -12
  131. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -11
  132. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -67
  133. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  134. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
  135. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -33
  136. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -6
  137. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -30
  138. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -14
  139. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -13
  140. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -7
  141. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  142. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  143. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -59
  144. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -38
  145. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -52
  146. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  147. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -9
  148. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -37
  149. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  150. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  151. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -12
  152. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -51
  153. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -58
  154. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -11
  155. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
  156. /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
@@ -1,732 +1,1051 @@
1
+ /*!
2
+ * Bootstrap tooltip.js v5.0.0 (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
+ */
1
6
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('popper.js'), require('./util.js')) :
3
- typeof define === 'function' && define.amd ? define(['jquery', 'popper.js', './util.js'], factory) :
4
- (global.Tooltip = factory(global.jQuery,global.Popper,global.Util));
5
- }(this, (function ($,Popper,Util) { 'use strict';
6
-
7
- $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
8
- Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
9
- Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
10
-
11
- function _defineProperties(target, props) {
12
- for (var i = 0; i < props.length; i++) {
13
- var descriptor = props[i];
14
- descriptor.enumerable = descriptor.enumerable || false;
15
- descriptor.configurable = true;
16
- if ("value" in descriptor) descriptor.writable = true;
17
- Object.defineProperty(target, descriptor.key, descriptor);
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./base-component.js')) :
8
+ typeof define === 'function' && define.amd ? define(['@popperjs/core', './dom/data', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global.Popper, global.Data, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
10
+ }(this, (function (Popper, Data, EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
11
+
12
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
+
14
+ function _interopNamespace(e) {
15
+ if (e && e.__esModule) return e;
16
+ var n = Object.create(null);
17
+ if (e) {
18
+ Object.keys(e).forEach(function (k) {
19
+ if (k !== 'default') {
20
+ var d = Object.getOwnPropertyDescriptor(e, k);
21
+ Object.defineProperty(n, k, d.get ? d : {
22
+ enumerable: true,
23
+ get: function () {
24
+ return e[k];
25
+ }
26
+ });
27
+ }
28
+ });
18
29
  }
30
+ n['default'] = e;
31
+ return Object.freeze(n);
19
32
  }
20
33
 
21
- function _createClass(Constructor, protoProps, staticProps) {
22
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
23
- if (staticProps) _defineProperties(Constructor, staticProps);
24
- return Constructor;
25
- }
34
+ var Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
35
+ var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
36
+ var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
37
+ var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
38
+ var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
39
+ var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
26
40
 
27
- function _defineProperty(obj, key, value) {
28
- if (key in obj) {
29
- Object.defineProperty(obj, key, {
30
- value: value,
31
- enumerable: true,
32
- configurable: true,
33
- writable: true
34
- });
41
+ /**
42
+ * --------------------------------------------------------------------------
43
+ * Bootstrap (v5.0.0): util/index.js
44
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
45
+ * --------------------------------------------------------------------------
46
+ */
47
+ const MAX_UID = 1000000;
48
+ const MILLISECONDS_MULTIPLIER = 1000;
49
+ const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
50
+
51
+ const toType = obj => {
52
+ if (obj === null || obj === undefined) {
53
+ return `${obj}`;
54
+ }
55
+
56
+ return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
57
+ };
58
+ /**
59
+ * --------------------------------------------------------------------------
60
+ * Public Util Api
61
+ * --------------------------------------------------------------------------
62
+ */
63
+
64
+
65
+ const getUID = prefix => {
66
+ do {
67
+ prefix += Math.floor(Math.random() * MAX_UID);
68
+ } while (document.getElementById(prefix));
69
+
70
+ return prefix;
71
+ };
72
+
73
+ const getTransitionDurationFromElement = element => {
74
+ if (!element) {
75
+ return 0;
76
+ } // Get transition-duration of the element
77
+
78
+
79
+ let {
80
+ transitionDuration,
81
+ transitionDelay
82
+ } = window.getComputedStyle(element);
83
+ const floatTransitionDuration = Number.parseFloat(transitionDuration);
84
+ const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
85
+
86
+ if (!floatTransitionDuration && !floatTransitionDelay) {
87
+ return 0;
88
+ } // If multiple durations are defined, take the first
89
+
90
+
91
+ transitionDuration = transitionDuration.split(',')[0];
92
+ transitionDelay = transitionDelay.split(',')[0];
93
+ return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
94
+ };
95
+
96
+ const triggerTransitionEnd = element => {
97
+ element.dispatchEvent(new Event(TRANSITION_END));
98
+ };
99
+
100
+ const isElement = obj => (obj[0] || obj).nodeType;
101
+
102
+ const emulateTransitionEnd = (element, duration) => {
103
+ let called = false;
104
+ const durationPadding = 5;
105
+ const emulatedDuration = duration + durationPadding;
106
+
107
+ function listener() {
108
+ called = true;
109
+ element.removeEventListener(TRANSITION_END, listener);
110
+ }
111
+
112
+ element.addEventListener(TRANSITION_END, listener);
113
+ setTimeout(() => {
114
+ if (!called) {
115
+ triggerTransitionEnd(element);
116
+ }
117
+ }, emulatedDuration);
118
+ };
119
+
120
+ const typeCheckConfig = (componentName, config, configTypes) => {
121
+ Object.keys(configTypes).forEach(property => {
122
+ const expectedTypes = configTypes[property];
123
+ const value = config[property];
124
+ const valueType = value && isElement(value) ? 'element' : toType(value);
125
+
126
+ if (!new RegExp(expectedTypes).test(valueType)) {
127
+ throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
128
+ }
129
+ });
130
+ };
131
+
132
+ const findShadowRoot = element => {
133
+ if (!document.documentElement.attachShadow) {
134
+ return null;
135
+ } // Can find the shadow root otherwise it'll return the document
136
+
137
+
138
+ if (typeof element.getRootNode === 'function') {
139
+ const root = element.getRootNode();
140
+ return root instanceof ShadowRoot ? root : null;
141
+ }
142
+
143
+ if (element instanceof ShadowRoot) {
144
+ return element;
145
+ } // when we don't find a shadow root
146
+
147
+
148
+ if (!element.parentNode) {
149
+ return null;
150
+ }
151
+
152
+ return findShadowRoot(element.parentNode);
153
+ };
154
+
155
+ const noop = () => {};
156
+
157
+ const getjQuery = () => {
158
+ const {
159
+ jQuery
160
+ } = window;
161
+
162
+ if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
163
+ return jQuery;
164
+ }
165
+
166
+ return null;
167
+ };
168
+
169
+ const onDOMContentLoaded = callback => {
170
+ if (document.readyState === 'loading') {
171
+ document.addEventListener('DOMContentLoaded', callback);
35
172
  } else {
36
- obj[key] = value;
173
+ callback();
37
174
  }
175
+ };
38
176
 
39
- return obj;
40
- }
177
+ const isRTL = () => document.documentElement.dir === 'rtl';
178
+
179
+ const defineJQueryPlugin = (name, plugin) => {
180
+ onDOMContentLoaded(() => {
181
+ const $ = getjQuery();
182
+ /* istanbul ignore if */
41
183
 
42
- function _objectSpread(target) {
43
- for (var i = 1; i < arguments.length; i++) {
44
- var source = arguments[i] != null ? arguments[i] : {};
45
- var ownKeys = Object.keys(source);
184
+ if ($) {
185
+ const JQUERY_NO_CONFLICT = $.fn[name];
186
+ $.fn[name] = plugin.jQueryInterface;
187
+ $.fn[name].Constructor = plugin;
46
188
 
47
- if (typeof Object.getOwnPropertySymbols === 'function') {
48
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
49
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
50
- }));
189
+ $.fn[name].noConflict = () => {
190
+ $.fn[name] = JQUERY_NO_CONFLICT;
191
+ return plugin.jQueryInterface;
192
+ };
51
193
  }
194
+ });
195
+ };
196
+
197
+ /**
198
+ * --------------------------------------------------------------------------
199
+ * Bootstrap (v5.0.0): util/sanitizer.js
200
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
201
+ * --------------------------------------------------------------------------
202
+ */
203
+ const uriAttrs = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
204
+ const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
205
+ /**
206
+ * A pattern that recognizes a commonly useful subset of URLs that are safe.
207
+ *
208
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
209
+ */
52
210
 
53
- ownKeys.forEach(function (key) {
54
- _defineProperty(target, key, source[key]);
211
+ const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i;
212
+ /**
213
+ * A pattern that matches safe data URLs. Only matches image, video and audio types.
214
+ *
215
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
216
+ */
217
+
218
+ const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
219
+
220
+ const allowedAttribute = (attr, allowedAttributeList) => {
221
+ const attrName = attr.nodeName.toLowerCase();
222
+
223
+ if (allowedAttributeList.includes(attrName)) {
224
+ if (uriAttrs.has(attrName)) {
225
+ return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue));
226
+ }
227
+
228
+ return true;
229
+ }
230
+
231
+ const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp); // Check if a regular expression validates the attribute.
232
+
233
+ for (let i = 0, len = regExp.length; i < len; i++) {
234
+ if (regExp[i].test(attrName)) {
235
+ return true;
236
+ }
237
+ }
238
+
239
+ return false;
240
+ };
241
+
242
+ const DefaultAllowlist = {
243
+ // Global attributes allowed on any supplied element below.
244
+ '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
245
+ a: ['target', 'href', 'title', 'rel'],
246
+ area: [],
247
+ b: [],
248
+ br: [],
249
+ col: [],
250
+ code: [],
251
+ div: [],
252
+ em: [],
253
+ hr: [],
254
+ h1: [],
255
+ h2: [],
256
+ h3: [],
257
+ h4: [],
258
+ h5: [],
259
+ h6: [],
260
+ i: [],
261
+ img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
262
+ li: [],
263
+ ol: [],
264
+ p: [],
265
+ pre: [],
266
+ s: [],
267
+ small: [],
268
+ span: [],
269
+ sub: [],
270
+ sup: [],
271
+ strong: [],
272
+ u: [],
273
+ ul: []
274
+ };
275
+ function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {
276
+ if (!unsafeHtml.length) {
277
+ return unsafeHtml;
278
+ }
279
+
280
+ if (sanitizeFn && typeof sanitizeFn === 'function') {
281
+ return sanitizeFn(unsafeHtml);
282
+ }
283
+
284
+ const domParser = new window.DOMParser();
285
+ const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
286
+ const allowlistKeys = Object.keys(allowList);
287
+ const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
288
+
289
+ for (let i = 0, len = elements.length; i < len; i++) {
290
+ const el = elements[i];
291
+ const elName = el.nodeName.toLowerCase();
292
+
293
+ if (!allowlistKeys.includes(elName)) {
294
+ el.parentNode.removeChild(el);
295
+ continue;
296
+ }
297
+
298
+ const attributeList = [].concat(...el.attributes);
299
+ const allowedAttributes = [].concat(allowList['*'] || [], allowList[elName] || []);
300
+ attributeList.forEach(attr => {
301
+ if (!allowedAttribute(attr, allowedAttributes)) {
302
+ el.removeAttribute(attr.nodeName);
303
+ }
55
304
  });
56
305
  }
57
306
 
58
- return target;
307
+ return createdDocument.body.innerHTML;
59
308
  }
60
309
 
61
310
  /**
62
311
  * --------------------------------------------------------------------------
63
- * Bootstrap (v4.1.3): tooltip.js
64
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
312
+ * Bootstrap (v5.0.0): tooltip.js
313
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
65
314
  * --------------------------------------------------------------------------
66
315
  */
316
+ /**
317
+ * ------------------------------------------------------------------------
318
+ * Constants
319
+ * ------------------------------------------------------------------------
320
+ */
67
321
 
68
- var Tooltip = function ($$$1) {
69
- /**
70
- * ------------------------------------------------------------------------
71
- * Constants
72
- * ------------------------------------------------------------------------
73
- */
74
- var NAME = 'tooltip';
75
- var VERSION = '4.1.3';
76
- var DATA_KEY = 'bs.tooltip';
77
- var EVENT_KEY = "." + DATA_KEY;
78
- var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
79
- var CLASS_PREFIX = 'bs-tooltip';
80
- var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
81
- var DefaultType = {
82
- animation: 'boolean',
83
- template: 'string',
84
- title: '(string|element|function)',
85
- trigger: 'string',
86
- delay: '(number|object)',
87
- html: 'boolean',
88
- selector: '(string|boolean)',
89
- placement: '(string|function)',
90
- offset: '(number|string)',
91
- container: '(string|element|boolean)',
92
- fallbackPlacement: '(string|array)',
93
- boundary: '(string|element)'
94
- };
95
- var AttachmentMap = {
96
- AUTO: 'auto',
97
- TOP: 'top',
98
- RIGHT: 'right',
99
- BOTTOM: 'bottom',
100
- LEFT: 'left'
101
- };
102
- var Default = {
103
- animation: true,
104
- template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div></div>',
105
- trigger: 'hover focus',
106
- title: '',
107
- delay: 0,
108
- html: false,
109
- selector: false,
110
- placement: 'top',
111
- offset: 0,
112
- container: false,
113
- fallbackPlacement: 'flip',
114
- boundary: 'scrollParent'
115
- };
116
- var HoverState = {
117
- SHOW: 'show',
118
- OUT: 'out'
119
- };
120
- var Event = {
121
- HIDE: "hide" + EVENT_KEY,
122
- HIDDEN: "hidden" + EVENT_KEY,
123
- SHOW: "show" + EVENT_KEY,
124
- SHOWN: "shown" + EVENT_KEY,
125
- INSERTED: "inserted" + EVENT_KEY,
126
- CLICK: "click" + EVENT_KEY,
127
- FOCUSIN: "focusin" + EVENT_KEY,
128
- FOCUSOUT: "focusout" + EVENT_KEY,
129
- MOUSEENTER: "mouseenter" + EVENT_KEY,
130
- MOUSELEAVE: "mouseleave" + EVENT_KEY
131
- };
132
- var ClassName = {
133
- FADE: 'fade',
134
- SHOW: 'show'
135
- };
136
- var Selector = {
137
- TOOLTIP: '.tooltip',
138
- TOOLTIP_INNER: '.tooltip-inner',
139
- ARROW: '.arrow'
140
- };
141
- var Trigger = {
142
- HOVER: 'hover',
143
- FOCUS: 'focus',
144
- CLICK: 'click',
145
- MANUAL: 'manual'
146
- /**
147
- * ------------------------------------------------------------------------
148
- * Class Definition
149
- * ------------------------------------------------------------------------
150
- */
151
-
152
- };
153
-
154
- var Tooltip =
155
- /*#__PURE__*/
156
- function () {
157
- function Tooltip(element, config) {
158
- /**
159
- * Check for Popper dependency
160
- * Popper - https://popper.js.org
161
- */
162
- if (typeof Popper === 'undefined') {
163
- throw new TypeError('Bootstrap tooltips require Popper.js (https://popper.js.org)');
164
- } // private
165
-
166
-
167
- this._isEnabled = true;
168
- this._timeout = 0;
169
- this._hoverState = '';
170
- this._activeTrigger = {};
171
- this._popper = null; // Protected
172
-
173
- this.element = element;
174
- this.config = this._getConfig(config);
175
- this.tip = null;
176
-
177
- this._setListeners();
178
- } // Getters
179
-
180
-
181
- var _proto = Tooltip.prototype;
182
-
183
- // Public
184
- _proto.enable = function enable() {
185
- this._isEnabled = true;
186
- };
322
+ const NAME = 'tooltip';
323
+ const DATA_KEY = 'bs.tooltip';
324
+ const EVENT_KEY = `.${DATA_KEY}`;
325
+ const CLASS_PREFIX = 'bs-tooltip';
326
+ const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g');
327
+ const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
328
+ const DefaultType = {
329
+ animation: 'boolean',
330
+ template: 'string',
331
+ title: '(string|element|function)',
332
+ trigger: 'string',
333
+ delay: '(number|object)',
334
+ html: 'boolean',
335
+ selector: '(string|boolean)',
336
+ placement: '(string|function)',
337
+ offset: '(array|string|function)',
338
+ container: '(string|element|boolean)',
339
+ fallbackPlacements: 'array',
340
+ boundary: '(string|element)',
341
+ customClass: '(string|function)',
342
+ sanitize: 'boolean',
343
+ sanitizeFn: '(null|function)',
344
+ allowList: 'object',
345
+ popperConfig: '(null|object|function)'
346
+ };
347
+ const AttachmentMap = {
348
+ AUTO: 'auto',
349
+ TOP: 'top',
350
+ RIGHT: isRTL() ? 'left' : 'right',
351
+ BOTTOM: 'bottom',
352
+ LEFT: isRTL() ? 'right' : 'left'
353
+ };
354
+ const Default = {
355
+ animation: true,
356
+ template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div>' + '</div>',
357
+ trigger: 'hover focus',
358
+ title: '',
359
+ delay: 0,
360
+ html: false,
361
+ selector: false,
362
+ placement: 'top',
363
+ offset: [0, 0],
364
+ container: false,
365
+ fallbackPlacements: ['top', 'right', 'bottom', 'left'],
366
+ boundary: 'clippingParents',
367
+ customClass: '',
368
+ sanitize: true,
369
+ sanitizeFn: null,
370
+ allowList: DefaultAllowlist,
371
+ popperConfig: null
372
+ };
373
+ const Event$1 = {
374
+ HIDE: `hide${EVENT_KEY}`,
375
+ HIDDEN: `hidden${EVENT_KEY}`,
376
+ SHOW: `show${EVENT_KEY}`,
377
+ SHOWN: `shown${EVENT_KEY}`,
378
+ INSERTED: `inserted${EVENT_KEY}`,
379
+ CLICK: `click${EVENT_KEY}`,
380
+ FOCUSIN: `focusin${EVENT_KEY}`,
381
+ FOCUSOUT: `focusout${EVENT_KEY}`,
382
+ MOUSEENTER: `mouseenter${EVENT_KEY}`,
383
+ MOUSELEAVE: `mouseleave${EVENT_KEY}`
384
+ };
385
+ const CLASS_NAME_FADE = 'fade';
386
+ const CLASS_NAME_MODAL = 'modal';
387
+ const CLASS_NAME_SHOW = 'show';
388
+ const HOVER_STATE_SHOW = 'show';
389
+ const HOVER_STATE_OUT = 'out';
390
+ const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
391
+ const TRIGGER_HOVER = 'hover';
392
+ const TRIGGER_FOCUS = 'focus';
393
+ const TRIGGER_CLICK = 'click';
394
+ const TRIGGER_MANUAL = 'manual';
395
+ /**
396
+ * ------------------------------------------------------------------------
397
+ * Class Definition
398
+ * ------------------------------------------------------------------------
399
+ */
187
400
 
188
- _proto.disable = function disable() {
189
- this._isEnabled = false;
190
- };
401
+ class Tooltip extends BaseComponent__default['default'] {
402
+ constructor(element, config) {
403
+ if (typeof Popper__namespace === 'undefined') {
404
+ throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)');
405
+ }
191
406
 
192
- _proto.toggleEnabled = function toggleEnabled() {
193
- this._isEnabled = !this._isEnabled;
194
- };
407
+ super(element); // private
195
408
 
196
- _proto.toggle = function toggle(event) {
197
- if (!this._isEnabled) {
198
- return;
199
- }
409
+ this._isEnabled = true;
410
+ this._timeout = 0;
411
+ this._hoverState = '';
412
+ this._activeTrigger = {};
413
+ this._popper = null; // Protected
200
414
 
201
- if (event) {
202
- var dataKey = this.constructor.DATA_KEY;
203
- var context = $$$1(event.currentTarget).data(dataKey);
415
+ this.config = this._getConfig(config);
416
+ this.tip = null;
204
417
 
205
- if (!context) {
206
- context = new this.constructor(event.currentTarget, this._getDelegateConfig());
207
- $$$1(event.currentTarget).data(dataKey, context);
208
- }
418
+ this._setListeners();
419
+ } // Getters
209
420
 
210
- context._activeTrigger.click = !context._activeTrigger.click;
211
421
 
212
- if (context._isWithActiveTrigger()) {
213
- context._enter(null, context);
214
- } else {
215
- context._leave(null, context);
216
- }
217
- } else {
218
- if ($$$1(this.getTipElement()).hasClass(ClassName.SHOW)) {
219
- this._leave(null, this);
422
+ static get Default() {
423
+ return Default;
424
+ }
220
425
 
221
- return;
222
- }
426
+ static get NAME() {
427
+ return NAME;
428
+ }
223
429
 
224
- this._enter(null, this);
225
- }
226
- };
430
+ static get DATA_KEY() {
431
+ return DATA_KEY;
432
+ }
227
433
 
228
- _proto.dispose = function dispose() {
229
- clearTimeout(this._timeout);
230
- $$$1.removeData(this.element, this.constructor.DATA_KEY);
231
- $$$1(this.element).off(this.constructor.EVENT_KEY);
232
- $$$1(this.element).closest('.modal').off('hide.bs.modal');
434
+ static get Event() {
435
+ return Event$1;
436
+ }
233
437
 
234
- if (this.tip) {
235
- $$$1(this.tip).remove();
236
- }
438
+ static get EVENT_KEY() {
439
+ return EVENT_KEY;
440
+ }
237
441
 
238
- this._isEnabled = null;
239
- this._timeout = null;
240
- this._hoverState = null;
241
- this._activeTrigger = null;
442
+ static get DefaultType() {
443
+ return DefaultType;
444
+ } // Public
242
445
 
243
- if (this._popper !== null) {
244
- this._popper.destroy();
245
- }
246
446
 
247
- this._popper = null;
248
- this.element = null;
249
- this.config = null;
250
- this.tip = null;
251
- };
447
+ enable() {
448
+ this._isEnabled = true;
449
+ }
450
+
451
+ disable() {
452
+ this._isEnabled = false;
453
+ }
454
+
455
+ toggleEnabled() {
456
+ this._isEnabled = !this._isEnabled;
457
+ }
252
458
 
253
- _proto.show = function show() {
254
- var _this = this;
459
+ toggle(event) {
460
+ if (!this._isEnabled) {
461
+ return;
462
+ }
463
+
464
+ if (event) {
465
+ const context = this._initializeOnDelegatedTarget(event);
466
+
467
+ context._activeTrigger.click = !context._activeTrigger.click;
255
468
 
256
- if ($$$1(this.element).css('display') === 'none') {
257
- throw new Error('Please use show on visible elements');
469
+ if (context._isWithActiveTrigger()) {
470
+ context._enter(null, context);
471
+ } else {
472
+ context._leave(null, context);
258
473
  }
474
+ } else {
475
+ if (this.getTipElement().classList.contains(CLASS_NAME_SHOW)) {
476
+ this._leave(null, this);
259
477
 
260
- var showEvent = $$$1.Event(this.constructor.Event.SHOW);
478
+ return;
479
+ }
261
480
 
262
- if (this.isWithContent() && this._isEnabled) {
263
- $$$1(this.element).trigger(showEvent);
264
- var isInTheDom = $$$1.contains(this.element.ownerDocument.documentElement, this.element);
481
+ this._enter(null, this);
482
+ }
483
+ }
265
484
 
266
- if (showEvent.isDefaultPrevented() || !isInTheDom) {
267
- return;
268
- }
485
+ dispose() {
486
+ clearTimeout(this._timeout);
487
+ EventHandler__default['default'].off(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler);
269
488
 
270
- var tip = this.getTipElement();
271
- var tipId = Util.getUID(this.constructor.NAME);
272
- tip.setAttribute('id', tipId);
273
- this.element.setAttribute('aria-describedby', tipId);
274
- this.setContent();
489
+ if (this.tip && this.tip.parentNode) {
490
+ this.tip.parentNode.removeChild(this.tip);
491
+ }
275
492
 
276
- if (this.config.animation) {
277
- $$$1(tip).addClass(ClassName.FADE);
278
- }
493
+ this._isEnabled = null;
494
+ this._timeout = null;
495
+ this._hoverState = null;
496
+ this._activeTrigger = null;
279
497
 
280
- var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
498
+ if (this._popper) {
499
+ this._popper.destroy();
500
+ }
281
501
 
282
- var attachment = this._getAttachment(placement);
502
+ this._popper = null;
503
+ this.config = null;
504
+ this.tip = null;
505
+ super.dispose();
506
+ }
283
507
 
284
- this.addAttachmentClass(attachment);
285
- var container = this.config.container === false ? document.body : $$$1(document).find(this.config.container);
286
- $$$1(tip).data(this.constructor.DATA_KEY, this);
508
+ show() {
509
+ if (this._element.style.display === 'none') {
510
+ throw new Error('Please use show on visible elements');
511
+ }
287
512
 
288
- if (!$$$1.contains(this.element.ownerDocument.documentElement, this.tip)) {
289
- $$$1(tip).appendTo(container);
290
- }
513
+ if (!(this.isWithContent() && this._isEnabled)) {
514
+ return;
515
+ }
291
516
 
292
- $$$1(this.element).trigger(this.constructor.Event.INSERTED);
293
- this._popper = new Popper(this.element, tip, {
294
- placement: attachment,
295
- modifiers: {
296
- offset: {
297
- offset: this.config.offset
298
- },
299
- flip: {
300
- behavior: this.config.fallbackPlacement
301
- },
302
- arrow: {
303
- element: Selector.ARROW
304
- },
305
- preventOverflow: {
306
- boundariesElement: this.config.boundary
307
- }
308
- },
309
- onCreate: function onCreate(data) {
310
- if (data.originalPlacement !== data.placement) {
311
- _this._handlePopperPlacementChange(data);
312
- }
313
- },
314
- onUpdate: function onUpdate(data) {
315
- _this._handlePopperPlacementChange(data);
316
- }
317
- });
318
- $$$1(tip).addClass(ClassName.SHOW); // If this is a touch-enabled device we add extra
319
- // empty mouseover listeners to the body's immediate children;
320
- // only needed because of broken event delegation on iOS
321
- // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
517
+ const showEvent = EventHandler__default['default'].trigger(this._element, this.constructor.Event.SHOW);
518
+ const shadowRoot = findShadowRoot(this._element);
519
+ const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element);
322
520
 
323
- if ('ontouchstart' in document.documentElement) {
324
- $$$1(document.body).children().on('mouseover', null, $$$1.noop);
325
- }
521
+ if (showEvent.defaultPrevented || !isInTheDom) {
522
+ return;
523
+ }
326
524
 
327
- var complete = function complete() {
328
- if (_this.config.animation) {
329
- _this._fixTransition();
330
- }
525
+ const tip = this.getTipElement();
526
+ const tipId = getUID(this.constructor.NAME);
527
+ tip.setAttribute('id', tipId);
331
528
 
332
- var prevHoverState = _this._hoverState;
333
- _this._hoverState = null;
334
- $$$1(_this.element).trigger(_this.constructor.Event.SHOWN);
529
+ this._element.setAttribute('aria-describedby', tipId);
335
530
 
336
- if (prevHoverState === HoverState.OUT) {
337
- _this._leave(null, _this);
338
- }
339
- };
531
+ this.setContent();
340
532
 
341
- if ($$$1(this.tip).hasClass(ClassName.FADE)) {
342
- var transitionDuration = Util.getTransitionDurationFromElement(this.tip);
343
- $$$1(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
344
- } else {
345
- complete();
346
- }
347
- }
348
- };
533
+ if (this.config.animation) {
534
+ tip.classList.add(CLASS_NAME_FADE);
535
+ }
349
536
 
350
- _proto.hide = function hide(callback) {
351
- var _this2 = this;
537
+ const placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this._element) : this.config.placement;
352
538
 
353
- var tip = this.getTipElement();
354
- var hideEvent = $$$1.Event(this.constructor.Event.HIDE);
539
+ const attachment = this._getAttachment(placement);
355
540
 
356
- var complete = function complete() {
357
- if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {
358
- tip.parentNode.removeChild(tip);
359
- }
541
+ this._addAttachmentClass(attachment);
360
542
 
361
- _this2._cleanTipClass();
543
+ const container = this._getContainer();
362
544
 
363
- _this2.element.removeAttribute('aria-describedby');
545
+ Data__default['default'].set(tip, this.constructor.DATA_KEY, this);
364
546
 
365
- $$$1(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
547
+ if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
548
+ container.appendChild(tip);
549
+ EventHandler__default['default'].trigger(this._element, this.constructor.Event.INSERTED);
550
+ }
366
551
 
367
- if (_this2._popper !== null) {
368
- _this2._popper.destroy();
369
- }
552
+ if (this._popper) {
553
+ this._popper.update();
554
+ } else {
555
+ this._popper = Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));
556
+ }
370
557
 
371
- if (callback) {
372
- callback();
373
- }
374
- };
558
+ tip.classList.add(CLASS_NAME_SHOW);
559
+ const customClass = typeof this.config.customClass === 'function' ? this.config.customClass() : this.config.customClass;
375
560
 
376
- $$$1(this.element).trigger(hideEvent);
561
+ if (customClass) {
562
+ tip.classList.add(...customClass.split(' '));
563
+ } // If this is a touch-enabled device we add extra
564
+ // empty mouseover listeners to the body's immediate children;
565
+ // only needed because of broken event delegation on iOS
566
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
377
567
 
378
- if (hideEvent.isDefaultPrevented()) {
379
- return;
380
- }
381
568
 
382
- $$$1(tip).removeClass(ClassName.SHOW); // If this is a touch-enabled device we remove the extra
383
- // empty mouseover listeners we added for iOS support
569
+ if ('ontouchstart' in document.documentElement) {
570
+ [].concat(...document.body.children).forEach(element => {
571
+ EventHandler__default['default'].on(element, 'mouseover', noop);
572
+ });
573
+ }
574
+
575
+ const complete = () => {
576
+ const prevHoverState = this._hoverState;
577
+ this._hoverState = null;
578
+ EventHandler__default['default'].trigger(this._element, this.constructor.Event.SHOWN);
384
579
 
385
- if ('ontouchstart' in document.documentElement) {
386
- $$$1(document.body).children().off('mouseover', null, $$$1.noop);
580
+ if (prevHoverState === HOVER_STATE_OUT) {
581
+ this._leave(null, this);
387
582
  }
583
+ };
584
+
585
+ if (this.tip.classList.contains(CLASS_NAME_FADE)) {
586
+ const transitionDuration = getTransitionDurationFromElement(this.tip);
587
+ EventHandler__default['default'].one(this.tip, 'transitionend', complete);
588
+ emulateTransitionEnd(this.tip, transitionDuration);
589
+ } else {
590
+ complete();
591
+ }
592
+ }
388
593
 
389
- this._activeTrigger[Trigger.CLICK] = false;
390
- this._activeTrigger[Trigger.FOCUS] = false;
391
- this._activeTrigger[Trigger.HOVER] = false;
594
+ hide() {
595
+ if (!this._popper) {
596
+ return;
597
+ }
392
598
 
393
- if ($$$1(this.tip).hasClass(ClassName.FADE)) {
394
- var transitionDuration = Util.getTransitionDurationFromElement(tip);
395
- $$$1(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
396
- } else {
397
- complete();
398
- }
599
+ const tip = this.getTipElement();
399
600
 
400
- this._hoverState = '';
401
- };
601
+ const complete = () => {
602
+ if (this._isWithActiveTrigger()) {
603
+ return;
604
+ }
402
605
 
403
- _proto.update = function update() {
404
- if (this._popper !== null) {
405
- this._popper.scheduleUpdate();
606
+ if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {
607
+ tip.parentNode.removeChild(tip);
406
608
  }
407
- }; // Protected
408
609
 
610
+ this._cleanTipClass();
409
611
 
410
- _proto.isWithContent = function isWithContent() {
411
- return Boolean(this.getTitle());
412
- };
612
+ this._element.removeAttribute('aria-describedby');
413
613
 
414
- _proto.addAttachmentClass = function addAttachmentClass(attachment) {
415
- $$$1(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
614
+ EventHandler__default['default'].trigger(this._element, this.constructor.Event.HIDDEN);
615
+
616
+ if (this._popper) {
617
+ this._popper.destroy();
618
+
619
+ this._popper = null;
620
+ }
416
621
  };
417
622
 
418
- _proto.getTipElement = function getTipElement() {
419
- this.tip = this.tip || $$$1(this.config.template)[0];
623
+ const hideEvent = EventHandler__default['default'].trigger(this._element, this.constructor.Event.HIDE);
624
+
625
+ if (hideEvent.defaultPrevented) {
626
+ return;
627
+ }
628
+
629
+ tip.classList.remove(CLASS_NAME_SHOW); // If this is a touch-enabled device we remove the extra
630
+ // empty mouseover listeners we added for iOS support
631
+
632
+ if ('ontouchstart' in document.documentElement) {
633
+ [].concat(...document.body.children).forEach(element => EventHandler__default['default'].off(element, 'mouseover', noop));
634
+ }
635
+
636
+ this._activeTrigger[TRIGGER_CLICK] = false;
637
+ this._activeTrigger[TRIGGER_FOCUS] = false;
638
+ this._activeTrigger[TRIGGER_HOVER] = false;
639
+
640
+ if (this.tip.classList.contains(CLASS_NAME_FADE)) {
641
+ const transitionDuration = getTransitionDurationFromElement(tip);
642
+ EventHandler__default['default'].one(tip, 'transitionend', complete);
643
+ emulateTransitionEnd(tip, transitionDuration);
644
+ } else {
645
+ complete();
646
+ }
647
+
648
+ this._hoverState = '';
649
+ }
650
+
651
+ update() {
652
+ if (this._popper !== null) {
653
+ this._popper.update();
654
+ }
655
+ } // Protected
656
+
657
+
658
+ isWithContent() {
659
+ return Boolean(this.getTitle());
660
+ }
661
+
662
+ getTipElement() {
663
+ if (this.tip) {
420
664
  return this.tip;
421
- };
665
+ }
422
666
 
423
- _proto.setContent = function setContent() {
424
- var tip = this.getTipElement();
425
- this.setElementContent($$$1(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle());
426
- $$$1(tip).removeClass(ClassName.FADE + " " + ClassName.SHOW);
427
- };
667
+ const element = document.createElement('div');
668
+ element.innerHTML = this.config.template;
669
+ this.tip = element.children[0];
670
+ return this.tip;
671
+ }
428
672
 
429
- _proto.setElementContent = function setElementContent($element, content) {
430
- var html = this.config.html;
673
+ setContent() {
674
+ const tip = this.getTipElement();
675
+ this.setElementContent(SelectorEngine__default['default'].findOne(SELECTOR_TOOLTIP_INNER, tip), this.getTitle());
676
+ tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW);
677
+ }
431
678
 
432
- if (typeof content === 'object' && (content.nodeType || content.jquery)) {
433
- // Content is a DOM node or a jQuery
434
- if (html) {
435
- if (!$$$1(content).parent().is($element)) {
436
- $element.empty().append(content);
437
- }
438
- } else {
439
- $element.text($$$1(content).text());
679
+ setElementContent(element, content) {
680
+ if (element === null) {
681
+ return;
682
+ }
683
+
684
+ if (typeof content === 'object' && isElement(content)) {
685
+ if (content.jquery) {
686
+ content = content[0];
687
+ } // content is a DOM node or a jQuery
688
+
689
+
690
+ if (this.config.html) {
691
+ if (content.parentNode !== element) {
692
+ element.innerHTML = '';
693
+ element.appendChild(content);
440
694
  }
441
695
  } else {
442
- $element[html ? 'html' : 'text'](content);
696
+ element.textContent = content.textContent;
443
697
  }
444
- };
445
698
 
446
- _proto.getTitle = function getTitle() {
447
- var title = this.element.getAttribute('data-original-title');
699
+ return;
700
+ }
448
701
 
449
- if (!title) {
450
- title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
702
+ if (this.config.html) {
703
+ if (this.config.sanitize) {
704
+ content = sanitizeHtml(content, this.config.allowList, this.config.sanitizeFn);
451
705
  }
452
706
 
453
- return title;
454
- }; // Private
707
+ element.innerHTML = content;
708
+ } else {
709
+ element.textContent = content;
710
+ }
711
+ }
455
712
 
713
+ getTitle() {
714
+ let title = this._element.getAttribute('data-bs-original-title');
456
715
 
457
- _proto._getAttachment = function _getAttachment(placement) {
458
- return AttachmentMap[placement.toUpperCase()];
459
- };
716
+ if (!title) {
717
+ title = typeof this.config.title === 'function' ? this.config.title.call(this._element) : this.config.title;
718
+ }
460
719
 
461
- _proto._setListeners = function _setListeners() {
462
- var _this3 = this;
463
-
464
- var triggers = this.config.trigger.split(' ');
465
- triggers.forEach(function (trigger) {
466
- if (trigger === 'click') {
467
- $$$1(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) {
468
- return _this3.toggle(event);
469
- });
470
- } else if (trigger !== Trigger.MANUAL) {
471
- var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;
472
- var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;
473
- $$$1(_this3.element).on(eventIn, _this3.config.selector, function (event) {
474
- return _this3._enter(event);
475
- }).on(eventOut, _this3.config.selector, function (event) {
476
- return _this3._leave(event);
477
- });
478
- }
720
+ return title;
721
+ }
479
722
 
480
- $$$1(_this3.element).closest('.modal').on('hide.bs.modal', function () {
481
- return _this3.hide();
482
- });
483
- });
723
+ updateAttachment(attachment) {
724
+ if (attachment === 'right') {
725
+ return 'end';
726
+ }
484
727
 
485
- if (this.config.selector) {
486
- this.config = _objectSpread({}, this.config, {
487
- trigger: 'manual',
488
- selector: ''
489
- });
490
- } else {
491
- this._fixTitle();
492
- }
493
- };
728
+ if (attachment === 'left') {
729
+ return 'start';
730
+ }
494
731
 
495
- _proto._fixTitle = function _fixTitle() {
496
- var titleType = typeof this.element.getAttribute('data-original-title');
732
+ return attachment;
733
+ } // Private
497
734
 
498
- if (this.element.getAttribute('title') || titleType !== 'string') {
499
- this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
500
- this.element.setAttribute('title', '');
501
- }
502
- };
503
735
 
504
- _proto._enter = function _enter(event, context) {
505
- var dataKey = this.constructor.DATA_KEY;
506
- context = context || $$$1(event.currentTarget).data(dataKey);
736
+ _initializeOnDelegatedTarget(event, context) {
737
+ const dataKey = this.constructor.DATA_KEY;
738
+ context = context || Data__default['default'].get(event.delegateTarget, dataKey);
507
739
 
508
- if (!context) {
509
- context = new this.constructor(event.currentTarget, this._getDelegateConfig());
510
- $$$1(event.currentTarget).data(dataKey, context);
511
- }
740
+ if (!context) {
741
+ context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
742
+ Data__default['default'].set(event.delegateTarget, dataKey, context);
743
+ }
512
744
 
513
- if (event) {
514
- context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
515
- }
745
+ return context;
746
+ }
516
747
 
517
- if ($$$1(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
518
- context._hoverState = HoverState.SHOW;
519
- return;
520
- }
748
+ _getOffset() {
749
+ const {
750
+ offset
751
+ } = this.config;
521
752
 
522
- clearTimeout(context._timeout);
523
- context._hoverState = HoverState.SHOW;
753
+ if (typeof offset === 'string') {
754
+ return offset.split(',').map(val => Number.parseInt(val, 10));
755
+ }
524
756
 
525
- if (!context.config.delay || !context.config.delay.show) {
526
- context.show();
527
- return;
528
- }
757
+ if (typeof offset === 'function') {
758
+ return popperData => offset(popperData, this._element);
759
+ }
529
760
 
530
- context._timeout = setTimeout(function () {
531
- if (context._hoverState === HoverState.SHOW) {
532
- context.show();
761
+ return offset;
762
+ }
763
+
764
+ _getPopperConfig(attachment) {
765
+ const defaultBsPopperConfig = {
766
+ placement: attachment,
767
+ modifiers: [{
768
+ name: 'flip',
769
+ options: {
770
+ fallbackPlacements: this.config.fallbackPlacements
771
+ }
772
+ }, {
773
+ name: 'offset',
774
+ options: {
775
+ offset: this._getOffset()
533
776
  }
534
- }, context.config.delay.show);
777
+ }, {
778
+ name: 'preventOverflow',
779
+ options: {
780
+ boundary: this.config.boundary
781
+ }
782
+ }, {
783
+ name: 'arrow',
784
+ options: {
785
+ element: `.${this.constructor.NAME}-arrow`
786
+ }
787
+ }, {
788
+ name: 'onChange',
789
+ enabled: true,
790
+ phase: 'afterWrite',
791
+ fn: data => this._handlePopperPlacementChange(data)
792
+ }],
793
+ onFirstUpdate: data => {
794
+ if (data.options.placement !== data.placement) {
795
+ this._handlePopperPlacementChange(data);
796
+ }
797
+ }
798
+ };
799
+ return { ...defaultBsPopperConfig,
800
+ ...(typeof this.config.popperConfig === 'function' ? this.config.popperConfig(defaultBsPopperConfig) : this.config.popperConfig)
535
801
  };
802
+ }
536
803
 
537
- _proto._leave = function _leave(event, context) {
538
- var dataKey = this.constructor.DATA_KEY;
539
- context = context || $$$1(event.currentTarget).data(dataKey);
804
+ _addAttachmentClass(attachment) {
805
+ this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`);
806
+ }
540
807
 
541
- if (!context) {
542
- context = new this.constructor(event.currentTarget, this._getDelegateConfig());
543
- $$$1(event.currentTarget).data(dataKey, context);
544
- }
808
+ _getContainer() {
809
+ if (this.config.container === false) {
810
+ return document.body;
811
+ }
545
812
 
546
- if (event) {
547
- context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
548
- }
813
+ if (isElement(this.config.container)) {
814
+ return this.config.container;
815
+ }
549
816
 
550
- if (context._isWithActiveTrigger()) {
551
- return;
552
- }
817
+ return SelectorEngine__default['default'].findOne(this.config.container);
818
+ }
553
819
 
554
- clearTimeout(context._timeout);
555
- context._hoverState = HoverState.OUT;
820
+ _getAttachment(placement) {
821
+ return AttachmentMap[placement.toUpperCase()];
822
+ }
556
823
 
557
- if (!context.config.delay || !context.config.delay.hide) {
558
- context.hide();
559
- return;
824
+ _setListeners() {
825
+ const triggers = this.config.trigger.split(' ');
826
+ triggers.forEach(trigger => {
827
+ if (trigger === 'click') {
828
+ EventHandler__default['default'].on(this._element, this.constructor.Event.CLICK, this.config.selector, event => this.toggle(event));
829
+ } else if (trigger !== TRIGGER_MANUAL) {
830
+ const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN;
831
+ const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT;
832
+ EventHandler__default['default'].on(this._element, eventIn, this.config.selector, event => this._enter(event));
833
+ EventHandler__default['default'].on(this._element, eventOut, this.config.selector, event => this._leave(event));
560
834
  }
835
+ });
561
836
 
562
- context._timeout = setTimeout(function () {
563
- if (context._hoverState === HoverState.OUT) {
564
- context.hide();
565
- }
566
- }, context.config.delay.hide);
837
+ this._hideModalHandler = () => {
838
+ if (this._element) {
839
+ this.hide();
840
+ }
567
841
  };
568
842
 
569
- _proto._isWithActiveTrigger = function _isWithActiveTrigger() {
570
- for (var trigger in this._activeTrigger) {
571
- if (this._activeTrigger[trigger]) {
572
- return true;
573
- }
574
- }
843
+ EventHandler__default['default'].on(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler);
575
844
 
576
- return false;
577
- };
845
+ if (this.config.selector) {
846
+ this.config = { ...this.config,
847
+ trigger: 'manual',
848
+ selector: ''
849
+ };
850
+ } else {
851
+ this._fixTitle();
852
+ }
853
+ }
578
854
 
579
- _proto._getConfig = function _getConfig(config) {
580
- config = _objectSpread({}, this.constructor.Default, $$$1(this.element).data(), typeof config === 'object' && config ? config : {});
855
+ _fixTitle() {
856
+ const title = this._element.getAttribute('title');
581
857
 
582
- if (typeof config.delay === 'number') {
583
- config.delay = {
584
- show: config.delay,
585
- hide: config.delay
586
- };
587
- }
858
+ const originalTitleType = typeof this._element.getAttribute('data-bs-original-title');
859
+
860
+ if (title || originalTitleType !== 'string') {
861
+ this._element.setAttribute('data-bs-original-title', title || '');
588
862
 
589
- if (typeof config.title === 'number') {
590
- config.title = config.title.toString();
863
+ if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {
864
+ this._element.setAttribute('aria-label', title);
591
865
  }
592
866
 
593
- if (typeof config.content === 'number') {
594
- config.content = config.content.toString();
867
+ this._element.setAttribute('title', '');
868
+ }
869
+ }
870
+
871
+ _enter(event, context) {
872
+ context = this._initializeOnDelegatedTarget(event, context);
873
+
874
+ if (event) {
875
+ context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
876
+ }
877
+
878
+ if (context.getTipElement().classList.contains(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {
879
+ context._hoverState = HOVER_STATE_SHOW;
880
+ return;
881
+ }
882
+
883
+ clearTimeout(context._timeout);
884
+ context._hoverState = HOVER_STATE_SHOW;
885
+
886
+ if (!context.config.delay || !context.config.delay.show) {
887
+ context.show();
888
+ return;
889
+ }
890
+
891
+ context._timeout = setTimeout(() => {
892
+ if (context._hoverState === HOVER_STATE_SHOW) {
893
+ context.show();
595
894
  }
895
+ }, context.config.delay.show);
896
+ }
596
897
 
597
- Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
598
- return config;
599
- };
898
+ _leave(event, context) {
899
+ context = this._initializeOnDelegatedTarget(event, context);
600
900
 
601
- _proto._getDelegateConfig = function _getDelegateConfig() {
602
- var config = {};
901
+ if (event) {
902
+ context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
903
+ }
603
904
 
604
- if (this.config) {
605
- for (var key in this.config) {
606
- if (this.constructor.Default[key] !== this.config[key]) {
607
- config[key] = this.config[key];
608
- }
609
- }
905
+ if (context._isWithActiveTrigger()) {
906
+ return;
907
+ }
908
+
909
+ clearTimeout(context._timeout);
910
+ context._hoverState = HOVER_STATE_OUT;
911
+
912
+ if (!context.config.delay || !context.config.delay.hide) {
913
+ context.hide();
914
+ return;
915
+ }
916
+
917
+ context._timeout = setTimeout(() => {
918
+ if (context._hoverState === HOVER_STATE_OUT) {
919
+ context.hide();
610
920
  }
921
+ }, context.config.delay.hide);
922
+ }
611
923
 
612
- return config;
613
- };
924
+ _isWithActiveTrigger() {
925
+ for (const trigger in this._activeTrigger) {
926
+ if (this._activeTrigger[trigger]) {
927
+ return true;
928
+ }
929
+ }
614
930
 
615
- _proto._cleanTipClass = function _cleanTipClass() {
616
- var $tip = $$$1(this.getTipElement());
617
- var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
931
+ return false;
932
+ }
618
933
 
619
- if (tabClass !== null && tabClass.length) {
620
- $tip.removeClass(tabClass.join(''));
934
+ _getConfig(config) {
935
+ const dataAttributes = Manipulator__default['default'].getDataAttributes(this._element);
936
+ Object.keys(dataAttributes).forEach(dataAttr => {
937
+ if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {
938
+ delete dataAttributes[dataAttr];
621
939
  }
940
+ });
941
+
942
+ if (config && typeof config.container === 'object' && config.container.jquery) {
943
+ config.container = config.container[0];
944
+ }
945
+
946
+ config = { ...this.constructor.Default,
947
+ ...dataAttributes,
948
+ ...(typeof config === 'object' && config ? config : {})
622
949
  };
623
950
 
624
- _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
625
- var popperInstance = popperData.instance;
626
- this.tip = popperInstance.popper;
951
+ if (typeof config.delay === 'number') {
952
+ config.delay = {
953
+ show: config.delay,
954
+ hide: config.delay
955
+ };
956
+ }
627
957
 
628
- this._cleanTipClass();
958
+ if (typeof config.title === 'number') {
959
+ config.title = config.title.toString();
960
+ }
629
961
 
630
- this.addAttachmentClass(this._getAttachment(popperData.placement));
631
- };
962
+ if (typeof config.content === 'number') {
963
+ config.content = config.content.toString();
964
+ }
632
965
 
633
- _proto._fixTransition = function _fixTransition() {
634
- var tip = this.getTipElement();
635
- var initConfigAnimation = this.config.animation;
966
+ typeCheckConfig(NAME, config, this.constructor.DefaultType);
636
967
 
637
- if (tip.getAttribute('x-placement') !== null) {
638
- return;
968
+ if (config.sanitize) {
969
+ config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn);
970
+ }
971
+
972
+ return config;
973
+ }
974
+
975
+ _getDelegateConfig() {
976
+ const config = {};
977
+
978
+ if (this.config) {
979
+ for (const key in this.config) {
980
+ if (this.constructor.Default[key] !== this.config[key]) {
981
+ config[key] = this.config[key];
982
+ }
639
983
  }
984
+ }
640
985
 
641
- $$$1(tip).removeClass(ClassName.FADE);
642
- this.config.animation = false;
643
- this.hide();
644
- this.show();
645
- this.config.animation = initConfigAnimation;
646
- }; // Static
986
+ return config;
987
+ }
647
988
 
989
+ _cleanTipClass() {
990
+ const tip = this.getTipElement();
991
+ const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX);
648
992
 
649
- Tooltip._jQueryInterface = function _jQueryInterface(config) {
650
- return this.each(function () {
651
- var data = $$$1(this).data(DATA_KEY);
993
+ if (tabClass !== null && tabClass.length > 0) {
994
+ tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));
995
+ }
996
+ }
652
997
 
653
- var _config = typeof config === 'object' && config;
998
+ _handlePopperPlacementChange(popperData) {
999
+ const {
1000
+ state
1001
+ } = popperData;
654
1002
 
655
- if (!data && /dispose|hide/.test(config)) {
656
- return;
657
- }
1003
+ if (!state) {
1004
+ return;
1005
+ }
658
1006
 
659
- if (!data) {
660
- data = new Tooltip(this, _config);
661
- $$$1(this).data(DATA_KEY, data);
662
- }
1007
+ this.tip = state.elements.popper;
663
1008
 
664
- if (typeof config === 'string') {
665
- if (typeof data[config] === 'undefined') {
666
- throw new TypeError("No method named \"" + config + "\"");
667
- }
1009
+ this._cleanTipClass();
668
1010
 
669
- data[config]();
670
- }
671
- });
672
- };
1011
+ this._addAttachmentClass(this._getAttachment(state.placement));
1012
+ } // Static
673
1013
 
674
- _createClass(Tooltip, null, [{
675
- key: "VERSION",
676
- get: function get() {
677
- return VERSION;
678
- }
679
- }, {
680
- key: "Default",
681
- get: function get() {
682
- return Default;
683
- }
684
- }, {
685
- key: "NAME",
686
- get: function get() {
687
- return NAME;
688
- }
689
- }, {
690
- key: "DATA_KEY",
691
- get: function get() {
692
- return DATA_KEY;
693
- }
694
- }, {
695
- key: "Event",
696
- get: function get() {
697
- return Event;
698
- }
699
- }, {
700
- key: "EVENT_KEY",
701
- get: function get() {
702
- return EVENT_KEY;
1014
+
1015
+ static jQueryInterface(config) {
1016
+ return this.each(function () {
1017
+ let data = Data__default['default'].get(this, DATA_KEY);
1018
+
1019
+ const _config = typeof config === 'object' && config;
1020
+
1021
+ if (!data && /dispose|hide/.test(config)) {
1022
+ return;
703
1023
  }
704
- }, {
705
- key: "DefaultType",
706
- get: function get() {
707
- return DefaultType;
1024
+
1025
+ if (!data) {
1026
+ data = new Tooltip(this, _config);
708
1027
  }
709
- }]);
710
1028
 
711
- return Tooltip;
712
- }();
713
- /**
714
- * ------------------------------------------------------------------------
715
- * jQuery
716
- * ------------------------------------------------------------------------
717
- */
1029
+ if (typeof config === 'string') {
1030
+ if (typeof data[config] === 'undefined') {
1031
+ throw new TypeError(`No method named "${config}"`);
1032
+ }
718
1033
 
1034
+ data[config]();
1035
+ }
1036
+ });
1037
+ }
719
1038
 
720
- $$$1.fn[NAME] = Tooltip._jQueryInterface;
721
- $$$1.fn[NAME].Constructor = Tooltip;
1039
+ }
1040
+ /**
1041
+ * ------------------------------------------------------------------------
1042
+ * jQuery
1043
+ * ------------------------------------------------------------------------
1044
+ * add .Tooltip to jQuery only if jQuery is present
1045
+ */
722
1046
 
723
- $$$1.fn[NAME].noConflict = function () {
724
- $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
725
- return Tooltip._jQueryInterface;
726
- };
727
1047
 
728
- return Tooltip;
729
- }($, Popper);
1048
+ defineJQueryPlugin(NAME, Tooltip);
730
1049
 
731
1050
  return Tooltip;
732
1051