@openeuropa/bcl-bootstrap 0.14.0 → 0.18.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.
- package/bin/build-plugins.js +77 -160
- package/bootstrap-icons.js +211 -1
- package/js/dist/alert.js +6 -137
- package/js/dist/alert.js.map +1 -1
- package/js/dist/base-component.js +7 -109
- package/js/dist/base-component.js.map +1 -1
- package/js/dist/button.js +5 -65
- package/js/dist/button.js.map +1 -1
- package/js/dist/carousel.js +13 -190
- package/js/dist/carousel.js.map +1 -1
- package/js/dist/collapse.js +12 -170
- package/js/dist/collapse.js.map +1 -1
- package/js/dist/dom/data.js +0 -5
- package/js/dist/dom/data.js.map +1 -1
- package/js/dist/dom/event-handler.js +5 -29
- package/js/dist/dom/event-handler.js.map +1 -1
- package/js/dist/dom/manipulator.js +0 -5
- package/js/dist/dom/manipulator.js.map +1 -1
- package/js/dist/dom/selector-engine.js +5 -53
- package/js/dist/dom/selector-engine.js.map +1 -1
- package/js/dist/dropdown.js +23 -212
- package/js/dist/dropdown.js.map +1 -1
- package/js/dist/modal.js +18 -611
- package/js/dist/modal.js.map +1 -1
- package/js/dist/offcanvas.js +19 -610
- package/js/dist/offcanvas.js.map +1 -1
- package/js/dist/popover.js +5 -65
- package/js/dist/popover.js.map +1 -1
- package/js/dist/scrollspy.js +8 -147
- package/js/dist/scrollspy.js.map +1 -1
- package/js/dist/tab.js +8 -127
- package/js/dist/tab.js.map +1 -1
- package/js/dist/toast.js +8 -185
- package/js/dist/toast.js.map +1 -1
- package/js/dist/tooltip.js +18 -277
- package/js/dist/tooltip.js.map +1 -1
- package/js/dist/util/backdrop.js +138 -0
- package/js/dist/util/backdrop.js.map +1 -0
- package/js/dist/util/component-functions.js +42 -0
- package/js/dist/util/component-functions.js.map +1 -0
- package/js/dist/util/focustrap.js +118 -0
- package/js/dist/util/focustrap.js.map +1 -0
- package/js/dist/util/index.js +342 -0
- package/js/dist/util/index.js.map +1 -0
- package/js/dist/util/sanitizer.js +125 -0
- package/js/dist/util/sanitizer.js.map +1 -0
- package/js/dist/util/scrollbar.js +119 -0
- package/js/dist/util/scrollbar.js.map +1 -0
- package/package.json +4 -3
- package/plugins/alert.js +0 -230
- package/plugins/alert.js.map +0 -1
- package/plugins/base-component.js +0 -178
- package/plugins/base-component.js.map +0 -1
- package/plugins/button.js +0 -141
- package/plugins/button.js.map +0 -1
- package/plugins/carousel.js +0 -738
- package/plugins/carousel.js.map +0 -1
- package/plugins/collapse.js +0 -490
- package/plugins/collapse.js.map +0 -1
- package/plugins/dom/data.js +0 -64
- package/plugins/dom/data.js.map +0 -1
- package/plugins/dom/event-handler.js +0 -317
- package/plugins/dom/event-handler.js.map +0 -1
- package/plugins/dom/manipulator.js +0 -84
- package/plugins/dom/manipulator.js.map +0 -1
- package/plugins/dom/selector-engine.js +0 -123
- package/plugins/dom/selector-engine.js.map +0 -1
- package/plugins/dropdown.js +0 -682
- package/plugins/dropdown.js.map +0 -1
- package/plugins/modal.js +0 -1037
- package/plugins/modal.js.map +0 -1
- package/plugins/popover.js +0 -179
- package/plugins/popover.js.map +0 -1
- package/plugins/scrollspy.js +0 -386
- package/plugins/scrollspy.js.map +0 -1
- package/plugins/tab.js +0 -328
- package/plugins/tab.js.map +0 -1
- package/plugins/toast.js +0 -418
- package/plugins/toast.js.map +0 -1
- package/plugins/tooltip.js +0 -1001
- package/plugins/tooltip.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/util/index.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nconst toType = obj => {\n if (obj === null || obj === undefined) {\n return `${obj}`\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttr = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n hrefAttr = `#${hrefAttr.split('#')[1]}`\n }\n\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null\n }\n\n return selector\n}\n\nconst getSelectorFromElement = element => {\n const selector = getSelector(element)\n\n if (selector) {\n return document.querySelector(selector) ? selector : null\n }\n\n return null\n}\n\nconst getElementFromSelector = element => {\n const selector = getSelector(element)\n\n return selector ? document.querySelector(selector) : null\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = obj => {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n if (typeof obj.jquery !== 'undefined') {\n obj = obj[0]\n }\n\n return typeof obj.nodeType !== 'undefined'\n}\n\nconst getElement = obj => {\n if (isElement(obj)) { // it's a jQuery object or a node element\n return obj.jquery ? obj[0] : obj\n }\n\n if (typeof obj === 'string' && obj.length > 0) {\n return document.querySelector(obj)\n }\n\n return null\n}\n\nconst typeCheckConfig = (componentName, config, configTypes) => {\n Object.keys(configTypes).forEach(property => {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n })\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n return getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight\n}\n\nconst getjQuery = () => {\n const { jQuery } = window\n\n if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n DOMContentLoadedCallbacks.forEach(callback => callback())\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = callback => {\n if (typeof callback === 'function') {\n callback()\n }\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n if (index === -1) {\n return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]\n }\n\n const listLength = list.length\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n getElement,\n getUID,\n getSelectorFromElement,\n getElementFromSelector,\n getTransitionDurationFromElement,\n triggerTransitionEnd,\n isElement,\n typeCheckConfig,\n isVisible,\n isDisabled,\n findShadowRoot,\n noop,\n getNextActiveElement,\n reflow,\n getjQuery,\n onDOMContentLoaded,\n isRTL,\n defineJQueryPlugin,\n execute,\n executeAfterTransition\n}\n"],"names":["MAX_UID","MILLISECONDS_MULTIPLIER","TRANSITION_END","toType","obj","undefined","toString","call","match","toLowerCase","getUID","prefix","Math","floor","random","document","getElementById","getSelector","element","selector","getAttribute","hrefAttr","includes","startsWith","split","trim","getSelectorFromElement","querySelector","getElementFromSelector","getTransitionDurationFromElement","transitionDuration","transitionDelay","window","getComputedStyle","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","triggerTransitionEnd","dispatchEvent","Event","isElement","jquery","nodeType","getElement","length","typeCheckConfig","componentName","config","configTypes","Object","keys","forEach","property","expectedTypes","value","valueType","RegExp","test","TypeError","toUpperCase","isVisible","getClientRects","getPropertyValue","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","onDOMContentLoaded","callback","readyState","addEventListener","push","isRTL","dir","defineJQueryPlugin","plugin","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","execute","executeAfterTransition","transitionElement","waitForTransition","durationPadding","emulatedDuration","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","index","indexOf","listLength","max","min"],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
(function (global, factory) {
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Sanitizer = {}));
|
|
5
|
+
})(this, (function (exports) { 'use strict';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* --------------------------------------------------------------------------
|
|
9
|
+
* Bootstrap (v5.1.3): util/sanitizer.js
|
|
10
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
11
|
+
* --------------------------------------------------------------------------
|
|
12
|
+
*/
|
|
13
|
+
const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
|
|
14
|
+
const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
|
|
15
|
+
/**
|
|
16
|
+
* A pattern that recognizes a commonly useful subset of URLs that are safe.
|
|
17
|
+
*
|
|
18
|
+
* Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
|
|
22
|
+
/**
|
|
23
|
+
* A pattern that matches safe data URLs. Only matches image, video and audio types.
|
|
24
|
+
*
|
|
25
|
+
* Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
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;
|
|
29
|
+
|
|
30
|
+
const allowedAttribute = (attribute, allowedAttributeList) => {
|
|
31
|
+
const attributeName = attribute.nodeName.toLowerCase();
|
|
32
|
+
|
|
33
|
+
if (allowedAttributeList.includes(attributeName)) {
|
|
34
|
+
if (uriAttributes.has(attributeName)) {
|
|
35
|
+
return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp); // Check if a regular expression validates the attribute.
|
|
42
|
+
|
|
43
|
+
for (let i = 0, len = regExp.length; i < len; i++) {
|
|
44
|
+
if (regExp[i].test(attributeName)) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return false;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const DefaultAllowlist = {
|
|
53
|
+
// Global attributes allowed on any supplied element below.
|
|
54
|
+
'*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
|
|
55
|
+
a: ['target', 'href', 'title', 'rel'],
|
|
56
|
+
area: [],
|
|
57
|
+
b: [],
|
|
58
|
+
br: [],
|
|
59
|
+
col: [],
|
|
60
|
+
code: [],
|
|
61
|
+
div: [],
|
|
62
|
+
em: [],
|
|
63
|
+
hr: [],
|
|
64
|
+
h1: [],
|
|
65
|
+
h2: [],
|
|
66
|
+
h3: [],
|
|
67
|
+
h4: [],
|
|
68
|
+
h5: [],
|
|
69
|
+
h6: [],
|
|
70
|
+
i: [],
|
|
71
|
+
img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
|
|
72
|
+
li: [],
|
|
73
|
+
ol: [],
|
|
74
|
+
p: [],
|
|
75
|
+
pre: [],
|
|
76
|
+
s: [],
|
|
77
|
+
small: [],
|
|
78
|
+
span: [],
|
|
79
|
+
sub: [],
|
|
80
|
+
sup: [],
|
|
81
|
+
strong: [],
|
|
82
|
+
u: [],
|
|
83
|
+
ul: []
|
|
84
|
+
};
|
|
85
|
+
function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {
|
|
86
|
+
if (!unsafeHtml.length) {
|
|
87
|
+
return unsafeHtml;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (sanitizeFn && typeof sanitizeFn === 'function') {
|
|
91
|
+
return sanitizeFn(unsafeHtml);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const domParser = new window.DOMParser();
|
|
95
|
+
const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
|
|
96
|
+
const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
|
|
97
|
+
|
|
98
|
+
for (let i = 0, len = elements.length; i < len; i++) {
|
|
99
|
+
const element = elements[i];
|
|
100
|
+
const elementName = element.nodeName.toLowerCase();
|
|
101
|
+
|
|
102
|
+
if (!Object.keys(allowList).includes(elementName)) {
|
|
103
|
+
element.remove();
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const attributeList = [].concat(...element.attributes);
|
|
108
|
+
const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);
|
|
109
|
+
attributeList.forEach(attribute => {
|
|
110
|
+
if (!allowedAttribute(attribute, allowedAttributes)) {
|
|
111
|
+
element.removeAttribute(attribute.nodeName);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return createdDocument.body.innerHTML;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
exports.DefaultAllowlist = DefaultAllowlist;
|
|
120
|
+
exports.sanitizeHtml = sanitizeHtml;
|
|
121
|
+
|
|
122
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
123
|
+
|
|
124
|
+
}));
|
|
125
|
+
//# sourceMappingURL=sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizer.js","sources":["../../src/util/sanitizer.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst 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\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, len = regExp.length; i < len; i++) {\n if (regExp[i].test(attributeName)) {\n return true\n }\n }\n\n return false\n}\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const element = elements[i]\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n attributeList.forEach(attribute => {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n"],"names":["uriAttributes","Set","ARIA_ATTRIBUTE_PATTERN","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","attribute","allowedAttributeList","attributeName","nodeName","toLowerCase","includes","has","Boolean","test","nodeValue","regExp","filter","attributeRegex","RegExp","i","len","length","DefaultAllowlist","a","area","b","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","sanitizeHtml","unsafeHtml","allowList","sanitizeFn","domParser","window","DOMParser","createdDocument","parseFromString","elements","concat","body","querySelectorAll","element","elementName","Object","keys","remove","attributeList","attributes","allowedAttributes","forEach","removeAttribute","innerHTML"],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
(function (global, factory) {
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/selector-engine'), require('../dom/manipulator'), require('./index')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['../dom/selector-engine', '../dom/manipulator', './index'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Scrollbar = factory(global.SelectorEngine, global.Manipulator, global.Index));
|
|
5
|
+
})(this, (function (SelectorEngine, Manipulator, index) { 'use strict';
|
|
6
|
+
|
|
7
|
+
const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
|
|
8
|
+
|
|
9
|
+
const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
|
|
10
|
+
const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* --------------------------------------------------------------------------
|
|
14
|
+
* Bootstrap (v5.1.3): util/scrollBar.js
|
|
15
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
16
|
+
* --------------------------------------------------------------------------
|
|
17
|
+
*/
|
|
18
|
+
const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
|
|
19
|
+
const SELECTOR_STICKY_CONTENT = '.sticky-top';
|
|
20
|
+
|
|
21
|
+
class ScrollBarHelper {
|
|
22
|
+
constructor() {
|
|
23
|
+
this._element = document.body;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
getWidth() {
|
|
27
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
|
|
28
|
+
const documentWidth = document.documentElement.clientWidth;
|
|
29
|
+
return Math.abs(window.innerWidth - documentWidth);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
hide() {
|
|
33
|
+
const width = this.getWidth();
|
|
34
|
+
|
|
35
|
+
this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
|
|
42
|
+
|
|
43
|
+
this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
_disableOverFlow() {
|
|
47
|
+
this._saveInitialAttribute(this._element, 'overflow');
|
|
48
|
+
|
|
49
|
+
this._element.style.overflow = 'hidden';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
_setElementAttributes(selector, styleProp, callback) {
|
|
53
|
+
const scrollbarWidth = this.getWidth();
|
|
54
|
+
|
|
55
|
+
const manipulationCallBack = element => {
|
|
56
|
+
if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
this._saveInitialAttribute(element, styleProp);
|
|
61
|
+
|
|
62
|
+
const calculatedValue = window.getComputedStyle(element)[styleProp];
|
|
63
|
+
element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
this._applyManipulationCallback(selector, manipulationCallBack);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
reset() {
|
|
70
|
+
this._resetElementAttributes(this._element, 'overflow');
|
|
71
|
+
|
|
72
|
+
this._resetElementAttributes(this._element, 'paddingRight');
|
|
73
|
+
|
|
74
|
+
this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
|
|
75
|
+
|
|
76
|
+
this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
_saveInitialAttribute(element, styleProp) {
|
|
80
|
+
const actualValue = element.style[styleProp];
|
|
81
|
+
|
|
82
|
+
if (actualValue) {
|
|
83
|
+
Manipulator__default.default.setDataAttribute(element, styleProp, actualValue);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
_resetElementAttributes(selector, styleProp) {
|
|
88
|
+
const manipulationCallBack = element => {
|
|
89
|
+
const value = Manipulator__default.default.getDataAttribute(element, styleProp);
|
|
90
|
+
|
|
91
|
+
if (typeof value === 'undefined') {
|
|
92
|
+
element.style.removeProperty(styleProp);
|
|
93
|
+
} else {
|
|
94
|
+
Manipulator__default.default.removeDataAttribute(element, styleProp);
|
|
95
|
+
element.style[styleProp] = value;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
this._applyManipulationCallback(selector, manipulationCallBack);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
_applyManipulationCallback(selector, callBack) {
|
|
103
|
+
if (index.isElement(selector)) {
|
|
104
|
+
callBack(selector);
|
|
105
|
+
} else {
|
|
106
|
+
SelectorEngine__default.default.find(selector, this._element).forEach(callBack);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
isOverflowing() {
|
|
111
|
+
return this.getWidth() > 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return ScrollBarHelper;
|
|
117
|
+
|
|
118
|
+
}));
|
|
119
|
+
//# sourceMappingURL=scrollbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollbar.js","sources":["../../src/util/scrollbar.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine'\nimport Manipulator from '../dom/manipulator'\nimport { isElement } from './index'\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width)\n }\n\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProp, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProp)\n const calculatedValue = window.getComputedStyle(element)[styleProp]\n element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, 'paddingRight')\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight')\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight')\n }\n\n _saveInitialAttribute(element, styleProp) {\n const actualValue = element.style[styleProp]\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProp, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProp) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProp)\n if (typeof value === 'undefined') {\n element.style.removeProperty(styleProp)\n } else {\n Manipulator.removeDataAttribute(element, styleProp)\n element.style[styleProp] = value\n }\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n } else {\n SelectorEngine.find(selector, this._element).forEach(callBack)\n }\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n}\n\nexport default ScrollBarHelper\n"],"names":["SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","ScrollBarHelper","constructor","_element","document","body","getWidth","documentWidth","documentElement","clientWidth","Math","abs","window","innerWidth","hide","width","_disableOverFlow","_setElementAttributes","calculatedValue","_saveInitialAttribute","style","overflow","selector","styleProp","callback","scrollbarWidth","manipulationCallBack","element","getComputedStyle","Number","parseFloat","_applyManipulationCallback","reset","_resetElementAttributes","actualValue","Manipulator","setDataAttribute","value","getDataAttribute","removeProperty","removeDataAttribute","callBack","isElement","SelectorEngine","find","forEach","isOverflowing"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;EAMA,MAAMA,sBAAsB,GAAG,mDAA/B;EACA,MAAMC,uBAAuB,GAAG,aAAhC;;EAEA,MAAMC,eAAN,CAAsB;EACpBC,EAAAA,WAAW,GAAG;EACZ,SAAKC,QAAL,GAAgBC,QAAQ,CAACC,IAAzB;EACD;;EAEDC,EAAAA,QAAQ,GAAG;EACT;EACA,UAAMC,aAAa,GAAGH,QAAQ,CAACI,eAAT,CAAyBC,WAA/C;EACA,WAAOC,IAAI,CAACC,GAAL,CAASC,MAAM,CAACC,UAAP,GAAoBN,aAA7B,CAAP;EACD;;EAEDO,EAAAA,IAAI,GAAG;EACL,UAAMC,KAAK,GAAG,KAAKT,QAAL,EAAd;;EACA,SAAKU,gBAAL,GAFK;;;EAIL,SAAKC,qBAAL,CAA2B,KAAKd,QAAhC,EAA0C,cAA1C,EAA0De,eAAe,IAAIA,eAAe,GAAGH,KAA/F,EAJK;;;EAML,SAAKE,qBAAL,CAA2BlB,sBAA3B,EAAmD,cAAnD,EAAmEmB,eAAe,IAAIA,eAAe,GAAGH,KAAxG;;EACA,SAAKE,qBAAL,CAA2BjB,uBAA3B,EAAoD,aAApD,EAAmEkB,eAAe,IAAIA,eAAe,GAAGH,KAAxG;EACD;;EAEDC,EAAAA,gBAAgB,GAAG;EACjB,SAAKG,qBAAL,CAA2B,KAAKhB,QAAhC,EAA0C,UAA1C;;EACA,SAAKA,QAAL,CAAciB,KAAd,CAAoBC,QAApB,GAA+B,QAA/B;EACD;;EAEDJ,EAAAA,qBAAqB,CAACK,QAAD,EAAWC,SAAX,EAAsBC,QAAtB,EAAgC;EACnD,UAAMC,cAAc,GAAG,KAAKnB,QAAL,EAAvB;;EACA,UAAMoB,oBAAoB,GAAGC,OAAO,IAAI;EACtC,UAAIA,OAAO,KAAK,KAAKxB,QAAjB,IAA6BS,MAAM,CAACC,UAAP,GAAoBc,OAAO,CAAClB,WAAR,GAAsBgB,cAA3E,EAA2F;EACzF;EACD;;EAED,WAAKN,qBAAL,CAA2BQ,OAA3B,EAAoCJ,SAApC;;EACA,YAAML,eAAe,GAAGN,MAAM,CAACgB,gBAAP,CAAwBD,OAAxB,EAAiCJ,SAAjC,CAAxB;EACAI,MAAAA,OAAO,CAACP,KAAR,CAAcG,SAAd,IAA4B,GAAEC,QAAQ,CAACK,MAAM,CAACC,UAAP,CAAkBZ,eAAlB,CAAD,CAAqC,IAA3E;EACD,KARD;;EAUA,SAAKa,0BAAL,CAAgCT,QAAhC,EAA0CI,oBAA1C;EACD;;EAEDM,EAAAA,KAAK,GAAG;EACN,SAAKC,uBAAL,CAA6B,KAAK9B,QAAlC,EAA4C,UAA5C;;EACA,SAAK8B,uBAAL,CAA6B,KAAK9B,QAAlC,EAA4C,cAA5C;;EACA,SAAK8B,uBAAL,CAA6BlC,sBAA7B,EAAqD,cAArD;;EACA,SAAKkC,uBAAL,CAA6BjC,uBAA7B,EAAsD,aAAtD;EACD;;EAEDmB,EAAAA,qBAAqB,CAACQ,OAAD,EAAUJ,SAAV,EAAqB;EACxC,UAAMW,WAAW,GAAGP,OAAO,CAACP,KAAR,CAAcG,SAAd,CAApB;;EACA,QAAIW,WAAJ,EAAiB;EACfC,MAAAA,4BAAW,CAACC,gBAAZ,CAA6BT,OAA7B,EAAsCJ,SAAtC,EAAiDW,WAAjD;EACD;EACF;;EAEDD,EAAAA,uBAAuB,CAACX,QAAD,EAAWC,SAAX,EAAsB;EAC3C,UAAMG,oBAAoB,GAAGC,OAAO,IAAI;EACtC,YAAMU,KAAK,GAAGF,4BAAW,CAACG,gBAAZ,CAA6BX,OAA7B,EAAsCJ,SAAtC,CAAd;;EACA,UAAI,OAAOc,KAAP,KAAiB,WAArB,EAAkC;EAChCV,QAAAA,OAAO,CAACP,KAAR,CAAcmB,cAAd,CAA6BhB,SAA7B;EACD,OAFD,MAEO;EACLY,QAAAA,4BAAW,CAACK,mBAAZ,CAAgCb,OAAhC,EAAyCJ,SAAzC;EACAI,QAAAA,OAAO,CAACP,KAAR,CAAcG,SAAd,IAA2Bc,KAA3B;EACD;EACF,KARD;;EAUA,SAAKN,0BAAL,CAAgCT,QAAhC,EAA0CI,oBAA1C;EACD;;EAEDK,EAAAA,0BAA0B,CAACT,QAAD,EAAWmB,QAAX,EAAqB;EAC7C,QAAIC,eAAS,CAACpB,QAAD,CAAb,EAAyB;EACvBmB,MAAAA,QAAQ,CAACnB,QAAD,CAAR;EACD,KAFD,MAEO;EACLqB,MAAAA,+BAAc,CAACC,IAAf,CAAoBtB,QAApB,EAA8B,KAAKnB,QAAnC,EAA6C0C,OAA7C,CAAqDJ,QAArD;EACD;EACF;;EAEDK,EAAAA,aAAa,GAAG;EACd,WAAO,KAAKxC,QAAL,KAAkB,CAAzB;EACD;;EA/EmB;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@openeuropa/bcl-bootstrap",
|
|
3
3
|
"author": "European Commission",
|
|
4
4
|
"license": "EUPL-1.2",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.18.0",
|
|
6
6
|
"description": "OE - BCL bootstrap 5 sources",
|
|
7
7
|
"bin": {
|
|
8
8
|
"plugins-builder": "./bin/build-plugins.js"
|
|
@@ -16,8 +16,9 @@
|
|
|
16
16
|
"prepublish": "npm-run-all clean copy-* build-plugins"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
|
+
"@rollup/plugin-babel": "5.3.0",
|
|
19
20
|
"bootstrap": "5.1.3",
|
|
20
|
-
"bootstrap-icons": "1.7.
|
|
21
|
+
"bootstrap-icons": "1.7.2",
|
|
21
22
|
"copyfiles": "2.4.1",
|
|
22
23
|
"npm-run-all": "4.1.5",
|
|
23
24
|
"rimraf": "3.0.2"
|
|
@@ -39,5 +40,5 @@
|
|
|
39
40
|
"design-system",
|
|
40
41
|
"twig"
|
|
41
42
|
],
|
|
42
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "a82834df6dff563a956a79bf2899c92742dd5820"
|
|
43
44
|
}
|
package/plugins/alert.js
DELETED
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/event-handler.js'), require('./base-component.js')) :
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['./dom/event-handler', './base-component'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Alert = factory(global.EventHandler, global.Base));
|
|
5
|
-
})(this, (function (EventHandler, BaseComponent) { 'use strict';
|
|
6
|
-
|
|
7
|
-
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
8
|
-
|
|
9
|
-
var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
|
|
10
|
-
var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* --------------------------------------------------------------------------
|
|
14
|
-
* Bootstrap (v5.1.3): util/index.js
|
|
15
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
16
|
-
* --------------------------------------------------------------------------
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
const getSelector = element => {
|
|
20
|
-
let selector = element.getAttribute('data-bs-target');
|
|
21
|
-
|
|
22
|
-
if (!selector || selector === '#') {
|
|
23
|
-
let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
|
|
24
|
-
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
|
|
25
|
-
// `document.querySelector` will rightfully complain it is invalid.
|
|
26
|
-
// See https://github.com/twbs/bootstrap/issues/32273
|
|
27
|
-
|
|
28
|
-
if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
|
|
29
|
-
return null;
|
|
30
|
-
} // Just in case some CMS puts out a full URL with the anchor appended
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
|
|
34
|
-
hrefAttr = `#${hrefAttr.split('#')[1]}`;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return selector;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const getElementFromSelector = element => {
|
|
44
|
-
const selector = getSelector(element);
|
|
45
|
-
return selector ? document.querySelector(selector) : null;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const isDisabled = element => {
|
|
49
|
-
if (!element || element.nodeType !== Node.ELEMENT_NODE) {
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (element.classList.contains('disabled')) {
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (typeof element.disabled !== 'undefined') {
|
|
58
|
-
return element.disabled;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
const getjQuery = () => {
|
|
65
|
-
const {
|
|
66
|
-
jQuery
|
|
67
|
-
} = window;
|
|
68
|
-
|
|
69
|
-
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
|
|
70
|
-
return jQuery;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
return null;
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
const DOMContentLoadedCallbacks = [];
|
|
77
|
-
|
|
78
|
-
const onDOMContentLoaded = callback => {
|
|
79
|
-
if (document.readyState === 'loading') {
|
|
80
|
-
// add listener on the first call when the document is in loading state
|
|
81
|
-
if (!DOMContentLoadedCallbacks.length) {
|
|
82
|
-
document.addEventListener('DOMContentLoaded', () => {
|
|
83
|
-
DOMContentLoadedCallbacks.forEach(callback => callback());
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
DOMContentLoadedCallbacks.push(callback);
|
|
88
|
-
} else {
|
|
89
|
-
callback();
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
const defineJQueryPlugin = plugin => {
|
|
94
|
-
onDOMContentLoaded(() => {
|
|
95
|
-
const $ = getjQuery();
|
|
96
|
-
/* istanbul ignore if */
|
|
97
|
-
|
|
98
|
-
if ($) {
|
|
99
|
-
const name = plugin.NAME;
|
|
100
|
-
const JQUERY_NO_CONFLICT = $.fn[name];
|
|
101
|
-
$.fn[name] = plugin.jQueryInterface;
|
|
102
|
-
$.fn[name].Constructor = plugin;
|
|
103
|
-
|
|
104
|
-
$.fn[name].noConflict = () => {
|
|
105
|
-
$.fn[name] = JQUERY_NO_CONFLICT;
|
|
106
|
-
return plugin.jQueryInterface;
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* --------------------------------------------------------------------------
|
|
114
|
-
* Bootstrap (v5.1.3): util/component-functions.js
|
|
115
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
116
|
-
* --------------------------------------------------------------------------
|
|
117
|
-
*/
|
|
118
|
-
|
|
119
|
-
const enableDismissTrigger = (component, method = 'hide') => {
|
|
120
|
-
const clickEvent = `click.dismiss${component.EVENT_KEY}`;
|
|
121
|
-
const name = component.NAME;
|
|
122
|
-
EventHandler__default["default"].on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
|
|
123
|
-
if (['A', 'AREA'].includes(this.tagName)) {
|
|
124
|
-
event.preventDefault();
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (isDisabled(this)) {
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const target = getElementFromSelector(this) || this.closest(`.${name}`);
|
|
132
|
-
const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
|
|
133
|
-
|
|
134
|
-
instance[method]();
|
|
135
|
-
});
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* --------------------------------------------------------------------------
|
|
140
|
-
* Bootstrap (v5.1.3): alert.js
|
|
141
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
142
|
-
* --------------------------------------------------------------------------
|
|
143
|
-
*/
|
|
144
|
-
/**
|
|
145
|
-
* ------------------------------------------------------------------------
|
|
146
|
-
* Constants
|
|
147
|
-
* ------------------------------------------------------------------------
|
|
148
|
-
*/
|
|
149
|
-
|
|
150
|
-
const NAME = 'alert';
|
|
151
|
-
const DATA_KEY = 'bs.alert';
|
|
152
|
-
const EVENT_KEY = `.${DATA_KEY}`;
|
|
153
|
-
const EVENT_CLOSE = `close${EVENT_KEY}`;
|
|
154
|
-
const EVENT_CLOSED = `closed${EVENT_KEY}`;
|
|
155
|
-
const CLASS_NAME_FADE = 'fade';
|
|
156
|
-
const CLASS_NAME_SHOW = 'show';
|
|
157
|
-
/**
|
|
158
|
-
* ------------------------------------------------------------------------
|
|
159
|
-
* Class Definition
|
|
160
|
-
* ------------------------------------------------------------------------
|
|
161
|
-
*/
|
|
162
|
-
|
|
163
|
-
class Alert extends BaseComponent__default["default"] {
|
|
164
|
-
// Getters
|
|
165
|
-
static get NAME() {
|
|
166
|
-
return NAME;
|
|
167
|
-
} // Public
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
close() {
|
|
171
|
-
const closeEvent = EventHandler__default["default"].trigger(this._element, EVENT_CLOSE);
|
|
172
|
-
|
|
173
|
-
if (closeEvent.defaultPrevented) {
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
this._element.classList.remove(CLASS_NAME_SHOW);
|
|
178
|
-
|
|
179
|
-
const isAnimated = this._element.classList.contains(CLASS_NAME_FADE);
|
|
180
|
-
|
|
181
|
-
this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
|
|
182
|
-
} // Private
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
_destroyElement() {
|
|
186
|
-
this._element.remove();
|
|
187
|
-
|
|
188
|
-
EventHandler__default["default"].trigger(this._element, EVENT_CLOSED);
|
|
189
|
-
this.dispose();
|
|
190
|
-
} // Static
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
static jQueryInterface(config) {
|
|
194
|
-
return this.each(function () {
|
|
195
|
-
const data = Alert.getOrCreateInstance(this);
|
|
196
|
-
|
|
197
|
-
if (typeof config !== 'string') {
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
|
|
202
|
-
throw new TypeError(`No method named "${config}"`);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
data[config](this);
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* ------------------------------------------------------------------------
|
|
212
|
-
* Data Api implementation
|
|
213
|
-
* ------------------------------------------------------------------------
|
|
214
|
-
*/
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
enableDismissTrigger(Alert, 'close');
|
|
218
|
-
/**
|
|
219
|
-
* ------------------------------------------------------------------------
|
|
220
|
-
* jQuery
|
|
221
|
-
* ------------------------------------------------------------------------
|
|
222
|
-
* add .Alert to jQuery only if jQuery is present
|
|
223
|
-
*/
|
|
224
|
-
|
|
225
|
-
defineJQueryPlugin(Alert);
|
|
226
|
-
|
|
227
|
-
return Alert;
|
|
228
|
-
|
|
229
|
-
}));
|
|
230
|
-
//# sourceMappingURL=alert.js.map
|
package/plugins/alert.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"alert.js","sources":["../js/src/util/index.js","../js/src/util/component-functions.js","../js/src/alert.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nconst toType = obj => {\n if (obj === null || obj === undefined) {\n return `${obj}`\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttr = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n hrefAttr = `#${hrefAttr.split('#')[1]}`\n }\n\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null\n }\n\n return selector\n}\n\nconst getSelectorFromElement = element => {\n const selector = getSelector(element)\n\n if (selector) {\n return document.querySelector(selector) ? selector : null\n }\n\n return null\n}\n\nconst getElementFromSelector = element => {\n const selector = getSelector(element)\n\n return selector ? document.querySelector(selector) : null\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = obj => {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n if (typeof obj.jquery !== 'undefined') {\n obj = obj[0]\n }\n\n return typeof obj.nodeType !== 'undefined'\n}\n\nconst getElement = obj => {\n if (isElement(obj)) { // it's a jQuery object or a node element\n return obj.jquery ? obj[0] : obj\n }\n\n if (typeof obj === 'string' && obj.length > 0) {\n return document.querySelector(obj)\n }\n\n return null\n}\n\nconst typeCheckConfig = (componentName, config, configTypes) => {\n Object.keys(configTypes).forEach(property => {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n })\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n return getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight\n}\n\nconst getjQuery = () => {\n const { jQuery } = window\n\n if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n DOMContentLoadedCallbacks.forEach(callback => callback())\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = callback => {\n if (typeof callback === 'function') {\n callback()\n }\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n if (index === -1) {\n return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]\n }\n\n const listLength = list.length\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n getElement,\n getUID,\n getSelectorFromElement,\n getElementFromSelector,\n getTransitionDurationFromElement,\n triggerTransitionEnd,\n isElement,\n typeCheckConfig,\n isVisible,\n isDisabled,\n findShadowRoot,\n noop,\n getNextActiveElement,\n reflow,\n getjQuery,\n onDOMContentLoaded,\n isRTL,\n defineJQueryPlugin,\n execute,\n executeAfterTransition\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { getElementFromSelector, isDisabled } from './index'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Alert to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n"],"names":["getSelector","element","selector","getAttribute","hrefAttr","includes","startsWith","split","trim","getElementFromSelector","document","querySelector","isDisabled","nodeType","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getjQuery","jQuery","window","body","DOMContentLoadedCallbacks","onDOMContentLoaded","callback","readyState","length","addEventListener","forEach","push","defineJQueryPlugin","plugin","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","enableDismissTrigger","component","method","clickEvent","EVENT_KEY","EventHandler","on","event","tagName","preventDefault","target","closest","instance","getOrCreateInstance","DATA_KEY","EVENT_CLOSE","EVENT_CLOSED","CLASS_NAME_FADE","CLASS_NAME_SHOW","Alert","BaseComponent","close","closeEvent","trigger","_element","defaultPrevented","remove","isAnimated","_queueCallback","_destroyElement","dispose","config","each","data","undefined","TypeError"],"mappings":"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"}
|