@ui5/webcomponents-base 0.0.0-0742854fd → 0.0.0-11d529e8a
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/.eslintignore +2 -0
- package/CHANGELOG.md +109 -0
- package/README.md +26 -1
- package/bundle.esm.js +13 -10
- package/dist/AssetRegistry.js +8 -7
- package/dist/Boot.js +43 -0
- package/dist/DOMObserver.js +65 -0
- package/dist/Device.js +58 -779
- package/dist/EventProvider.js +30 -26
- package/dist/FontFace.js +52 -7
- package/dist/InitialConfiguration.js +26 -21
- package/dist/Keys.js +51 -0
- package/dist/MediaRange.js +109 -0
- package/{src/util/parseProperties.js → dist/PropertiesFileFormat.js} +6 -0
- package/dist/Render.js +173 -0
- package/dist/RenderScheduler.js +16 -138
- package/dist/StaticArea.js +1 -29
- package/dist/StaticAreaItem.js +64 -65
- package/dist/Theming.js +2 -1
- package/dist/UI5Element.js +305 -374
- package/dist/UI5ElementMetadata.js +115 -16
- package/dist/asset-registries/Icons.js +110 -14
- package/dist/asset-registries/Illustrations.js +30 -0
- package/dist/asset-registries/LocaleData.js +90 -66
- package/dist/asset-registries/Themes.js +23 -33
- package/dist/asset-registries/i18n.js +61 -50
- package/dist/config/Language.js +18 -20
- package/dist/delegate/ItemNavigation.js +233 -201
- package/dist/delegate/ResizeHandler.js +78 -37
- package/dist/delegate/ScrollEnablement.js +49 -20
- package/dist/features/OpenUI5Support.js +41 -6
- package/dist/generated/AssetParameters.js +1 -1
- package/dist/i18nBundle.js +6 -2
- package/dist/isLegacyBrowser.js +3 -0
- package/dist/locale/applyDirection.js +6 -4
- package/dist/locale/directionChange.js +32 -0
- package/dist/locale/getEffectiveDir.js +28 -0
- package/dist/locale/getLocale.js +12 -2
- package/dist/locale/languageChange.js +1 -1
- package/dist/renderer/LitRenderer.js +19 -18
- package/dist/resources/bundle.esm.js +17 -109
- package/dist/resources/bundle.esm.js.map +1 -1
- package/dist/sap/base/Log.js +241 -0
- package/dist/sap/base/assert.js +8 -0
- package/dist/sap/base/security/URLListValidator.js +148 -0
- package/dist/sap/base/security/sanitizeHTML.js +16 -0
- package/dist/sap/base/util/now.js +7 -0
- package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
- package/dist/test-resources/assets/Themes.js +8 -8
- package/dist/test-resources/elements/Parent.js +6 -2
- package/dist/test-resources/elements/WithStaticArea.js +2 -1
- package/dist/test-resources/pages/AllTestElements.html +3 -3
- package/dist/test-resources/pages/Configuration.html +0 -2
- package/dist/test-resources/pages/ConfigurationScript.html +0 -2
- package/dist/test-resources/pages/i18n.html +1 -6
- package/dist/test-resources/specs/ConfigurationChange.spec.js +10 -8
- package/dist/test-resources/specs/ConfigurationScript.spec.js +25 -23
- package/dist/test-resources/specs/ConfigurationURL.spec.js +65 -17
- package/dist/test-resources/specs/CustomTheme.spec.js +7 -5
- package/dist/test-resources/specs/EventProvider.spec.js +63 -0
- package/dist/test-resources/specs/StaticArea.spec.js +56 -12
- package/dist/test-resources/specs/Theming.spec.js +9 -7
- package/dist/test-resources/specs/UI5ElementInvalidation.js +54 -70
- package/dist/test-resources/specs/UI5ElementLifecycle.js +17 -15
- package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +25 -51
- package/dist/test-resources/specs/UI5ElementMetadataExt.js +9 -7
- package/dist/test-resources/specs/UI5ElementPropertyValidation.js +7 -5
- package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +37 -35
- package/dist/test-resources/specs/UI5ElementShadowDOM.js +10 -8
- package/dist/test-resources/specs/UI5ElementSlots.js +10 -8
- package/dist/theming/CustomStyle.js +2 -2
- package/dist/theming/ThemeLoaded.js +22 -0
- package/dist/theming/applyTheme.js +2 -5
- package/dist/theming/getConstructableStyle.js +7 -6
- package/dist/theming/getEffectiveStyle.js +15 -8
- package/dist/theming/getStylesString.js +1 -1
- package/dist/types/CSSColor.js +9 -0
- package/dist/types/CalendarType.js +1 -1
- package/dist/types/DataType.js +13 -1
- package/dist/types/Float.js +4 -0
- package/dist/types/Integer.js +4 -0
- package/dist/types/InvisibleMessageMode.js +30 -0
- package/dist/types/ItemNavigationBehavior.js +2 -7
- package/dist/types/PopupState.js +1 -1
- package/dist/types/ValueState.js +1 -1
- package/dist/updateShadowRoot.js +26 -0
- package/dist/util/AriaLabelHelper.js +4 -4
- package/dist/util/Caret.js +45 -0
- package/dist/util/ColorConversion.js +370 -0
- package/dist/util/FocusableElements.js +17 -6
- package/dist/util/HTMLSanitizer.js +7 -0
- package/dist/util/InvisibleMessage.js +58 -0
- package/dist/util/PopupUtils.js +93 -0
- package/dist/util/SlotsHelper.js +43 -0
- package/dist/util/TabbableElements.js +1 -1
- package/dist/util/arraysAreEqual.js +15 -0
- package/dist/util/clamp.js +12 -0
- package/dist/util/debounce.js +17 -0
- package/dist/util/encodeCSS.js +24 -0
- package/dist/util/getActiveElement.js +11 -0
- package/dist/util/getClassCopy.js +10 -0
- package/dist/util/getEffectiveContentDensity.js +5 -0
- package/dist/util/isElementInView.js +15 -0
- package/dist/util/isNodeTabbable.js +4 -4
- package/hash.txt +1 -0
- package/index.js +1 -1
- package/package-scripts.js +33 -18
- package/package.json +20 -12
- package/src/AssetRegistry.js +8 -7
- package/src/Boot.js +43 -0
- package/src/DOMObserver.js +65 -0
- package/src/Device.js +58 -779
- package/src/EventProvider.js +30 -26
- package/src/FontFace.js +52 -7
- package/src/InitialConfiguration.js +26 -21
- package/src/Keys.js +51 -0
- package/src/MediaRange.js +109 -0
- package/{dist/util/parseProperties.js → src/PropertiesFileFormat.js} +6 -0
- package/src/Render.js +173 -0
- package/src/RenderScheduler.js +16 -138
- package/src/StaticArea.js +1 -29
- package/src/StaticAreaItem.js +64 -65
- package/src/Theming.js +2 -1
- package/src/UI5Element.js +305 -374
- package/src/UI5ElementMetadata.js +115 -16
- package/src/asset-registries/Icons.js +110 -14
- package/src/asset-registries/Illustrations.js +30 -0
- package/src/asset-registries/LocaleData.js +90 -66
- package/src/asset-registries/Themes.js +23 -33
- package/src/asset-registries/i18n.js +61 -50
- package/src/config/Language.js +18 -20
- package/src/delegate/ItemNavigation.js +233 -201
- package/src/delegate/ResizeHandler.js +78 -37
- package/src/delegate/ScrollEnablement.js +49 -20
- package/src/features/OpenUI5Support.js +41 -6
- package/src/i18nBundle.js +6 -2
- package/src/isLegacyBrowser.js +3 -0
- package/src/locale/applyDirection.js +6 -4
- package/src/locale/directionChange.js +32 -0
- package/src/locale/getEffectiveDir.js +28 -0
- package/src/locale/getLocale.js +12 -2
- package/src/locale/languageChange.js +1 -1
- package/src/renderer/LitRenderer.js +19 -18
- package/src/theming/CustomStyle.js +2 -2
- package/src/theming/ThemeLoaded.js +22 -0
- package/src/theming/applyTheme.js +2 -5
- package/src/theming/getConstructableStyle.js +7 -6
- package/src/theming/getEffectiveStyle.js +15 -8
- package/src/theming/getStylesString.js +1 -1
- package/src/types/CSSColor.js +9 -0
- package/src/types/CalendarType.js +1 -1
- package/src/types/DataType.js +13 -1
- package/src/types/Float.js +4 -0
- package/src/types/Integer.js +4 -0
- package/src/types/InvisibleMessageMode.js +30 -0
- package/src/types/ItemNavigationBehavior.js +2 -7
- package/src/types/PopupState.js +1 -1
- package/src/types/ValueState.js +1 -1
- package/src/updateShadowRoot.js +26 -0
- package/src/util/AriaLabelHelper.js +4 -4
- package/src/util/Caret.js +45 -0
- package/src/util/ColorConversion.js +370 -0
- package/src/util/FocusableElements.js +17 -6
- package/src/util/HTMLSanitizer.js +7 -0
- package/src/util/InvisibleMessage.js +58 -0
- package/src/util/PopupUtils.js +93 -0
- package/src/util/SlotsHelper.js +43 -0
- package/src/util/TabbableElements.js +1 -1
- package/src/util/arraysAreEqual.js +15 -0
- package/src/util/clamp.js +12 -0
- package/src/util/debounce.js +17 -0
- package/src/util/encodeCSS.js +24 -0
- package/src/util/getActiveElement.js +11 -0
- package/src/util/getClassCopy.js +10 -0
- package/src/util/getEffectiveContentDensity.js +5 -0
- package/src/util/isElementInView.js +15 -0
- package/src/util/isNodeTabbable.js +4 -4
- package/used-modules.txt +7 -0
- package/bundle.es5.js +0 -28
- package/dist/SVGIconRegistry.js +0 -62
- package/dist/boot.js +0 -34
- package/dist/compatibility/DOMObserver.js +0 -62
- package/dist/compatibility/patchNodeValue.js +0 -24
- package/dist/compatibility/whenPolyfillLoaded.js +0 -26
- package/dist/config/AssetsPath.js +0 -17
- package/dist/delegate/CustomResize.js +0 -78
- package/dist/delegate/NativeResize.js +0 -44
- package/dist/features/PropertiesFormatSupport.js +0 -8
- package/dist/features/browsersupport/Edge.js +0 -6
- package/dist/features/browsersupport/IE11.js +0 -41
- package/dist/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
- package/dist/renderer/ifDefined.js +0 -21
- package/dist/renderer/scopeHTML.js +0 -32
- package/dist/resources/bundle.es5.js +0 -212
- package/dist/resources/bundle.es5.js.map +0 -1
- package/dist/theming/CSSVarsPonyfill.js +0 -48
- package/dist/theming/adaptCSSForIE.js +0 -95
- package/dist/theming/createComponentStyleTag.js +0 -54
- package/dist/thirdparty/Array.from.js +0 -16
- package/dist/thirdparty/Array.prototype.fill.js +0 -44
- package/dist/thirdparty/Array.prototype.find.js +0 -46
- package/dist/thirdparty/Array.prototype.includes.js +0 -51
- package/dist/thirdparty/Element.prototype.closest.js +0 -11
- package/dist/thirdparty/Element.prototype.matches.js +0 -6
- package/dist/thirdparty/Map.prototype.keys.js +0 -9
- package/dist/thirdparty/Number.isInteger.js +0 -5
- package/dist/thirdparty/Number.isNaN.js +0 -1
- package/dist/thirdparty/Number.parseInt.js +0 -1
- package/dist/thirdparty/Object.assign.js +0 -31
- package/dist/thirdparty/Object.entries.js +0 -11
- package/dist/thirdparty/Symbol.js +0 -2
- package/dist/thirdparty/WeakSet.js +0 -27
- package/dist/thirdparty/es6-string-methods.js +0 -182
- package/dist/thirdparty/events-polyfills.js +0 -89
- package/dist/thirdparty/fetch.js +0 -1
- package/dist/thirdparty/template.js +0 -600
- package/dist/thirdparty/webcomponents-sd-ce-pf.js +0 -318
- package/dist/util/getEffectiveAssetPath.js +0 -12
- package/dist/util/isSlot.js +0 -3
- package/dist/webcomponentsjs/LICENSE.md +0 -19
- package/dist/webcomponentsjs/README.md +0 -229
- package/dist/webcomponentsjs/bundles/webcomponents-ce.js +0 -63
- package/dist/webcomponentsjs/bundles/webcomponents-ce.js.map +0 -1
- package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +0 -297
- package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +0 -1
- package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js +0 -208
- package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +0 -1
- package/dist/webcomponentsjs/bundles/webcomponents-sd.js +0 -166
- package/dist/webcomponentsjs/bundles/webcomponents-sd.js.map +0 -1
- package/dist/webcomponentsjs/custom-elements-es5-adapter.js +0 -15
- package/dist/webcomponentsjs/package.json +0 -46
- package/dist/webcomponentsjs/src/entrypoints/custom-elements-es5-adapter-index.js +0 -16
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-bundle-index.js +0 -53
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-ce-index.js +0 -17
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-index.js +0 -19
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-pf-index.js +0 -28
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-index.js +0 -18
- package/dist/webcomponentsjs/webcomponents-bundle.js +0 -298
- package/dist/webcomponentsjs/webcomponents-bundle.js.map +0 -1
- package/dist/webcomponentsjs/webcomponents-loader.js +0 -185
- package/src/SVGIconRegistry.js +0 -62
- package/src/boot.js +0 -34
- package/src/compatibility/DOMObserver.js +0 -62
- package/src/compatibility/patchNodeValue.js +0 -24
- package/src/compatibility/whenPolyfillLoaded.js +0 -26
- package/src/config/AssetsPath.js +0 -17
- package/src/delegate/CustomResize.js +0 -78
- package/src/delegate/NativeResize.js +0 -44
- package/src/features/PropertiesFormatSupport.js +0 -8
- package/src/features/browsersupport/Edge.js +0 -6
- package/src/features/browsersupport/IE11.js +0 -41
- package/src/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
- package/src/renderer/ifDefined.js +0 -21
- package/src/renderer/scopeHTML.js +0 -32
- package/src/theming/CSSVarsPonyfill.js +0 -48
- package/src/theming/adaptCSSForIE.js +0 -95
- package/src/theming/createComponentStyleTag.js +0 -54
- package/src/thirdparty/Array.from.js +0 -16
- package/src/thirdparty/Array.prototype.fill.js +0 -44
- package/src/thirdparty/Array.prototype.find.js +0 -46
- package/src/thirdparty/Array.prototype.includes.js +0 -51
- package/src/thirdparty/Element.prototype.closest.js +0 -11
- package/src/thirdparty/Element.prototype.matches.js +0 -6
- package/src/thirdparty/Map.prototype.keys.js +0 -9
- package/src/thirdparty/Number.isInteger.js +0 -5
- package/src/thirdparty/Number.isNaN.js +0 -1
- package/src/thirdparty/Number.parseInt.js +0 -1
- package/src/thirdparty/Object.assign.js +0 -31
- package/src/thirdparty/Object.entries.js +0 -11
- package/src/thirdparty/Symbol.js +0 -2
- package/src/thirdparty/WeakSet.js +0 -27
- package/src/thirdparty/es6-string-methods.js +0 -182
- package/src/thirdparty/events-polyfills.js +0 -89
- package/src/thirdparty/fetch.js +0 -1
- package/src/thirdparty/template.js +0 -600
- package/src/thirdparty/webcomponents-sd-ce-pf.js +0 -318
- package/src/util/getEffectiveAssetPath.js +0 -12
- package/src/util/isSlot.js +0 -3
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import getSharedResource from "../getSharedResource.js";
|
|
2
|
+
import { getFeature } from "../FeaturesRegistry.js";
|
|
3
|
+
import getActiveElement from "./getActiveElement.js";
|
|
4
|
+
|
|
5
|
+
const PopupUtilsData = getSharedResource("PopupUtilsData", {});
|
|
6
|
+
PopupUtilsData.currentZIndex = PopupUtilsData.currentZIndex || 100;
|
|
7
|
+
|
|
8
|
+
const getFocusedElement = () => {
|
|
9
|
+
const element = getActiveElement();
|
|
10
|
+
return (element && typeof element.focus === "function") ? element : null;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const isFocusedElementWithinNode = node => {
|
|
14
|
+
const fe = getFocusedElement();
|
|
15
|
+
|
|
16
|
+
if (fe) {
|
|
17
|
+
return isNodeContainedWithin(node, fe);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return false;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const isNodeContainedWithin = (parent, child) => {
|
|
24
|
+
let currentNode = parent;
|
|
25
|
+
|
|
26
|
+
if (currentNode.shadowRoot) {
|
|
27
|
+
currentNode = Array.from(currentNode.shadowRoot.children).find(n => n.localName !== "style");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (currentNode === child) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const childNodes = currentNode.localName === "slot" ? currentNode.assignedNodes() : currentNode.children;
|
|
35
|
+
|
|
36
|
+
if (childNodes) {
|
|
37
|
+
return Array.from(childNodes).some(n => isNodeContainedWithin(n, child));
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const isPointInRect = (x, y, rect) => {
|
|
42
|
+
return x >= rect.left && x <= rect.right
|
|
43
|
+
&& y >= rect.top && y <= rect.bottom;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const isClickInRect = (event, rect) => {
|
|
47
|
+
let x;
|
|
48
|
+
let y;
|
|
49
|
+
|
|
50
|
+
if (event.touches) {
|
|
51
|
+
const touch = event.touches[0];
|
|
52
|
+
x = touch.clientX;
|
|
53
|
+
y = touch.clientY;
|
|
54
|
+
} else {
|
|
55
|
+
x = event.clientX;
|
|
56
|
+
y = event.clientY;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return isPointInRect(x, y, rect);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const getClosedPopupParent = el => {
|
|
63
|
+
const parent = el.parentElement || (el.getRootNode && el.getRootNode().host);
|
|
64
|
+
|
|
65
|
+
if (parent && ((parent.showAt && parent.isUI5Element) || (parent.open && parent.isUI5Element) || parent === document.documentElement)) {
|
|
66
|
+
return parent;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return getClosedPopupParent(parent);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const getNextZIndex = () => {
|
|
73
|
+
const OpenUI5Support = getFeature("OpenUI5Support");
|
|
74
|
+
if (OpenUI5Support && OpenUI5Support.isLoaded()) { // use OpenUI5 for getting z-index values, if loaded
|
|
75
|
+
return OpenUI5Support.getNextZIndex();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
PopupUtilsData.currentZIndex += 2;
|
|
79
|
+
return PopupUtilsData.currentZIndex;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const getCurrentZIndex = () => {
|
|
83
|
+
return PopupUtilsData.currentZIndex;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export {
|
|
87
|
+
getFocusedElement,
|
|
88
|
+
isClickInRect,
|
|
89
|
+
getClosedPopupParent,
|
|
90
|
+
getNextZIndex,
|
|
91
|
+
getCurrentZIndex,
|
|
92
|
+
isFocusedElementWithinNode,
|
|
93
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Determines the slot to which a node should be assigned
|
|
3
|
+
* @param node Text node or HTML element
|
|
4
|
+
* @returns {string}
|
|
5
|
+
*/
|
|
6
|
+
const getSlotName = node => {
|
|
7
|
+
// Text nodes can only go to the default slot
|
|
8
|
+
if (!(node instanceof HTMLElement)) {
|
|
9
|
+
return "default";
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// Discover the slot based on the real slot name (f.e. footer => footer, or content-32 => content)
|
|
13
|
+
const slot = node.getAttribute("slot");
|
|
14
|
+
if (slot) {
|
|
15
|
+
const match = slot.match(/^(.+?)-\d+$/);
|
|
16
|
+
return match ? match[1] : slot;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Use default slot as a fallback
|
|
20
|
+
return "default";
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const isSlot = el => el && el instanceof HTMLElement && el.localName === "slot";
|
|
24
|
+
|
|
25
|
+
const getSlottedElements = el => {
|
|
26
|
+
if (isSlot(el)) {
|
|
27
|
+
return el.assignedNodes({ flatten: true }).filter(item => item instanceof HTMLElement);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return [el];
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const getSlottedElementsList = elList => {
|
|
34
|
+
const reducer = (acc, curr) => acc.concat(getSlottedElements(curr));
|
|
35
|
+
return elList.reduce(reducer, []);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export {
|
|
39
|
+
getSlotName,
|
|
40
|
+
isSlot,
|
|
41
|
+
getSlottedElements,
|
|
42
|
+
getSlottedElementsList,
|
|
43
|
+
};
|
|
@@ -17,7 +17,7 @@ const getTabbables = (nodes, tabbables) => {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
Array.from(nodes).forEach(currentNode => {
|
|
20
|
-
if (currentNode.nodeType === Node.TEXT_NODE || currentNode.nodeType === Node.COMMENT_NODE) {
|
|
20
|
+
if (currentNode.nodeType === Node.TEXT_NODE || currentNode.nodeType === Node.COMMENT_NODE || currentNode.hasAttribute("data-sap-no-tab-ref")) {
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const arraysAreEqual = (arr1, arr2) => {
|
|
2
|
+
if (arr1.length !== arr2.length) {
|
|
3
|
+
return false;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
for (let i = 0; i < arr1.length; i++) {
|
|
7
|
+
if (arr1[i] !== arr2[i]) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return true;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default arraysAreEqual;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns a value clamped between an upper bound 'max' and lower bound 'min'.
|
|
3
|
+
* @param {number} val value
|
|
4
|
+
* @param {number} min lower bound
|
|
5
|
+
* @param {number} max upper bound
|
|
6
|
+
* @returns {number}
|
|
7
|
+
*/
|
|
8
|
+
const clamp = (val, min, max) => {
|
|
9
|
+
return Math.min(Math.max(val, min), max);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default clamp;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delays function execution by given threshold.
|
|
3
|
+
* @param fn {Function}
|
|
4
|
+
* @param delay {Integer}
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
let debounceInterval = null;
|
|
8
|
+
|
|
9
|
+
const debounce = (fn, delay) => {
|
|
10
|
+
clearTimeout(debounceInterval);
|
|
11
|
+
debounceInterval = setTimeout(() => {
|
|
12
|
+
debounceInterval = null;
|
|
13
|
+
fn();
|
|
14
|
+
}, delay);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default debounce;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const rCSS = /[\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\xff\u2028\u2029][0-9A-Fa-f]?/g; // eslint-disable-line
|
|
2
|
+
|
|
3
|
+
const toHex = (iChar, iLength) => {
|
|
4
|
+
let sHex = iChar.toString(16);
|
|
5
|
+
if (iLength) {
|
|
6
|
+
sHex = sHex.padStart(iLength, "0");
|
|
7
|
+
}
|
|
8
|
+
return sHex;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const fnCSS = sChar => {
|
|
12
|
+
const iChar = sChar.charCodeAt(0);
|
|
13
|
+
if (sChar.length === 1) {
|
|
14
|
+
return `\\${toHex(iChar)}`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return `\\${toHex(iChar)} ${sChar.substr(1)}`;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const encodeCSS = string => {
|
|
21
|
+
return string.replace(rCSS, fnCSS);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export default encodeCSS;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const getActiveElement = () => {
|
|
2
|
+
let element = document.activeElement;
|
|
3
|
+
|
|
4
|
+
while (element && element.shadowRoot && element.shadowRoot.activeElement) {
|
|
5
|
+
element = element.shadowRoot.activeElement;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
return element;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default getActiveElement;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Determines if the element is within the viewport.
|
|
3
|
+
* @param el {HTMLElement}
|
|
4
|
+
*/
|
|
5
|
+
const isElementInView = el => {
|
|
6
|
+
const rect = el.getBoundingClientRect();
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
rect.top >= 0 && rect.left >= 0
|
|
10
|
+
&& rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)
|
|
11
|
+
&& rect.right <= (window.innerWidth || document.documentElement.clientWidth)
|
|
12
|
+
);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default isElementInView;
|
|
@@ -15,14 +15,14 @@ const isNodeTabbable = node => {
|
|
|
15
15
|
return false;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
if (nodeName === "a" || /input|select|textarea|button|object/.test(nodeName)) {
|
|
19
|
-
return !node.disabled;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
18
|
const tabIndex = node.getAttribute("tabindex");
|
|
23
19
|
if (tabIndex !== null && tabIndex !== undefined) {
|
|
24
20
|
return parseInt(tabIndex) >= 0;
|
|
25
21
|
}
|
|
22
|
+
|
|
23
|
+
if (nodeName === "a" || /input|select|textarea|button|object/.test(nodeName)) {
|
|
24
|
+
return !node.disabled;
|
|
25
|
+
}
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
export default isNodeTabbable;
|
package/used-modules.txt
ADDED
package/bundle.es5.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// ES5 bundle targets IE11 only
|
|
2
|
-
import "./dist/features/browsersupport/IE11.js";
|
|
3
|
-
|
|
4
|
-
import "./bundle.esm.js";
|
|
5
|
-
|
|
6
|
-
import { getAnimationMode } from "./dist/config/AnimationMode.js";
|
|
7
|
-
import { getLanguage } from "./dist/config/Language.js";
|
|
8
|
-
import { getCalendarType } from "./dist/config/CalendarType.js";
|
|
9
|
-
import { getTheme, setTheme } from "./dist/config/Theme.js";
|
|
10
|
-
import { getNoConflict, setNoConflict } from "./dist/config/NoConflict.js";
|
|
11
|
-
import { getRTL } from "./dist/config/RTL.js";
|
|
12
|
-
import { getFirstDayOfWeek } from "./dist/config/FormatSettings.js";
|
|
13
|
-
import { getRegisteredNames as getIconNames } from "./dist/SVGIconRegistry.js"
|
|
14
|
-
const configuration = {
|
|
15
|
-
getAnimationMode,
|
|
16
|
-
getLanguage,
|
|
17
|
-
getTheme,
|
|
18
|
-
setTheme,
|
|
19
|
-
getNoConflict,
|
|
20
|
-
setNoConflict,
|
|
21
|
-
getCalendarType,
|
|
22
|
-
getRTL,
|
|
23
|
-
getFirstDayOfWeek,
|
|
24
|
-
};
|
|
25
|
-
export {
|
|
26
|
-
configuration,
|
|
27
|
-
getIconNames,
|
|
28
|
-
};
|
package/dist/SVGIconRegistry.js
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import getSharedResource from "./getSharedResource.js";
|
|
2
|
-
|
|
3
|
-
const registry = getSharedResource("SVGIcons.registry", new Map());
|
|
4
|
-
const iconCollectionPromises = getSharedResource("SVGIcons.promises", new Map());
|
|
5
|
-
|
|
6
|
-
const ICON_NOT_FOUND = "ICON_NOT_FOUND";
|
|
7
|
-
const DEFAULT_COLLECTION = "SAP-icons";
|
|
8
|
-
|
|
9
|
-
const calcKey = (name, collection) => {
|
|
10
|
-
// silently support ui5-compatible URIs
|
|
11
|
-
if (name.startsWith("sap-icon://")) {
|
|
12
|
-
name = name.replace("sap-icon://", "");
|
|
13
|
-
[name, collection] = name.split("/").reverse();
|
|
14
|
-
}
|
|
15
|
-
collection = collection || DEFAULT_COLLECTION;
|
|
16
|
-
return `${collection}:${name}`;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const registerIcon = (name, { pathData, ltr, accData, collection } = {}) => { // eslint-disable-line
|
|
20
|
-
const key = calcKey(name, collection);
|
|
21
|
-
registry.set(key, { pathData, ltr, accData });
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const getIconDataSync = (name, collection = DEFAULT_COLLECTION) => {
|
|
25
|
-
const key = calcKey(name, collection);
|
|
26
|
-
return registry.get(key);
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const getIconData = async (name, collection = DEFAULT_COLLECTION) => {
|
|
30
|
-
const key = calcKey(name, collection);
|
|
31
|
-
|
|
32
|
-
if (!iconCollectionPromises.has(collection)) {
|
|
33
|
-
iconCollectionPromises.set(collection, Promise.resolve(ICON_NOT_FOUND));
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const iconData = await iconCollectionPromises.get(collection);
|
|
37
|
-
|
|
38
|
-
if (iconData === ICON_NOT_FOUND) {
|
|
39
|
-
return iconData;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return registry.get(key);
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const getRegisteredNames = async () => {
|
|
46
|
-
if (iconCollectionPromises.has(DEFAULT_COLLECTION)) {
|
|
47
|
-
await iconCollectionPromises.get(DEFAULT_COLLECTION);
|
|
48
|
-
}
|
|
49
|
-
return Array.from(registry.keys()).map(k => k.split(":")[1]);
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
const registerCollectionPromise = (collection, promise) => {
|
|
53
|
-
iconCollectionPromises.set(collection, promise);
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
export {
|
|
57
|
-
getIconData,
|
|
58
|
-
getIconDataSync,
|
|
59
|
-
registerIcon,
|
|
60
|
-
getRegisteredNames,
|
|
61
|
-
registerCollectionPromise,
|
|
62
|
-
};
|
package/dist/boot.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import whenDOMReady from "./util/whenDOMReady.js";
|
|
2
|
-
import insertFontFace from "./FontFace.js";
|
|
3
|
-
import insertSystemCSSVars from "./SystemCSSVars.js";
|
|
4
|
-
import { getTheme } from "./config/Theme.js";
|
|
5
|
-
import applyTheme from "./theming/applyTheme.js";
|
|
6
|
-
import whenPolyfillLoaded from "./compatibility/whenPolyfillLoaded.js";
|
|
7
|
-
import { getFeature } from "./FeaturesRegistry.js";
|
|
8
|
-
|
|
9
|
-
let bootPromise;
|
|
10
|
-
|
|
11
|
-
const boot = () => {
|
|
12
|
-
if (bootPromise) {
|
|
13
|
-
return bootPromise;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
bootPromise = new Promise(async resolve => {
|
|
17
|
-
const OpenUI5Support = getFeature("OpenUI5Support");
|
|
18
|
-
if (OpenUI5Support) {
|
|
19
|
-
await OpenUI5Support.init();
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
await whenDOMReady();
|
|
23
|
-
await applyTheme(getTheme());
|
|
24
|
-
OpenUI5Support && OpenUI5Support.attachListeners();
|
|
25
|
-
insertFontFace();
|
|
26
|
-
insertSystemCSSVars();
|
|
27
|
-
await whenPolyfillLoaded();
|
|
28
|
-
resolve();
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
return bootPromise;
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
export default boot;
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
// Shorthands
|
|
2
|
-
const w = window;
|
|
3
|
-
|
|
4
|
-
// Map of observer objects per dom node
|
|
5
|
-
const observers = new WeakMap();
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Implements universal DOM node observation methods.
|
|
9
|
-
*/
|
|
10
|
-
class DOMObserver {
|
|
11
|
-
constructor() {
|
|
12
|
-
throw new Error("Static class");
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* This function abstracts out mutation observer usage inside shadow DOM.
|
|
17
|
-
* For native shadow DOM the native mutation observer is used.
|
|
18
|
-
* When the polyfill is used, the observeChildren ShadyDOM method is used instead.
|
|
19
|
-
*
|
|
20
|
-
* @throws Exception
|
|
21
|
-
* Note: does not allow several mutation observers per node. If there is a valid use-case, this behavior can be changed.
|
|
22
|
-
*
|
|
23
|
-
* @param node
|
|
24
|
-
* @param callback
|
|
25
|
-
* @param options - Only used for the native mutation observer
|
|
26
|
-
*/
|
|
27
|
-
static observeDOMNode(node, callback, options) {
|
|
28
|
-
let observerObject = observers.get(node);
|
|
29
|
-
if (observerObject) {
|
|
30
|
-
throw new Error("A mutation/ShadyDOM observer is already assigned to this node.");
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if (w.ShadyDOM) {
|
|
34
|
-
observerObject = w.ShadyDOM.observeChildren(node, callback);
|
|
35
|
-
} else {
|
|
36
|
-
observerObject = new MutationObserver(callback);
|
|
37
|
-
observerObject.observe(node, options);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
observers.set(node, observerObject);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* De-registers the mutation observer, depending on its type
|
|
45
|
-
* @param node
|
|
46
|
-
*/
|
|
47
|
-
static unobserveDOMNode(node) {
|
|
48
|
-
const observerObject = observers.get(node);
|
|
49
|
-
if (!observerObject) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (observerObject instanceof MutationObserver) {
|
|
54
|
-
observerObject.disconnect();
|
|
55
|
-
} else {
|
|
56
|
-
w.ShadyDOM.unobserveChildren(observerObject);
|
|
57
|
-
}
|
|
58
|
-
observers.delete(node);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export default DOMObserver;
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
const patchNodeValue = () => {
|
|
2
|
-
if (!window.ShadyDOM) {
|
|
3
|
-
return;
|
|
4
|
-
}
|
|
5
|
-
const nativeNodeValue = Object.getOwnPropertyDescriptor(Node.prototype, "nodeValue");
|
|
6
|
-
Object.defineProperty(Node.prototype, "nodeValue", {
|
|
7
|
-
get() {
|
|
8
|
-
return nativeNodeValue.get.apply(this);
|
|
9
|
-
},
|
|
10
|
-
set(text) {
|
|
11
|
-
nativeNodeValue.set.apply(this, arguments); // eslint-disable-line
|
|
12
|
-
|
|
13
|
-
// Call manually the mutation observer callback
|
|
14
|
-
const parentElement = this.parentNode;
|
|
15
|
-
if (parentElement instanceof HTMLElement && parentElement.isUI5Element) {
|
|
16
|
-
parentElement._processChildren();
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
patchNodeValue();
|
|
23
|
-
|
|
24
|
-
export default {};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
let polyfillLoadedPromise;
|
|
2
|
-
|
|
3
|
-
const whenPolyfillLoaded = () => {
|
|
4
|
-
if (polyfillLoadedPromise) {
|
|
5
|
-
return polyfillLoadedPromise;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
polyfillLoadedPromise = new Promise(resolve => {
|
|
9
|
-
if (window.WebComponents
|
|
10
|
-
&& !window.WebComponents.ready
|
|
11
|
-
&& window.WebComponents.waitFor) {
|
|
12
|
-
// the polyfill loader is present
|
|
13
|
-
window.WebComponents.waitFor(() => {
|
|
14
|
-
// the polyfills are loaded, safe to execute code depending on their APIs
|
|
15
|
-
resolve();
|
|
16
|
-
});
|
|
17
|
-
} else {
|
|
18
|
-
// polyfill loader missing, modern browsers only
|
|
19
|
-
resolve();
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
return polyfillLoadedPromise;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
export default whenPolyfillLoaded;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { getAssetsPath as getConfiguredAssetsPath } from "../InitialConfiguration.js";
|
|
2
|
-
|
|
3
|
-
let assetsPath;
|
|
4
|
-
|
|
5
|
-
const getAssetsPath = () => {
|
|
6
|
-
if (assetsPath === undefined) {
|
|
7
|
-
assetsPath = getConfiguredAssetsPath();
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
return assetsPath;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
const setAssetsPath = newAssetsPath => {
|
|
14
|
-
assetsPath = newAssetsPath;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export { getAssetsPath, setAssetsPath }; // eslint-disable-line
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
const INTERVAL = 300;
|
|
2
|
-
|
|
3
|
-
class CustomResize {
|
|
4
|
-
static initialize() {
|
|
5
|
-
CustomResize.initialized = false;
|
|
6
|
-
CustomResize.resizeInterval = undefined;
|
|
7
|
-
CustomResize.resizeListeners = new Map();
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
static attachListener(ref, callback) {
|
|
11
|
-
const observedObject = CustomResize.resizeListeners.get(ref);
|
|
12
|
-
const existingCallbacks = observedObject ? observedObject.callbacks : [];
|
|
13
|
-
|
|
14
|
-
CustomResize.resizeListeners.set(ref, {
|
|
15
|
-
width: ref ? ref.offsetWidth : 0,
|
|
16
|
-
height: ref ? ref.offsetHeight : 0,
|
|
17
|
-
callbacks: existingCallbacks.concat(callback),
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
CustomResize.initListener();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
static initListener() {
|
|
24
|
-
if (CustomResize.resizeListeners.size > 0 && !CustomResize.initialized) {
|
|
25
|
-
CustomResize.resizeInterval = setInterval(CustomResize.checkListeners.bind(CustomResize), INTERVAL);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
static checkListeners() {
|
|
30
|
-
CustomResize.resizeListeners.forEach((entry, ref) => {
|
|
31
|
-
const changed = CustomResize.checkSizes(entry, ref);
|
|
32
|
-
|
|
33
|
-
if (changed || (entry && !entry._hasBeenRendered)) {
|
|
34
|
-
CustomResize.updateSizes(entry, ref.offsetWidth, ref.offsetHeight);
|
|
35
|
-
entry.callbacks.forEach(el => el());
|
|
36
|
-
entry._hasBeenRendered = true;
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
static updateSizes(sizes, newWidth, newHeight) {
|
|
42
|
-
sizes.width = newWidth;
|
|
43
|
-
sizes.height = newHeight;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
static checkSizes(entry, ref) {
|
|
47
|
-
const oldHeight = entry.height;
|
|
48
|
-
const oldWidth = entry.width;
|
|
49
|
-
const newHeight = ref.offsetHeight;
|
|
50
|
-
const newWidth = ref.offsetWidth;
|
|
51
|
-
|
|
52
|
-
return ((oldHeight !== newHeight) || oldWidth !== newWidth);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
static detachListener(ref, callback) {
|
|
56
|
-
const listenerObject = CustomResize.resizeListeners.get(ref);
|
|
57
|
-
const callbacks = listenerObject ? listenerObject.callbacks : [];
|
|
58
|
-
const filteredCallbacks = callbacks.filter(fn => fn !== callback);
|
|
59
|
-
|
|
60
|
-
if (!listenerObject || (callbacks.length === filteredCallbacks.length && callbacks.length !== 0)) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
CustomResize.resizeListeners.set(ref, Object.assign(listenerObject, { callbacks: filteredCallbacks }));
|
|
65
|
-
|
|
66
|
-
if (!filteredCallbacks.length) {
|
|
67
|
-
listenerObject.callbacks = null;
|
|
68
|
-
CustomResize.resizeListeners.delete(ref);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (CustomResize.resizeListeners.size === 0) {
|
|
72
|
-
CustomResize.initialized = false;
|
|
73
|
-
clearInterval(CustomResize.resizeInterval);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export default CustomResize;
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
class NativeResize {
|
|
2
|
-
static initialize() {
|
|
3
|
-
NativeResize.resizeObserver = new window.ResizeObserver(entries => {
|
|
4
|
-
// call attached callbacks
|
|
5
|
-
entries.forEach(entry => {
|
|
6
|
-
const callbacks = NativeResize.observedObjects.get(entry.target);
|
|
7
|
-
|
|
8
|
-
callbacks.forEach(el => el());
|
|
9
|
-
});
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
NativeResize.observedObjects = new Map();
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
static attachListener(ref, callback) {
|
|
16
|
-
const observedDOMs = NativeResize.observedObjects;
|
|
17
|
-
const callbacks = observedDOMs.get(ref) || [];
|
|
18
|
-
|
|
19
|
-
// if no callbacks has been added for this ref - start observing it
|
|
20
|
-
if (!callbacks.length) {
|
|
21
|
-
NativeResize.resizeObserver.observe(ref);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// save the callbacks in an array
|
|
25
|
-
observedDOMs.set(ref, [...callbacks, callback]);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
static detachListener(ref, callback) {
|
|
29
|
-
const callbacks = NativeResize.observedObjects.get(ref) || [];
|
|
30
|
-
const filteredCallbacks = callbacks.filter(fn => fn !== callback);
|
|
31
|
-
|
|
32
|
-
if (!callbacks.length || (callbacks.length === filteredCallbacks.length && callbacks.length !== 0)) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
NativeResize.observedObjects.set(ref, filteredCallbacks);
|
|
37
|
-
|
|
38
|
-
if (!filteredCallbacks.length) {
|
|
39
|
-
NativeResize.resizeObserver.unobserve(ref);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export default NativeResize;
|