@ui5/webcomponents-base 0.0.0-39bd3067f → 0.0.0-4180fe799

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/.eslintignore +3 -0
  2. package/CHANGELOG.md +158 -0
  3. package/README.md +26 -2
  4. package/bundle.esm.js +16 -7
  5. package/dist/AssetRegistry.js +8 -6
  6. package/dist/Boot.js +43 -0
  7. package/dist/CSP.js +59 -0
  8. package/dist/CustomElementsRegistry.js +24 -8
  9. package/dist/CustomElementsScope.js +108 -0
  10. package/dist/DOMObserver.js +65 -0
  11. package/dist/Device.js +62 -778
  12. package/dist/EventProvider.js +38 -26
  13. package/dist/FontFace.js +19 -62
  14. package/dist/InitialConfiguration.js +43 -8
  15. package/dist/Keys.js +89 -2
  16. package/dist/ManagedStyles.js +83 -0
  17. package/dist/MediaRange.js +109 -0
  18. package/dist/PropertiesFileFormat.js +95 -0
  19. package/dist/Render.js +175 -0
  20. package/dist/RenderQueue.js +41 -17
  21. package/dist/RenderScheduler.js +24 -126
  22. package/dist/StaticArea.js +1 -39
  23. package/dist/StaticAreaItem.js +56 -63
  24. package/dist/SystemCSSVars.js +10 -0
  25. package/dist/Theming.js +2 -1
  26. package/dist/UI5Element.js +421 -301
  27. package/dist/UI5ElementMetadata.js +165 -19
  28. package/dist/asset-registries/Icons.js +129 -14
  29. package/dist/asset-registries/Illustrations.js +30 -0
  30. package/dist/asset-registries/LocaleData.js +99 -65
  31. package/dist/asset-registries/Themes.js +24 -33
  32. package/dist/asset-registries/i18n.js +72 -30
  33. package/dist/assets-meta/IconCollectionsAlias.js +18 -0
  34. package/dist/config/AnimationMode.js +11 -1
  35. package/dist/config/Language.js +58 -2
  36. package/dist/config/Theme.js +14 -0
  37. package/dist/css/FontFace.css +45 -0
  38. package/dist/css/OverrideFontFace.css +32 -0
  39. package/dist/css/SystemCSSVars.css +17 -0
  40. package/dist/delegate/ItemNavigation.js +244 -171
  41. package/dist/delegate/ResizeHandler.js +78 -38
  42. package/dist/delegate/ScrollEnablement.js +49 -20
  43. package/dist/features/OpenUI5Support.js +42 -7
  44. package/dist/generated/AssetParameters.js +1 -1
  45. package/dist/generated/css/FontFace.css.js +5 -0
  46. package/dist/generated/css/OverrideFontFace.css.js +5 -0
  47. package/dist/generated/css/SystemCSSVars.css.js +5 -0
  48. package/dist/getSharedResource.js +30 -0
  49. package/dist/i18nBundle.js +58 -5
  50. package/dist/isLegacyBrowser.js +3 -0
  51. package/dist/locale/RTLAwareRegistry.js +14 -0
  52. package/dist/locale/applyDirection.js +17 -0
  53. package/dist/locale/directionChange.js +32 -0
  54. package/dist/locale/getEffectiveDir.js +28 -0
  55. package/dist/locale/getLocale.js +12 -2
  56. package/dist/locale/languageChange.js +22 -0
  57. package/dist/renderer/LitRenderer.js +26 -7
  58. package/dist/renderer/directives/style-map.js +72 -0
  59. package/dist/renderer/executeTemplate.js +17 -0
  60. package/dist/resources/bundle.esm.js +17 -109
  61. package/dist/resources/bundle.esm.js.map +1 -1
  62. package/dist/sap/base/Log.js +241 -0
  63. package/dist/sap/base/assert.js +8 -0
  64. package/dist/sap/base/security/URLListValidator.js +148 -0
  65. package/dist/sap/base/security/sanitizeHTML.js +16 -0
  66. package/dist/sap/base/util/now.js +7 -0
  67. package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
  68. package/dist/test-resources/assets/Themes.js +10 -6
  69. package/dist/test-resources/elements/Parent.js +6 -2
  70. package/dist/test-resources/elements/WithStaticArea.js +2 -1
  71. package/dist/test-resources/pages/AllTestElements.html +3 -3
  72. package/dist/test-resources/pages/Configuration.html +0 -2
  73. package/dist/test-resources/pages/ConfigurationScript.html +1 -3
  74. package/dist/test-resources/pages/assets/messagebundle_de.properties +1 -0
  75. package/dist/test-resources/pages/assets/messagebundle_en.properties +1 -0
  76. package/dist/test-resources/pages/assets/messagebundle_es.properties +1 -0
  77. package/dist/test-resources/pages/assets/messagebundle_fr.properties +1 -0
  78. package/dist/test-resources/pages/i18n.html +33 -0
  79. package/dist/test-resources/specs/ConfigurationChange.spec.js +11 -9
  80. package/dist/test-resources/specs/ConfigurationScript.spec.js +25 -23
  81. package/dist/test-resources/specs/ConfigurationURL.spec.js +65 -17
  82. package/dist/test-resources/specs/CustomTheme.spec.js +9 -7
  83. package/dist/test-resources/specs/EventProvider.spec.js +63 -0
  84. package/dist/test-resources/specs/StaticArea.spec.js +56 -12
  85. package/dist/test-resources/specs/Theming.spec.js +12 -10
  86. package/dist/test-resources/specs/UI5ElementInvalidation.js +54 -70
  87. package/dist/test-resources/specs/UI5ElementLifecycle.js +19 -14
  88. package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +25 -51
  89. package/dist/test-resources/specs/UI5ElementMetadataExt.js +9 -7
  90. package/dist/test-resources/specs/UI5ElementPropertyValidation.js +7 -5
  91. package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +37 -35
  92. package/dist/test-resources/specs/UI5ElementShadowDOM.js +10 -8
  93. package/dist/test-resources/specs/UI5ElementSlots.js +10 -8
  94. package/dist/theming/CustomStyle.js +28 -7
  95. package/dist/theming/ThemeLoaded.js +22 -0
  96. package/dist/theming/applyTheme.js +7 -13
  97. package/dist/theming/getConstructableStyle.js +15 -10
  98. package/dist/theming/getEffectiveLinksHrefs.js +20 -0
  99. package/dist/theming/getEffectiveStyle.js +23 -8
  100. package/dist/theming/getStylesString.js +15 -0
  101. package/dist/theming/getThemeDesignerTheme.js +2 -1
  102. package/dist/theming/preloadLinks.js +23 -0
  103. package/dist/types/CSSColor.js +9 -0
  104. package/dist/types/CalendarType.js +1 -1
  105. package/dist/types/DataType.js +13 -1
  106. package/dist/types/Float.js +14 -0
  107. package/dist/types/Integer.js +4 -0
  108. package/dist/types/InvisibleMessageMode.js +30 -0
  109. package/dist/types/ItemNavigationBehavior.js +2 -7
  110. package/dist/types/NavigationMode.js +1 -0
  111. package/dist/types/PopupState.js +1 -1
  112. package/dist/types/ValueState.js +1 -1
  113. package/dist/updateShadowRoot.js +30 -0
  114. package/dist/util/AriaLabelHelper.js +41 -0
  115. package/dist/util/Caret.js +45 -0
  116. package/dist/util/ColorConversion.js +370 -0
  117. package/dist/util/FocusableElements.js +25 -8
  118. package/dist/util/HTMLSanitizer.js +7 -0
  119. package/dist/util/InvisibleMessage.js +58 -0
  120. package/dist/util/PopupUtils.js +93 -0
  121. package/dist/util/SlotsHelper.js +43 -0
  122. package/dist/util/TabbableElements.js +5 -1
  123. package/dist/util/arraysAreEqual.js +15 -0
  124. package/dist/util/clamp.js +12 -0
  125. package/dist/util/createLinkInHead.js +19 -0
  126. package/dist/util/debounce.js +17 -0
  127. package/dist/util/encodeCSS.js +24 -0
  128. package/dist/util/getActiveElement.js +11 -0
  129. package/dist/util/getClassCopy.js +10 -0
  130. package/dist/util/getEffectiveContentDensity.js +5 -0
  131. package/dist/util/getSingletonElementInstance.js +13 -0
  132. package/dist/util/isElementInView.js +15 -0
  133. package/dist/util/isNodeHidden.js +1 -5
  134. package/dist/util/isNodeTabbable.js +4 -4
  135. package/dist/util/isValidPropertyName.js +9 -3
  136. package/dist/util/setToArray.js +10 -0
  137. package/hash.txt +1 -0
  138. package/index.js +1 -1
  139. package/lib/generate-asset-parameters/index.js +0 -1
  140. package/lib/generate-styles/index.js +18 -0
  141. package/package-scripts.js +37 -19
  142. package/package.json +19 -12
  143. package/src/AssetRegistry.js +8 -6
  144. package/src/Boot.js +43 -0
  145. package/src/CSP.js +59 -0
  146. package/src/CustomElementsRegistry.js +24 -8
  147. package/src/CustomElementsScope.js +108 -0
  148. package/src/DOMObserver.js +65 -0
  149. package/src/Device.js +62 -778
  150. package/src/EventProvider.js +38 -26
  151. package/src/FontFace.js +19 -62
  152. package/src/InitialConfiguration.js +43 -8
  153. package/src/Keys.js +89 -2
  154. package/src/ManagedStyles.js +83 -0
  155. package/src/MediaRange.js +109 -0
  156. package/src/PropertiesFileFormat.js +95 -0
  157. package/src/Render.js +175 -0
  158. package/src/RenderQueue.js +41 -17
  159. package/src/RenderScheduler.js +24 -126
  160. package/src/StaticArea.js +1 -39
  161. package/src/StaticAreaItem.js +56 -63
  162. package/src/SystemCSSVars.js +10 -0
  163. package/src/Theming.js +2 -1
  164. package/src/UI5Element.js +421 -301
  165. package/src/UI5ElementMetadata.js +165 -19
  166. package/src/asset-registries/Icons.js +129 -14
  167. package/src/asset-registries/Illustrations.js +30 -0
  168. package/src/asset-registries/LocaleData.js +99 -65
  169. package/src/asset-registries/Themes.js +24 -33
  170. package/src/asset-registries/i18n.js +72 -30
  171. package/src/assets-meta/IconCollectionsAlias.js +18 -0
  172. package/src/config/AnimationMode.js +11 -1
  173. package/src/config/Language.js +58 -2
  174. package/src/config/Theme.js +14 -0
  175. package/src/css/FontFace.css +45 -0
  176. package/src/css/OverrideFontFace.css +32 -0
  177. package/src/css/SystemCSSVars.css +17 -0
  178. package/src/delegate/ItemNavigation.js +244 -171
  179. package/src/delegate/ResizeHandler.js +78 -38
  180. package/src/delegate/ScrollEnablement.js +49 -20
  181. package/src/features/OpenUI5Support.js +42 -7
  182. package/src/getSharedResource.js +30 -0
  183. package/src/i18nBundle.js +58 -5
  184. package/src/isLegacyBrowser.js +3 -0
  185. package/src/locale/RTLAwareRegistry.js +14 -0
  186. package/src/locale/applyDirection.js +17 -0
  187. package/src/locale/directionChange.js +32 -0
  188. package/src/locale/getEffectiveDir.js +28 -0
  189. package/src/locale/getLocale.js +12 -2
  190. package/src/locale/languageChange.js +22 -0
  191. package/src/renderer/LitRenderer.js +26 -7
  192. package/src/renderer/directives/style-map.js +72 -0
  193. package/src/renderer/executeTemplate.js +17 -0
  194. package/src/theming/CustomStyle.js +28 -7
  195. package/src/theming/ThemeLoaded.js +22 -0
  196. package/src/theming/applyTheme.js +7 -13
  197. package/src/theming/getConstructableStyle.js +15 -10
  198. package/src/theming/getEffectiveLinksHrefs.js +20 -0
  199. package/src/theming/getEffectiveStyle.js +23 -8
  200. package/src/theming/getStylesString.js +15 -0
  201. package/src/theming/getThemeDesignerTheme.js +2 -1
  202. package/src/theming/preloadLinks.js +23 -0
  203. package/src/types/CSSColor.js +9 -0
  204. package/src/types/CalendarType.js +1 -1
  205. package/src/types/DataType.js +13 -1
  206. package/src/types/Float.js +14 -0
  207. package/src/types/Integer.js +4 -0
  208. package/src/types/InvisibleMessageMode.js +30 -0
  209. package/src/types/ItemNavigationBehavior.js +2 -7
  210. package/src/types/NavigationMode.js +1 -0
  211. package/src/types/PopupState.js +1 -1
  212. package/src/types/ValueState.js +1 -1
  213. package/src/updateShadowRoot.js +30 -0
  214. package/src/util/AriaLabelHelper.js +41 -0
  215. package/src/util/Caret.js +45 -0
  216. package/src/util/ColorConversion.js +370 -0
  217. package/src/util/FocusableElements.js +25 -8
  218. package/src/util/HTMLSanitizer.js +7 -0
  219. package/src/util/InvisibleMessage.js +58 -0
  220. package/src/util/PopupUtils.js +93 -0
  221. package/src/util/SlotsHelper.js +43 -0
  222. package/src/util/TabbableElements.js +5 -1
  223. package/src/util/arraysAreEqual.js +15 -0
  224. package/src/util/clamp.js +12 -0
  225. package/src/util/createLinkInHead.js +19 -0
  226. package/src/util/debounce.js +17 -0
  227. package/src/util/encodeCSS.js +24 -0
  228. package/src/util/getActiveElement.js +11 -0
  229. package/src/util/getClassCopy.js +10 -0
  230. package/src/util/getEffectiveContentDensity.js +5 -0
  231. package/src/util/getSingletonElementInstance.js +13 -0
  232. package/src/util/isElementInView.js +15 -0
  233. package/src/util/isNodeHidden.js +1 -5
  234. package/src/util/isNodeTabbable.js +4 -4
  235. package/src/util/isValidPropertyName.js +9 -3
  236. package/src/util/setToArray.js +10 -0
  237. package/used-modules.txt +7 -0
  238. package/bundle.es5.js +0 -28
  239. package/dist/SVGIconRegistry.js +0 -60
  240. package/dist/boot.js +0 -32
  241. package/dist/compatibility/DOMObserver.js +0 -62
  242. package/dist/compatibility/patchNodeValue.js +0 -24
  243. package/dist/compatibility/whenPolyfillLoaded.js +0 -26
  244. package/dist/delegate/CustomResize.js +0 -78
  245. package/dist/delegate/NativeResize.js +0 -44
  246. package/dist/features/browsersupport/Edge.js +0 -6
  247. package/dist/features/browsersupport/IE11.js +0 -41
  248. package/dist/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
  249. package/dist/renderer/ifDefined.js +0 -21
  250. package/dist/resources/bundle.es5.js +0 -212
  251. package/dist/resources/bundle.es5.js.map +0 -1
  252. package/dist/theming/CSSVarsPonyfill.js +0 -24
  253. package/dist/theming/adaptCSSForIE.js +0 -90
  254. package/dist/theming/createComponentStyleTag.js +0 -49
  255. package/dist/theming/createThemePropertiesStyleTag.js +0 -20
  256. package/dist/thirdparty/Array.from.js +0 -16
  257. package/dist/thirdparty/Array.prototype.fill.js +0 -44
  258. package/dist/thirdparty/Array.prototype.find.js +0 -46
  259. package/dist/thirdparty/Array.prototype.includes.js +0 -51
  260. package/dist/thirdparty/Element.prototype.closest.js +0 -11
  261. package/dist/thirdparty/Element.prototype.matches.js +0 -6
  262. package/dist/thirdparty/Map.prototype.keys.js +0 -9
  263. package/dist/thirdparty/Number.isInteger.js +0 -5
  264. package/dist/thirdparty/Number.isNaN.js +0 -1
  265. package/dist/thirdparty/Number.parseInt.js +0 -1
  266. package/dist/thirdparty/Object.assign.js +0 -31
  267. package/dist/thirdparty/Object.entries.js +0 -11
  268. package/dist/thirdparty/Symbol.js +0 -2
  269. package/dist/thirdparty/WeakSet.js +0 -27
  270. package/dist/thirdparty/es6-string-methods.js +0 -182
  271. package/dist/thirdparty/events-polyfills.js +0 -89
  272. package/dist/thirdparty/fetch.js +0 -1
  273. package/dist/thirdparty/template.js +0 -600
  274. package/dist/thirdparty/webcomponents-sd-ce-pf.js +0 -318
  275. package/dist/webcomponentsjs/LICENSE.md +0 -19
  276. package/dist/webcomponentsjs/README.md +0 -229
  277. package/dist/webcomponentsjs/bundles/webcomponents-ce.js +0 -63
  278. package/dist/webcomponentsjs/bundles/webcomponents-ce.js.map +0 -1
  279. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +0 -297
  280. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +0 -1
  281. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js +0 -208
  282. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +0 -1
  283. package/dist/webcomponentsjs/bundles/webcomponents-sd.js +0 -166
  284. package/dist/webcomponentsjs/bundles/webcomponents-sd.js.map +0 -1
  285. package/dist/webcomponentsjs/custom-elements-es5-adapter.js +0 -15
  286. package/dist/webcomponentsjs/package.json +0 -46
  287. package/dist/webcomponentsjs/src/entrypoints/custom-elements-es5-adapter-index.js +0 -16
  288. package/dist/webcomponentsjs/src/entrypoints/webcomponents-bundle-index.js +0 -53
  289. package/dist/webcomponentsjs/src/entrypoints/webcomponents-ce-index.js +0 -17
  290. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-index.js +0 -19
  291. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-pf-index.js +0 -28
  292. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-index.js +0 -18
  293. package/dist/webcomponentsjs/webcomponents-bundle.js +0 -298
  294. package/dist/webcomponentsjs/webcomponents-bundle.js.map +0 -1
  295. package/dist/webcomponentsjs/webcomponents-loader.js +0 -185
  296. package/src/SVGIconRegistry.js +0 -60
  297. package/src/boot.js +0 -32
  298. package/src/compatibility/DOMObserver.js +0 -62
  299. package/src/compatibility/patchNodeValue.js +0 -24
  300. package/src/compatibility/whenPolyfillLoaded.js +0 -26
  301. package/src/delegate/CustomResize.js +0 -78
  302. package/src/delegate/NativeResize.js +0 -44
  303. package/src/features/browsersupport/Edge.js +0 -6
  304. package/src/features/browsersupport/IE11.js +0 -41
  305. package/src/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
  306. package/src/renderer/ifDefined.js +0 -21
  307. package/src/theming/CSSVarsPonyfill.js +0 -24
  308. package/src/theming/adaptCSSForIE.js +0 -90
  309. package/src/theming/createComponentStyleTag.js +0 -49
  310. package/src/theming/createThemePropertiesStyleTag.js +0 -20
  311. package/src/thirdparty/Array.from.js +0 -16
  312. package/src/thirdparty/Array.prototype.fill.js +0 -44
  313. package/src/thirdparty/Array.prototype.find.js +0 -46
  314. package/src/thirdparty/Array.prototype.includes.js +0 -51
  315. package/src/thirdparty/Element.prototype.closest.js +0 -11
  316. package/src/thirdparty/Element.prototype.matches.js +0 -6
  317. package/src/thirdparty/Map.prototype.keys.js +0 -9
  318. package/src/thirdparty/Number.isInteger.js +0 -5
  319. package/src/thirdparty/Number.isNaN.js +0 -1
  320. package/src/thirdparty/Number.parseInt.js +0 -1
  321. package/src/thirdparty/Object.assign.js +0 -31
  322. package/src/thirdparty/Object.entries.js +0 -11
  323. package/src/thirdparty/Symbol.js +0 -2
  324. package/src/thirdparty/WeakSet.js +0 -27
  325. package/src/thirdparty/es6-string-methods.js +0 -182
  326. package/src/thirdparty/events-polyfills.js +0 -89
  327. package/src/thirdparty/fetch.js +0 -1
  328. package/src/thirdparty/template.js +0 -600
  329. package/src/thirdparty/webcomponents-sd-ce-pf.js +0 -318
@@ -0,0 +1,41 @@
1
+ import findNodeOwner from "./findNodeOwner.js";
2
+
3
+ const getEffectiveAriaLabelText = el => {
4
+ if (!el.accessibleNameRef) {
5
+ if (el.accessibleName) {
6
+ return el.accessibleName;
7
+ }
8
+
9
+ return undefined;
10
+ }
11
+
12
+ return getAriaLabelledByTexts(el);
13
+ };
14
+
15
+ /**
16
+ *
17
+ * @param {HTMLElement} el Defines the HTMLElement, for which you need to get all related texts
18
+ * @param {HTMLElement} ownerDocument (Optional) Defines the HTMLElement(might document or custom element) where the you want to search for the texts.
19
+ * @param {String} readyIds (Optional) Defines a string of elements ids. The text of these elements will be returned. If used you should provide either el or ownerDocument
20
+ */
21
+ const getAriaLabelledByTexts = (el, ownerDocument, readyIds = "") => {
22
+ const ids = (readyIds && readyIds.split(" ")) || el.accessibleNameRef.split(" ");
23
+ const owner = ownerDocument || findNodeOwner(el);
24
+ let result = "";
25
+
26
+ ids.forEach((elementId, index) => {
27
+ const element = owner.querySelector(`[id='${elementId}']`);
28
+ result += `${element ? element.textContent : ""}`;
29
+
30
+ if (index < ids.length - 1) {
31
+ result += " ";
32
+ }
33
+ });
34
+
35
+ return result;
36
+ };
37
+
38
+ export {
39
+ getEffectiveAriaLabelText,
40
+ getAriaLabelledByTexts,
41
+ };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Returns the caret (cursor) position of the specified text field (field).
3
+ * Return value range is 0-field.value.length.
4
+ */
5
+ const getCaretPosition = field => {
6
+ // Initialize
7
+ let caretPos = 0;
8
+
9
+ // IE Support
10
+ if (document.selection) {
11
+ // Set focus on the element
12
+ field.focus();
13
+
14
+ // To get cursor position, get empty selection range
15
+ const selection = document.selection.createRange();
16
+
17
+ // Move selection start to 0 position
18
+ selection.moveStart("character", -field.value.length);
19
+
20
+ // The caret position is selection length
21
+ caretPos = selection.text.length;
22
+ } else if (field.selectionStart || field.selectionStart === "0") { // Firefox support
23
+ caretPos = field.selectionDirection === "backward" ? field.selectionStart : field.selectionEnd;
24
+ }
25
+
26
+ return caretPos;
27
+ };
28
+
29
+ const setCaretPosition = (field, caretPos) => {
30
+ if (field.createTextRange) {
31
+ const range = field.createTextRange();
32
+ range.move("character", caretPos);
33
+ range.select();
34
+ } else if (field.selectionStart) {
35
+ field.focus();
36
+ field.setSelectionRange(caretPos, caretPos);
37
+ } else {
38
+ field.focus();
39
+ }
40
+ };
41
+
42
+ export {
43
+ getCaretPosition,
44
+ setCaretPosition,
45
+ };
@@ -0,0 +1,370 @@
1
+ /**
2
+ *
3
+ * @param {String} color Color in one of the following formats: RGBA or HEX
4
+ */
5
+
6
+ /**
7
+ * Map of CSS colors to hex representation
8
+ */
9
+ const CSSColors = {
10
+ aliceblue: "f0f8ff",
11
+ antiquewhite: "faebd7",
12
+ aqua: "00ffff",
13
+ aquamarine: "7fffd4",
14
+ azure: "f0ffff",
15
+ beige: "f5f5dc",
16
+ bisque: "ffe4c4",
17
+ black: "000000",
18
+ blanchedalmond: "ffebcd",
19
+ blue: "0000ff",
20
+ blueviolet: "8a2be2",
21
+ brown: "a52a2a",
22
+ burlywood: "deb887",
23
+ cadetblue: "5f9ea0",
24
+ chartreuse: "7fff00",
25
+ chocolate: "d2691e",
26
+ coral: "ff7f50",
27
+ cornflowerblue: "6495ed",
28
+ cornsilk: "fff8dc",
29
+ crimson: "dc143c",
30
+ cyan: "00ffff",
31
+ darkblue: "00008b",
32
+ darkcyan: "008b8b",
33
+ darkgoldenrod: "b8860b",
34
+ darkgray: "a9a9a9",
35
+ darkgrey: "a9a9a9",
36
+ darkgreen: "006400",
37
+ darkkhaki: "bdb76b",
38
+ darkmagenta: "8b008b",
39
+ darkolivegreen: "556b2f",
40
+ darkorange: "ff8c00",
41
+ darkorchid: "9932cc",
42
+ darkred: "8b0000",
43
+ darksalmon: "e9967a",
44
+ darkseagreen: "8fbc8f",
45
+ darkslateblue: "483d8b",
46
+ darkslategray: "2f4f4f",
47
+ darkslategrey: "2f4f4f",
48
+ darkturquoise: "00ced1",
49
+ darkviolet: "9400d3",
50
+ deeppink: "ff1493",
51
+ deepskyblue: "00bfff",
52
+ dimgray: "696969",
53
+ dimgrey: "696969",
54
+ dodgerblue: "1e90ff",
55
+ firebrick: "b22222",
56
+ floralwhite: "fffaf0",
57
+ forestgreen: "228b22",
58
+ fuchsia: "ff00ff",
59
+ gainsboro: "dcdcdc",
60
+ ghostwhite: "f8f8ff",
61
+ gold: "ffd700",
62
+ goldenrod: "daa520",
63
+ gray: "808080",
64
+ grey: "808080",
65
+ green: "008000",
66
+ greenyellow: "adff2f",
67
+ honeydew: "f0fff0",
68
+ hotpink: "ff69b4",
69
+ indianred: "cd5c5c",
70
+ indigo: "4b0082",
71
+ ivory: "fffff0",
72
+ khaki: "f0e68c",
73
+ lavender: "e6e6fa",
74
+ lavenderblush: "fff0f5",
75
+ lawngreen: "7cfc00",
76
+ lemonchiffon: "fffacd",
77
+ lightblue: "add8e6",
78
+ lightcoral: "f08080",
79
+ lightcyan: "e0ffff",
80
+ lightgoldenrodyellow: "fafad2",
81
+ lightgray: "d3d3d3",
82
+ lightgrey: "d3d3d3",
83
+ lightgreen: "90ee90",
84
+ lightpink: "ffb6c1",
85
+ lightsalmon: "ffa07a",
86
+ lightseagreen: "20b2aa",
87
+ lightskyblue: "87cefa",
88
+ lightslategray: "778899",
89
+ lightslategrey: "778899",
90
+ lightsteelblue: "b0c4de",
91
+ lightyellow: "ffffe0",
92
+ lime: "00ff00",
93
+ limegreen: "32cd32",
94
+ linen: "faf0e6",
95
+ magenta: "ff00ff",
96
+ maroon: "800000",
97
+ mediumaquamarine: "66cdaa",
98
+ mediumblue: "0000cd",
99
+ mediumorchid: "ba55d3",
100
+ mediumpurple: "9370db",
101
+ mediumseagreen: "3cb371",
102
+ mediumslateblue: "7b68ee",
103
+ mediumspringgreen: "00fa9a",
104
+ mediumturquoise: "48d1cc",
105
+ mediumvioletred: "c71585",
106
+ midnightblue: "191970",
107
+ mintcream: "f5fffa",
108
+ mistyrose: "ffe4e1",
109
+ moccasin: "ffe4b5",
110
+ navajowhite: "ffdead",
111
+ navy: "000080",
112
+ oldlace: "fdf5e6",
113
+ olive: "808000",
114
+ olivedrab: "6b8e23",
115
+ orange: "ffa500",
116
+ orangered: "ff4500",
117
+ orchid: "da70d6",
118
+ palegoldenrod: "eee8aa",
119
+ palegreen: "98fb98",
120
+ paleturquoise: "afeeee",
121
+ palevioletred: "db7093",
122
+ papayawhip: "ffefd5",
123
+ peachpuff: "ffdab9",
124
+ peru: "cd853f",
125
+ pink: "ffc0cb",
126
+ plum: "dda0dd",
127
+ powderblue: "b0e0e6",
128
+ purple: "800080",
129
+ red: "ff0000",
130
+ rosybrown: "bc8f8f",
131
+ royalblue: "4169e1",
132
+ saddlebrown: "8b4513",
133
+ salmon: "fa8072",
134
+ sandybrown: "f4a460",
135
+ seagreen: "2e8b57",
136
+ seashell: "fff5ee",
137
+ sienna: "a0522d",
138
+ silver: "c0c0c0",
139
+ skyblue: "87ceeb",
140
+ slateblue: "6a5acd",
141
+ slategray: "708090",
142
+ slategrey: "708090",
143
+ snow: "fffafa",
144
+ springgreen: "00ff7f",
145
+ steelblue: "4682b4",
146
+ tan: "d2b48c",
147
+ teal: "008080",
148
+ thistle: "d8bfd8",
149
+ tomato: "ff6347",
150
+ turquoise: "40e0d0",
151
+ violet: "ee82ee",
152
+ wheat: "f5deb3",
153
+ white: "ffffff",
154
+ whitesmoke: "f5f5f5",
155
+ yellow: "ffff00",
156
+ yellowgreen: "9acd32",
157
+ transparent: "00000000",
158
+ };
159
+
160
+ const getRGBColor = color => {
161
+ if (color.startsWith("rgba")) {
162
+ return RGBAToRGB(color);
163
+ }
164
+
165
+ if (color.startsWith("rgb")) {
166
+ return RGBToRGB(color);
167
+ }
168
+
169
+ // HEX
170
+ if (color.indexOf("#") === 0) {
171
+ // Shorthand Syntax
172
+ if (color.length === 4) {
173
+ color = `${color[1]}${color[1]}${color[2]}${color[2]}${color[3]}${color[3]}`;
174
+ } else {
175
+ color = color.slice(1, color.length);
176
+ }
177
+ }
178
+
179
+ // Css Color
180
+ if (Object.keys(CSSColors).includes(color)) {
181
+ color = CSSColors[color];
182
+ }
183
+
184
+ return HEXToRGB(color);
185
+ };
186
+
187
+ /**
188
+ * Return an object with the properties for each of the main colors(red, green, blue)
189
+ * @param {String} color Receives a color in the following format: "rgba(0, 0, 0, 1)
190
+ */
191
+ const RGBAToRGB = color => {
192
+ const openingBracketIndex = color.indexOf("("),
193
+ commasIndexes = [];
194
+
195
+ for (let i = 0; i < color.length; i++) {
196
+ if (color[i] === ",") {
197
+ commasIndexes.push(i);
198
+ }
199
+ }
200
+
201
+ return {
202
+ r: parseInt(color.slice(openingBracketIndex + 1, commasIndexes[0]).trim()),
203
+ g: parseInt(color.slice(commasIndexes[0] + 1, commasIndexes[1]).trim()),
204
+ b: parseInt(color.slice(commasIndexes[1] + 1, commasIndexes[2]).trim()),
205
+ };
206
+ };
207
+
208
+ /**
209
+ * Return an object with the properties for each of the main colors(red, green, blue)
210
+ * @param {String} color Receives a color in the following format: "rgb(0, 0, 0)
211
+ */
212
+ const RGBToRGB = color => {
213
+ const openingBracketIndex = color.indexOf("("),
214
+ closingBraketIndex = color.indexOf(")"),
215
+ commasIndexes = [];
216
+
217
+ for (let i = 0; i < color.length; i++) {
218
+ if (color[i] === ",") {
219
+ commasIndexes.push(i);
220
+ }
221
+ }
222
+
223
+ return {
224
+ r: parseInt(color.slice(openingBracketIndex + 1, commasIndexes[0]).trim()),
225
+ g: parseInt(color.slice(commasIndexes[0] + 1, commasIndexes[1]).trim()),
226
+ b: parseInt(color.slice(commasIndexes[1] + 1, closingBraketIndex).trim()),
227
+ };
228
+ };
229
+
230
+ const HSLToRGB = (color = {
231
+ h: undefined,
232
+ s: undefined,
233
+ l: undefined,
234
+ }) => {
235
+ // Formula taken from https://www.rapidtables.com/convert/color/hsl-to-rgb.html
236
+ const C = (1 - Math.abs((2 * color.l) - 1)) * color.s,
237
+ X = C * (1 - Math.abs(((color.h / 60) % 2) - 1)),
238
+ m = color.l - C / 2;
239
+
240
+ let tempColor = {};
241
+ switch (Math.round(color.h / 60)) {
242
+ // 0 ≤ H < 60
243
+ case 0:
244
+ tempColor = {
245
+ r: C,
246
+ g: X,
247
+ b: 0,
248
+ };
249
+ break;
250
+
251
+ // 60 ≤ H < 120
252
+ case 1:
253
+ tempColor = {
254
+ r: X,
255
+ g: C,
256
+ b: 0,
257
+ };
258
+ break;
259
+
260
+ // 120 ≤ H < 180
261
+ case 2:
262
+ tempColor = {
263
+ r: 0,
264
+ g: C,
265
+ b: X,
266
+ };
267
+ break;
268
+
269
+ // 180 ≤ H < 240
270
+ case 3:
271
+ tempColor = {
272
+ r: 0,
273
+ g: X,
274
+ b: C,
275
+ };
276
+ break;
277
+
278
+ // 240 ≤ H < 300
279
+ case 4:
280
+ tempColor = {
281
+ r: X,
282
+ g: 0,
283
+ b: C,
284
+ };
285
+ break;
286
+
287
+ // 300 ≤ H < 360
288
+ default:
289
+ tempColor = {
290
+ r: C,
291
+ g: 0,
292
+ b: X,
293
+ };
294
+ }
295
+
296
+ return {
297
+ r: Math.floor((tempColor.r + m) * 255),
298
+ g: Math.floor((tempColor.g + m) * 255),
299
+ b: Math.floor((tempColor.b + m) * 255),
300
+ };
301
+ };
302
+
303
+ const HEXToRGB = hex => {
304
+ // Please make sure you pass a valid 6 digit hex color
305
+ // In the implementation of this method we assume that the hex argument is a 6 digit valid hex color
306
+
307
+ const rgbValues = {
308
+ r: hex.substr(0, 2),
309
+ g: hex.substr(2, 2),
310
+ b: hex.substr(4, 2),
311
+ };
312
+
313
+ const rgbKeys = Object.keys(rgbValues);
314
+
315
+ rgbKeys.forEach(key => {
316
+ rgbValues[key] = parseInt(rgbValues[key], 16);
317
+ });
318
+
319
+ return rgbValues;
320
+ };
321
+
322
+ const RGBToHSL = (color = {
323
+ r: undefined,
324
+ g: undefined,
325
+ b: undefined,
326
+ }) => {
327
+ const R = color.r / 255,
328
+ G = color.g / 255,
329
+ B = color.b / 255,
330
+ max = Math.max(R, G, B),
331
+ min = Math.min(R, G, B),
332
+ delta = max - min;
333
+
334
+ let h,
335
+ s;
336
+
337
+ // Hue calculation
338
+ if (delta === 0) {
339
+ h = 0;
340
+ } else if (max === R) {
341
+ h = 60 * (((G - B) / delta) % 6);
342
+ } else if (max === G) {
343
+ h = 60 * (((B - R) / delta) + 2);
344
+ } else if (max === B) {
345
+ h = 60 * (((R - G) / delta) + 4);
346
+ }
347
+
348
+ // Lightness calculation
349
+ const l = (max + min) / 2;
350
+
351
+ // Saturation calculation
352
+ if (delta === 0) {
353
+ s = 0;
354
+ } else {
355
+ s = delta / (1 - Math.abs(2 * l - 1));
356
+ }
357
+
358
+ return {
359
+ h,
360
+ s,
361
+ l,
362
+ };
363
+ };
364
+
365
+ export {
366
+ getRGBColor,
367
+ HSLToRGB,
368
+ HEXToRGB,
369
+ RGBToHSL,
370
+ };
@@ -1,8 +1,11 @@
1
- import UI5Element from "../UI5Element.js";
2
1
  import isNodeHidden from "./isNodeHidden.js";
3
2
  import isNodeClickable from "./isNodeClickable.js";
4
3
 
5
- const getFirstFocusableElement = container => {
4
+ const isFocusTrap = el => {
5
+ return el.hasAttribute("data-ui5-focus-trap");
6
+ };
7
+
8
+ const getFirstFocusableElement = async container => {
6
9
  if (!container || isNodeHidden(container)) {
7
10
  return null;
8
11
  }
@@ -10,7 +13,7 @@ const getFirstFocusableElement = container => {
10
13
  return findFocusableElement(container, true);
11
14
  };
12
15
 
13
- const getLastFocusableElement = container => {
16
+ const getLastFocusableElement = async container => {
14
17
  if (!container || isNodeHidden(container)) {
15
18
  return null;
16
19
  }
@@ -18,9 +21,16 @@ const getLastFocusableElement = container => {
18
21
  return findFocusableElement(container, false);
19
22
  };
20
23
 
21
- const findFocusableElement = (container, forward) => {
24
+ const isElemFocusable = el => {
25
+ return el.hasAttribute("data-ui5-focus-redirect") || !isNodeHidden(el);
26
+ };
27
+
28
+ const findFocusableElement = async (container, forward) => {
22
29
  let child;
23
- if (container.assignedNodes && container.assignedNodes()) {
30
+
31
+ if (container.shadowRoot) {
32
+ child = forward ? container.shadowRoot.firstChild : container.shadowRoot.lastChild;
33
+ } else if (container.assignedNodes && container.assignedNodes()) {
24
34
  const assignedElements = container.assignedNodes();
25
35
  child = forward ? assignedElements[0] : assignedElements[assignedElements.length - 1];
26
36
  } else {
@@ -29,20 +39,25 @@ const findFocusableElement = (container, forward) => {
29
39
 
30
40
  let focusableDescendant;
31
41
 
42
+ /* eslint-disable no-await-in-loop */
43
+
32
44
  while (child) {
33
45
  const originalChild = child;
34
46
 
35
- child = child instanceof UI5Element ? child.getFocusDomRef() : child;
47
+ if (child.isUI5Element) {
48
+ child = await child.getFocusDomRefAsync();
49
+ }
50
+
36
51
  if (!child) {
37
52
  return null;
38
53
  }
39
54
 
40
- if (child.nodeType === 1 && !isNodeHidden(child)) {
55
+ if (child.nodeType === 1 && isElemFocusable(child) && !isFocusTrap(child)) {
41
56
  if (isNodeClickable(child)) {
42
57
  return (child && typeof child.focus === "function") ? child : null;
43
58
  }
44
59
 
45
- focusableDescendant = findFocusableElement(child, forward);
60
+ focusableDescendant = await findFocusableElement(child, forward);
46
61
  if (focusableDescendant) {
47
62
  return (focusableDescendant && typeof focusableDescendant.focus === "function") ? focusableDescendant : null;
48
63
  }
@@ -51,6 +66,8 @@ const findFocusableElement = (container, forward) => {
51
66
  child = forward ? originalChild.nextSibling : originalChild.previousSibling;
52
67
  }
53
68
 
69
+ /* eslint-enable no-await-in-loop */
70
+
54
71
  return null;
55
72
  };
56
73
 
@@ -0,0 +1,7 @@
1
+ import sanitizeHTML from "../sap/base/security/sanitizeHTML.js";
2
+ import URLListValidator from "../sap/base/security/URLListValidator.js";
3
+
4
+ export {
5
+ URLListValidator,
6
+ sanitizeHTML,
7
+ };
@@ -0,0 +1,58 @@
1
+ import InvisibleMessageMode from "../types/InvisibleMessageMode.js";
2
+ import getSingletonElementInstance from "./getSingletonElementInstance.js";
3
+ import { attachBoot } from "../Boot.js";
4
+
5
+ let politeSpan;
6
+ let assertiveSpan;
7
+
8
+ attachBoot(() => {
9
+ if (politeSpan && assertiveSpan) {
10
+ return;
11
+ }
12
+
13
+ const styles = `position: absolute;
14
+ clip: rect(1px,1px,1px,1px);
15
+ user-select: none;
16
+ left: -1000px;
17
+ top: -1000px;
18
+ pointer-events: none;`;
19
+
20
+ politeSpan = document.createElement("span");
21
+ assertiveSpan = document.createElement("span");
22
+
23
+ politeSpan.classList.add("ui5-invisiblemessage-polite");
24
+ assertiveSpan.classList.add("ui5-invisiblemessage-assertive");
25
+
26
+ politeSpan.setAttribute("aria-live", "polite");
27
+ assertiveSpan.setAttribute("aria-live", "assertive");
28
+
29
+ politeSpan.setAttribute("role", "alert");
30
+ assertiveSpan.setAttribute("role", "alert");
31
+
32
+ politeSpan.style.cssText = styles;
33
+ assertiveSpan.style.cssText = styles;
34
+
35
+ getSingletonElementInstance("ui5-static-area").appendChild(politeSpan);
36
+ getSingletonElementInstance("ui5-static-area").appendChild(assertiveSpan);
37
+ });
38
+
39
+ /**
40
+ * Inserts the string into the respective span, depending on the mode provided.
41
+ *
42
+ * @param {string} message String to be announced by the screen reader.
43
+ * @param {sap.ui.core.InvisibleMessageMode} mode The mode to be inserted in the aria-live attribute.
44
+ */
45
+ const announce = (message, mode) => {
46
+ // If no type is presented, fallback to polite announcement.
47
+ const span = mode === InvisibleMessageMode.Assertive ? assertiveSpan : politeSpan;
48
+
49
+ // Set textContent to empty string in order to trigger screen reader's announcement.
50
+ span.textContent = "";
51
+ span.textContent = message;
52
+
53
+ if (mode !== InvisibleMessageMode.Assertive && mode !== InvisibleMessageMode.Polite) {
54
+ console.warn(`You have entered an invalid mode. Valid values are: "Polite" and "Assertive". The framework will automatically set the mode to "Polite".`); // eslint-disable-line
55
+ }
56
+ };
57
+
58
+ export default announce;
@@ -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
+ };