@ui5/webcomponents-base 0.0.0-306572ffa → 0.0.0-35e2c9666

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 (328) hide show
  1. package/.eslintignore +3 -0
  2. package/CHANGELOG.md +242 -0
  3. package/README.md +26 -2
  4. package/bundle.esm.js +13 -11
  5. package/dist/AssetRegistry.js +8 -7
  6. package/dist/Boot.js +59 -0
  7. package/dist/CSP.js +59 -0
  8. package/dist/CustomElementsRegistry.js +60 -4
  9. package/dist/DOMObserver.js +65 -0
  10. package/dist/Device.js +69 -776
  11. package/dist/EventProvider.js +30 -26
  12. package/dist/FeaturesRegistry.js +4 -1
  13. package/dist/FontFace.js +19 -62
  14. package/dist/InitialConfiguration.js +43 -8
  15. package/dist/Keys.js +107 -0
  16. package/dist/ManagedStyles.js +83 -0
  17. package/dist/MediaRange.js +109 -0
  18. package/{src/util/parseProperties.js → dist/PropertiesFileFormat.js} +6 -0
  19. package/dist/Render.js +175 -0
  20. package/dist/RenderScheduler.js +16 -138
  21. package/dist/Runtimes.js +107 -0
  22. package/dist/StaticArea.js +1 -29
  23. package/dist/StaticAreaItem.js +58 -65
  24. package/dist/SystemCSSVars.js +4 -25
  25. package/dist/Theming.js +2 -1
  26. package/dist/UI5Element.js +310 -365
  27. package/dist/UI5ElementMetadata.js +131 -16
  28. package/dist/asset-registries/Icons.js +121 -13
  29. package/dist/asset-registries/Illustrations.js +30 -0
  30. package/dist/asset-registries/LocaleData.js +105 -66
  31. package/dist/asset-registries/Themes.js +23 -32
  32. package/dist/asset-registries/i18n.js +62 -48
  33. package/dist/assets-meta/IconCollectionsAlias.js +18 -0
  34. package/dist/config/Language.js +33 -6
  35. package/dist/config/Theme.js +25 -0
  36. package/dist/css/FontFace.css +45 -0
  37. package/dist/css/OverrideFontFace.css +32 -0
  38. package/dist/css/SystemCSSVars.css +17 -0
  39. package/dist/delegate/ItemNavigation.js +239 -170
  40. package/dist/delegate/ResizeHandler.js +78 -37
  41. package/dist/delegate/ScrollEnablement.js +49 -20
  42. package/dist/features/F6Navigation.js +108 -0
  43. package/dist/features/OpenUI5Support.js +41 -6
  44. package/dist/generated/AssetParameters.js +1 -1
  45. package/dist/generated/VersionInfo.js +10 -0
  46. package/dist/generated/css/FontFace.css.js +5 -0
  47. package/dist/generated/css/OverrideFontFace.css.js +5 -0
  48. package/dist/generated/css/SystemCSSVars.css.js +5 -0
  49. package/dist/i18nBundle.js +38 -4
  50. package/dist/isLegacyBrowser.js +3 -0
  51. package/dist/locale/applyDirection.js +6 -4
  52. package/dist/locale/directionChange.js +32 -0
  53. package/dist/locale/getEffectiveDir.js +28 -0
  54. package/dist/locale/getLocale.js +12 -2
  55. package/dist/locale/languageChange.js +1 -1
  56. package/dist/renderer/LitRenderer.js +24 -21
  57. package/dist/renderer/directives/style-map.js +72 -0
  58. package/dist/resources/bundle.esm.js +17 -109
  59. package/dist/resources/bundle.esm.js.map +1 -1
  60. package/dist/sap/base/Log.js +241 -0
  61. package/dist/sap/base/assert.js +8 -0
  62. package/dist/sap/base/security/URLListValidator.js +148 -0
  63. package/dist/sap/base/security/encodeCSS.js +14 -0
  64. package/dist/sap/base/security/encodeXML.js +23 -0
  65. package/dist/sap/base/security/sanitizeHTML.js +16 -0
  66. package/dist/sap/base/strings/toHex.js +8 -0
  67. package/dist/sap/base/util/now.js +7 -0
  68. package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
  69. package/dist/test-resources/assets/Themes.js +8 -8
  70. package/dist/test-resources/elements/Parent.js +6 -2
  71. package/dist/test-resources/elements/WithStaticArea.js +2 -1
  72. package/dist/test-resources/pages/AllTestElements.html +3 -3
  73. package/dist/test-resources/pages/Configuration.html +0 -2
  74. package/dist/test-resources/pages/ConfigurationScript.html +0 -2
  75. package/dist/test-resources/pages/i18n.html +2 -9
  76. package/dist/test-resources/specs/ConfigurationChange.spec.js +10 -8
  77. package/dist/test-resources/specs/ConfigurationScript.spec.js +25 -23
  78. package/dist/test-resources/specs/ConfigurationURL.spec.js +65 -17
  79. package/dist/test-resources/specs/CustomTheme.spec.js +9 -7
  80. package/dist/test-resources/specs/EventProvider.spec.js +63 -0
  81. package/dist/test-resources/specs/StaticArea.spec.js +56 -12
  82. package/dist/test-resources/specs/Theming.spec.js +12 -10
  83. package/dist/test-resources/specs/UI5ElementInvalidation.js +54 -70
  84. package/dist/test-resources/specs/UI5ElementLifecycle.js +17 -15
  85. package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +25 -51
  86. package/dist/test-resources/specs/UI5ElementMetadataExt.js +9 -7
  87. package/dist/test-resources/specs/UI5ElementPropertyValidation.js +7 -5
  88. package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +37 -35
  89. package/dist/test-resources/specs/UI5ElementShadowDOM.js +10 -8
  90. package/dist/test-resources/specs/UI5ElementSlots.js +10 -8
  91. package/dist/theming/CustomStyle.js +25 -5
  92. package/dist/theming/ThemeLoaded.js +22 -0
  93. package/dist/theming/applyTheme.js +13 -15
  94. package/dist/theming/getConstructableStyle.js +7 -6
  95. package/dist/theming/getEffectiveLinksHrefs.js +20 -0
  96. package/dist/theming/getEffectiveStyle.js +15 -8
  97. package/dist/theming/getStylesString.js +4 -2
  98. package/dist/theming/getThemeDesignerTheme.js +25 -5
  99. package/dist/theming/preloadLinks.js +23 -0
  100. package/dist/types/CSSColor.js +9 -0
  101. package/dist/types/CalendarType.js +1 -1
  102. package/dist/types/DataType.js +13 -1
  103. package/dist/types/Float.js +4 -0
  104. package/dist/types/Integer.js +4 -0
  105. package/dist/types/InvisibleMessageMode.js +30 -0
  106. package/dist/types/ItemNavigationBehavior.js +2 -7
  107. package/dist/types/PopupState.js +1 -1
  108. package/dist/types/ValueState.js +1 -1
  109. package/dist/updateShadowRoot.js +30 -0
  110. package/dist/util/AriaLabelHelper.js +41 -0
  111. package/dist/util/Caret.js +45 -0
  112. package/dist/util/ColorConversion.js +370 -0
  113. package/dist/util/FocusableElements.js +22 -9
  114. package/dist/util/HTMLSanitizer.js +7 -0
  115. package/dist/util/InvisibleMessage.js +60 -0
  116. package/dist/util/PopupUtils.js +93 -0
  117. package/dist/util/SlotsHelper.js +43 -0
  118. package/dist/util/TabbableElements.js +5 -1
  119. package/dist/util/arraysAreEqual.js +15 -0
  120. package/dist/util/clamp.js +12 -0
  121. package/dist/util/createLinkInHead.js +19 -0
  122. package/dist/util/debounce.js +17 -0
  123. package/dist/util/escapeRegex.js +10 -0
  124. package/dist/util/generateHighlightedMarkup.js +42 -0
  125. package/dist/util/getActiveElement.js +11 -0
  126. package/dist/util/getClassCopy.js +10 -0
  127. package/dist/util/getEffectiveContentDensity.js +5 -0
  128. package/dist/util/isElementInView.js +15 -0
  129. package/dist/util/isNodeHidden.js +1 -1
  130. package/dist/util/isNodeTabbable.js +4 -4
  131. package/dist/util/isValidPropertyName.js +4 -2
  132. package/hash.txt +1 -0
  133. package/index.js +1 -1
  134. package/lib/generate-asset-parameters/index.js +0 -1
  135. package/lib/generate-styles/index.js +18 -0
  136. package/lib/generate-version-info/index.js +27 -0
  137. package/package-scripts.js +34 -19
  138. package/package.json +19 -13
  139. package/src/AssetRegistry.js +8 -7
  140. package/src/Boot.js +59 -0
  141. package/src/CSP.js +59 -0
  142. package/src/CustomElementsRegistry.js +60 -4
  143. package/src/DOMObserver.js +65 -0
  144. package/src/Device.js +69 -776
  145. package/src/EventProvider.js +30 -26
  146. package/src/FeaturesRegistry.js +4 -1
  147. package/src/FontFace.js +19 -62
  148. package/src/InitialConfiguration.js +43 -8
  149. package/src/Keys.js +107 -0
  150. package/src/ManagedStyles.js +83 -0
  151. package/src/MediaRange.js +109 -0
  152. package/{dist/util/parseProperties.js → src/PropertiesFileFormat.js} +6 -0
  153. package/src/Render.js +175 -0
  154. package/src/RenderScheduler.js +16 -138
  155. package/src/Runtimes.js +107 -0
  156. package/src/StaticArea.js +1 -29
  157. package/src/StaticAreaItem.js +58 -65
  158. package/src/SystemCSSVars.js +4 -25
  159. package/src/Theming.js +2 -1
  160. package/src/UI5Element.js +310 -365
  161. package/src/UI5ElementMetadata.js +131 -16
  162. package/src/asset-registries/Icons.js +121 -13
  163. package/src/asset-registries/Illustrations.js +30 -0
  164. package/src/asset-registries/LocaleData.js +105 -66
  165. package/src/asset-registries/Themes.js +23 -32
  166. package/src/asset-registries/i18n.js +62 -48
  167. package/src/assets-meta/IconCollectionsAlias.js +18 -0
  168. package/src/config/Language.js +33 -6
  169. package/src/config/Theme.js +25 -0
  170. package/src/css/FontFace.css +45 -0
  171. package/src/css/OverrideFontFace.css +32 -0
  172. package/src/css/SystemCSSVars.css +17 -0
  173. package/src/delegate/ItemNavigation.js +239 -170
  174. package/src/delegate/ResizeHandler.js +78 -37
  175. package/src/delegate/ScrollEnablement.js +49 -20
  176. package/src/features/F6Navigation.js +108 -0
  177. package/src/features/OpenUI5Support.js +41 -6
  178. package/src/i18nBundle.js +38 -4
  179. package/src/isLegacyBrowser.js +3 -0
  180. package/src/locale/applyDirection.js +6 -4
  181. package/src/locale/directionChange.js +32 -0
  182. package/src/locale/getEffectiveDir.js +28 -0
  183. package/src/locale/getLocale.js +12 -2
  184. package/src/locale/languageChange.js +1 -1
  185. package/src/renderer/LitRenderer.js +24 -21
  186. package/src/renderer/directives/style-map.js +72 -0
  187. package/src/theming/CustomStyle.js +25 -5
  188. package/src/theming/ThemeLoaded.js +22 -0
  189. package/src/theming/applyTheme.js +13 -15
  190. package/src/theming/getConstructableStyle.js +7 -6
  191. package/src/theming/getEffectiveLinksHrefs.js +20 -0
  192. package/src/theming/getEffectiveStyle.js +15 -8
  193. package/src/theming/getStylesString.js +4 -2
  194. package/src/theming/getThemeDesignerTheme.js +25 -5
  195. package/src/theming/preloadLinks.js +23 -0
  196. package/src/types/CSSColor.js +9 -0
  197. package/src/types/CalendarType.js +1 -1
  198. package/src/types/DataType.js +13 -1
  199. package/src/types/Float.js +4 -0
  200. package/src/types/Integer.js +4 -0
  201. package/src/types/InvisibleMessageMode.js +30 -0
  202. package/src/types/ItemNavigationBehavior.js +2 -7
  203. package/src/types/PopupState.js +1 -1
  204. package/src/types/ValueState.js +1 -1
  205. package/src/updateShadowRoot.js +30 -0
  206. package/src/util/AriaLabelHelper.js +41 -0
  207. package/src/util/Caret.js +45 -0
  208. package/src/util/ColorConversion.js +370 -0
  209. package/src/util/FocusableElements.js +22 -9
  210. package/src/util/HTMLSanitizer.js +7 -0
  211. package/src/util/InvisibleMessage.js +60 -0
  212. package/src/util/PopupUtils.js +93 -0
  213. package/src/util/SlotsHelper.js +43 -0
  214. package/src/util/TabbableElements.js +5 -1
  215. package/src/util/arraysAreEqual.js +15 -0
  216. package/src/util/clamp.js +12 -0
  217. package/src/util/createLinkInHead.js +19 -0
  218. package/src/util/debounce.js +17 -0
  219. package/src/util/escapeRegex.js +10 -0
  220. package/src/util/generateHighlightedMarkup.js +42 -0
  221. package/src/util/getActiveElement.js +11 -0
  222. package/src/util/getClassCopy.js +10 -0
  223. package/src/util/getEffectiveContentDensity.js +5 -0
  224. package/src/util/isElementInView.js +15 -0
  225. package/src/util/isNodeHidden.js +1 -1
  226. package/src/util/isNodeTabbable.js +4 -4
  227. package/src/util/isValidPropertyName.js +4 -2
  228. package/used-modules.txt +10 -0
  229. package/bundle.es5.js +0 -28
  230. package/dist/SVGIconRegistry.js +0 -62
  231. package/dist/boot.js +0 -34
  232. package/dist/compatibility/DOMObserver.js +0 -62
  233. package/dist/compatibility/patchNodeValue.js +0 -24
  234. package/dist/compatibility/whenPolyfillLoaded.js +0 -26
  235. package/dist/delegate/CustomResize.js +0 -78
  236. package/dist/delegate/NativeResize.js +0 -44
  237. package/dist/features/PropertiesFormatSupport.js +0 -8
  238. package/dist/features/browsersupport/Edge.js +0 -6
  239. package/dist/features/browsersupport/IE11.js +0 -41
  240. package/dist/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
  241. package/dist/renderer/ifDefined.js +0 -21
  242. package/dist/renderer/scopeHTML.js +0 -32
  243. package/dist/resources/bundle.es5.js +0 -212
  244. package/dist/resources/bundle.es5.js.map +0 -1
  245. package/dist/theming/CSSVarsPonyfill.js +0 -24
  246. package/dist/theming/adaptCSSForIE.js +0 -95
  247. package/dist/theming/createComponentStyleTag.js +0 -55
  248. package/dist/theming/createThemePropertiesStyleTag.js +0 -20
  249. package/dist/thirdparty/Array.from.js +0 -16
  250. package/dist/thirdparty/Array.prototype.fill.js +0 -44
  251. package/dist/thirdparty/Array.prototype.find.js +0 -46
  252. package/dist/thirdparty/Array.prototype.includes.js +0 -51
  253. package/dist/thirdparty/Element.prototype.closest.js +0 -11
  254. package/dist/thirdparty/Element.prototype.matches.js +0 -6
  255. package/dist/thirdparty/Map.prototype.keys.js +0 -9
  256. package/dist/thirdparty/Number.isInteger.js +0 -5
  257. package/dist/thirdparty/Number.isNaN.js +0 -1
  258. package/dist/thirdparty/Number.parseInt.js +0 -1
  259. package/dist/thirdparty/Object.assign.js +0 -31
  260. package/dist/thirdparty/Object.entries.js +0 -11
  261. package/dist/thirdparty/Symbol.js +0 -2
  262. package/dist/thirdparty/WeakSet.js +0 -27
  263. package/dist/thirdparty/es6-string-methods.js +0 -182
  264. package/dist/thirdparty/events-polyfills.js +0 -89
  265. package/dist/thirdparty/fetch.js +0 -1
  266. package/dist/thirdparty/template.js +0 -600
  267. package/dist/thirdparty/webcomponents-sd-ce-pf.js +0 -318
  268. package/dist/util/getEffectiveAriaLabelText.js +0 -28
  269. package/dist/util/isSlot.js +0 -3
  270. package/dist/webcomponentsjs/LICENSE.md +0 -19
  271. package/dist/webcomponentsjs/README.md +0 -229
  272. package/dist/webcomponentsjs/bundles/webcomponents-ce.js +0 -63
  273. package/dist/webcomponentsjs/bundles/webcomponents-ce.js.map +0 -1
  274. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +0 -297
  275. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +0 -1
  276. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js +0 -208
  277. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +0 -1
  278. package/dist/webcomponentsjs/bundles/webcomponents-sd.js +0 -166
  279. package/dist/webcomponentsjs/bundles/webcomponents-sd.js.map +0 -1
  280. package/dist/webcomponentsjs/custom-elements-es5-adapter.js +0 -15
  281. package/dist/webcomponentsjs/package.json +0 -46
  282. package/dist/webcomponentsjs/src/entrypoints/custom-elements-es5-adapter-index.js +0 -16
  283. package/dist/webcomponentsjs/src/entrypoints/webcomponents-bundle-index.js +0 -53
  284. package/dist/webcomponentsjs/src/entrypoints/webcomponents-ce-index.js +0 -17
  285. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-index.js +0 -19
  286. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-pf-index.js +0 -28
  287. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-index.js +0 -18
  288. package/dist/webcomponentsjs/webcomponents-bundle.js +0 -298
  289. package/dist/webcomponentsjs/webcomponents-bundle.js.map +0 -1
  290. package/dist/webcomponentsjs/webcomponents-loader.js +0 -185
  291. package/src/SVGIconRegistry.js +0 -62
  292. package/src/boot.js +0 -34
  293. package/src/compatibility/DOMObserver.js +0 -62
  294. package/src/compatibility/patchNodeValue.js +0 -24
  295. package/src/compatibility/whenPolyfillLoaded.js +0 -26
  296. package/src/delegate/CustomResize.js +0 -78
  297. package/src/delegate/NativeResize.js +0 -44
  298. package/src/features/PropertiesFormatSupport.js +0 -8
  299. package/src/features/browsersupport/Edge.js +0 -6
  300. package/src/features/browsersupport/IE11.js +0 -41
  301. package/src/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
  302. package/src/renderer/ifDefined.js +0 -21
  303. package/src/renderer/scopeHTML.js +0 -32
  304. package/src/theming/CSSVarsPonyfill.js +0 -24
  305. package/src/theming/adaptCSSForIE.js +0 -95
  306. package/src/theming/createComponentStyleTag.js +0 -55
  307. package/src/theming/createThemePropertiesStyleTag.js +0 -20
  308. package/src/thirdparty/Array.from.js +0 -16
  309. package/src/thirdparty/Array.prototype.fill.js +0 -44
  310. package/src/thirdparty/Array.prototype.find.js +0 -46
  311. package/src/thirdparty/Array.prototype.includes.js +0 -51
  312. package/src/thirdparty/Element.prototype.closest.js +0 -11
  313. package/src/thirdparty/Element.prototype.matches.js +0 -6
  314. package/src/thirdparty/Map.prototype.keys.js +0 -9
  315. package/src/thirdparty/Number.isInteger.js +0 -5
  316. package/src/thirdparty/Number.isNaN.js +0 -1
  317. package/src/thirdparty/Number.parseInt.js +0 -1
  318. package/src/thirdparty/Object.assign.js +0 -31
  319. package/src/thirdparty/Object.entries.js +0 -11
  320. package/src/thirdparty/Symbol.js +0 -2
  321. package/src/thirdparty/WeakSet.js +0 -27
  322. package/src/thirdparty/es6-string-methods.js +0 -182
  323. package/src/thirdparty/events-polyfills.js +0 -89
  324. package/src/thirdparty/fetch.js +0 -1
  325. package/src/thirdparty/template.js +0 -600
  326. package/src/thirdparty/webcomponents-sd-ce-pf.js +0 -318
  327. package/src/util/getEffectiveAriaLabelText.js +0 -28
  328. package/src/util/isSlot.js +0 -3
@@ -1,9 +1,9 @@
1
- import { isPhone } from "../Device.js";
1
+ import { supportsTouch } from "../Device.js";
2
2
  import EventProvider from "../EventProvider.js";
3
3
  import scroll from "../animations/scroll.js";
4
4
 
5
5
  const scrollEventName = "scroll";
6
- const touchEndEventName = isPhone() ? "touchend" : "mouseup";
6
+ const touchEndEventName = supportsTouch() ? "touchend" : "mouseup";
7
7
 
8
8
  class ScrollEnablement extends EventProvider {
9
9
  constructor(containerComponent) {
@@ -13,7 +13,7 @@ class ScrollEnablement extends EventProvider {
13
13
  this.mouseUp = this.ontouchend.bind(this);
14
14
  this.touchStart = this.ontouchstart.bind(this);
15
15
 
16
- this.isPhone = isPhone();
16
+ this.supportsTouch = supportsTouch();
17
17
 
18
18
  // On Android devices touchmove is thrown one more time than neccessary (together with touchend)
19
19
  // so we have to cache the previus coordinates in order to provide correct parameters in the
@@ -25,7 +25,7 @@ class ScrollEnablement extends EventProvider {
25
25
  this.startX = 0;
26
26
  this.startY = 0;
27
27
 
28
- if (this.isPhone) {
28
+ if (this.supportsTouch) {
29
29
  containerComponent.addEventListener("touchstart", this.touchStart, { passive: true });
30
30
  containerComponent.addEventListener("touchmove", this.mouseMove, { passive: true });
31
31
  containerComponent.addEventListener("touchend", this.mouseUp, { passive: true });
@@ -42,12 +42,41 @@ class ScrollEnablement extends EventProvider {
42
42
  return this._container;
43
43
  }
44
44
 
45
- scrollTo(left, top) {
45
+ /**
46
+ * Scrolls the container to the left/top position, retrying retryCount times, if the container is not yet painted
47
+ *
48
+ * @param left
49
+ * @param top
50
+ * @param retryCount
51
+ * @param retryInterval
52
+ * @returns {Promise<void>} resolved when scrolled successfully
53
+ */
54
+ async scrollTo(left, top, retryCount = 0, retryInterval = 0) {
55
+ let containerPainted = this.scrollContainer.clientHeight > 0 && this.scrollContainer.clientWidth > 0;
56
+
57
+ /* eslint-disable no-loop-func, no-await-in-loop */
58
+ while (!containerPainted && retryCount > 0) {
59
+ await new Promise(resolve => {
60
+ setTimeout(() => {
61
+ containerPainted = this.scrollContainer.clientHeight > 0 && this.scrollContainer.clientWidth > 0;
62
+ retryCount--;
63
+ resolve();
64
+ }, retryInterval);
65
+ });
66
+ }
67
+ /* eslint-disable no-loop-func, no-await-in-loop */
68
+
46
69
  this._container.scrollLeft = left;
47
70
  this._container.scrollTop = top;
48
71
  }
49
72
 
50
- move(dx, dy) {
73
+ move(dx, dy, disableAnimation) {
74
+ if (disableAnimation) {
75
+ this._container.scrollLeft += dx;
76
+ this._container.scrollTop += dy;
77
+ return;
78
+ }
79
+
51
80
  return scroll({
52
81
  element: this._container,
53
82
  dx,
@@ -65,17 +94,17 @@ class ScrollEnablement extends EventProvider {
65
94
 
66
95
  _isTouchInside(touch) {
67
96
  const rect = this._container.getBoundingClientRect();
68
- const x = this.isPhone ? touch.clientX : touch.x;
69
- const y = this.isPhone ? touch.clientY : touch.y;
97
+ const x = this.supportsTouch ? touch.clientX : touch.x;
98
+ const y = this.supportsTouch ? touch.clientY : touch.y;
70
99
 
71
100
  return x >= rect.left && x <= rect.right
72
101
  && y >= rect.top && y <= rect.bottom;
73
102
  }
74
103
 
75
104
  ontouchstart(event) {
76
- const touch = this.isPhone ? event.touches[0] : null;
105
+ const touch = this.supportsTouch ? event.touches[0] : null;
77
106
 
78
- if (!this.isPhone) {
107
+ if (!this.supportsTouch) {
79
108
  document.addEventListener("mouseup", this.mouseUp, { passive: true });
80
109
  document.addEventListener("mousemove", this.mouseMove, { passive: true });
81
110
  } else {
@@ -84,10 +113,10 @@ class ScrollEnablement extends EventProvider {
84
113
  this.startY = touch.pageY;
85
114
  }
86
115
 
87
- this._prevDragX = this.isPhone ? touch.pageX : event.x;
88
- this._prevDragY = this.isPhone ? touch.pageY : event.y;
116
+ this._prevDragX = this.supportsTouch ? touch.pageX : event.x;
117
+ this._prevDragY = this.supportsTouch ? touch.pageY : event.y;
89
118
 
90
- this._canScroll = this._isTouchInside(this.isPhone ? touch : event);
119
+ this._canScroll = this._isTouchInside(this.supportsTouch ? touch : event);
91
120
  }
92
121
 
93
122
  ontouchmove(event) {
@@ -96,10 +125,10 @@ class ScrollEnablement extends EventProvider {
96
125
  }
97
126
 
98
127
  const container = this._container;
99
- const touch = this.isPhone ? event.touches[0] : null;
128
+ const touch = this.supportsTouch ? event.touches[0] : null;
100
129
 
101
- const dragX = this.isPhone ? touch.pageX : event.x;
102
- const dragY = this.isPhone ? touch.pageY : event.y;
130
+ const dragX = this.supportsTouch ? touch.pageX : event.x;
131
+ const dragY = this.supportsTouch ? touch.pageY : event.y;
103
132
 
104
133
  container.scrollLeft += this._prevDragX - dragX;
105
134
  container.scrollTop += this._prevDragY - dragY;
@@ -117,7 +146,7 @@ class ScrollEnablement extends EventProvider {
117
146
  }
118
147
 
119
148
  ontouchend(event) {
120
- if (this.isPhone) {
149
+ if (this.supportsTouch) {
121
150
  const deltaX = Math.abs(event.changedTouches[0].pageX - this.startX);
122
151
  const deltaY = Math.abs(event.changedTouches[0].pageY - this.startY);
123
152
 
@@ -131,8 +160,8 @@ class ScrollEnablement extends EventProvider {
131
160
  }
132
161
 
133
162
  const container = this._container;
134
- const dragX = this.isPhone ? event.changedTouches[0].pageX : event.x;
135
- const dragY = this.isPhone ? event.changedTouches[0].pageY : event.y;
163
+ const dragX = this.supportsTouch ? event.changedTouches[0].pageX : event.x;
164
+ const dragY = this.supportsTouch ? event.changedTouches[0].pageY : event.y;
136
165
 
137
166
  container.scrollLeft += this._prevDragX - dragX;
138
167
  container.scrollTop += this._prevDragY - dragY;
@@ -149,7 +178,7 @@ class ScrollEnablement extends EventProvider {
149
178
  this._prevDragX = dragX;
150
179
  this._prevDragY = dragY;
151
180
 
152
- if (!this.isPhone) {
181
+ if (!this.supportsTouch) {
153
182
  document.removeEventListener("mousemove", this.mouseMove, { passive: true });
154
183
  document.removeEventListener("mouseup", this.mouseUp);
155
184
  }
@@ -0,0 +1,108 @@
1
+ import { registerFeature } from "../FeaturesRegistry.js";
2
+ import { isF6Next, isF6Previous } from "../Keys.js";
3
+ import { getFirstFocusableElement } from "../util/FocusableElements.js";
4
+
5
+ class F6Navigation {
6
+ init() {
7
+ this.keydownHandler = this._keydownHandler.bind(this);
8
+ this.attachEventListeners();
9
+ this.selectedGroup = null;
10
+ this.groups = [];
11
+ }
12
+
13
+ attachEventListeners() {
14
+ document.addEventListener("keydown", this.keydownHandler);
15
+ }
16
+
17
+ async _keydownHandler(event) {
18
+ event.preventDefault();
19
+
20
+ if (isF6Next(event)) {
21
+ this.updateGroups();
22
+ if (this.groups.length < 1) {
23
+ return;
24
+ }
25
+
26
+ const nextIndex = this.groups.indexOf(this.selectedGroup);
27
+ let nextElement = null;
28
+
29
+ if (nextIndex > -1) {
30
+ if (nextIndex + 1 >= this.groups.length) {
31
+ nextElement = this.groups[0];
32
+ } else {
33
+ nextElement = this.groups[nextIndex + 1];
34
+ }
35
+ } else {
36
+ nextElement = this.groups[0];
37
+ }
38
+
39
+ const elementToFocus = await getFirstFocusableElement(nextElement.isUI5Element ? nextElement.getDomRef() : nextElement, true);
40
+ elementToFocus.focus();
41
+ }
42
+
43
+ if (isF6Previous(event)) {
44
+ this.updateGroups();
45
+ if (this.groups.length < 1) {
46
+ return;
47
+ }
48
+
49
+ const nextIndex = this.groups.indexOf(this.selectedGroup);
50
+ let nextElement = null;
51
+
52
+ if (nextIndex > -1) {
53
+ if (nextIndex - 1 < 0) {
54
+ nextElement = this.groups[this.groups.length - 1];
55
+ } else {
56
+ // Handle the situation where the first focusable element of two neighbor groups is the same
57
+ // For example:
58
+ // <ui5-flexible-column-layout>
59
+ // <ui5-list>
60
+ // <ui5-li>List Item</ui5-li>
61
+ // </ui5-list>
62
+ // </ui5-flexible-column-layout>
63
+ // Here for both FCL & List the firstFoccusableElement is the same (the ui5-li)
64
+
65
+ const firstFocusable = await getFirstFocusableElement(this.groups[nextIndex - 1], true);
66
+ const shouldSkipParent = firstFocusable === await getFirstFocusableElement(this.groups[nextIndex], true);
67
+
68
+ nextElement = this.groups[shouldSkipParent ? nextIndex - 2 : nextIndex - 1];
69
+ }
70
+ } else {
71
+ nextElement = this.groups[this.groups.length - 1];
72
+ }
73
+
74
+ const elementToFocus = await getFirstFocusableElement(nextElement.isUI5Element ? nextElement.getDomRef() : nextElement, true);
75
+ elementToFocus.focus();
76
+ }
77
+ }
78
+
79
+ removeEventListeners() {
80
+ document.removeEventListener("keydown", this.keydownHandler);
81
+ }
82
+
83
+ updateGroups() {
84
+ this.setSelectedGroup(document.activeElement);
85
+ this.setGroups();
86
+ }
87
+
88
+ setGroups() {
89
+ this.groups = Array.from(document.querySelectorAll("[data-sap-ui-fastnavgroup='true']")).filter(group => group.clientWidth && window.getComputedStyle(group).visibility !== "hidden");
90
+ }
91
+
92
+ setSelectedGroup(element) {
93
+ while (element && element.getAttribute("data-sap-ui-fastnavgroup") !== "true" && element !== document.querySelector("html")) {
94
+ element = element.parentElement ? element.parentNode : element.parentNode.host;
95
+ }
96
+
97
+ this.selectedGroup = element;
98
+ }
99
+
100
+ destroy() {
101
+ this.removeEventListeners();
102
+ }
103
+ }
104
+
105
+ const F6HelperInstance = new F6Navigation();
106
+ registerFeature("F6Navigation", F6HelperInstance);
107
+
108
+ export default F6Navigation;
@@ -1,32 +1,41 @@
1
1
  import { registerFeature } from "../FeaturesRegistry.js";
2
2
  import { setTheme } from "../config/Theme.js";
3
+ import { getCurrentZIndex } from "../util/PopupUtils.js";
3
4
 
4
- const sap = window.sap;
5
- const core = sap && sap.ui && typeof sap.ui.getCore === "function" && sap.ui.getCore();
5
+ const getCore = () => {
6
+ const sap = window.sap;
7
+ const core = sap && sap.ui && typeof sap.ui.getCore === "function" && sap.ui.getCore();
8
+ return core;
9
+ };
6
10
 
7
11
  const isLoaded = () => {
8
- return !!core;
12
+ return !!getCore();
9
13
  };
10
14
 
11
15
  const init = () => {
16
+ const core = getCore();
12
17
  if (!core) {
13
18
  return Promise.resolve();
14
19
  }
15
20
 
16
21
  return new Promise(resolve => {
17
22
  core.attachInit(() => {
18
- sap.ui.require(["sap/ui/core/LocaleData"], resolve);
23
+ window.sap.ui.require(["sap/ui/core/LocaleData", "sap/ui/core/Popup"], (LocaleData, Popup) => {
24
+ Popup.setInitialZIndex(getCurrentZIndex());
25
+ resolve();
26
+ });
19
27
  });
20
28
  });
21
29
  };
22
30
 
23
31
  const getConfigurationSettingsObject = () => {
32
+ const core = getCore();
24
33
  if (!core) {
25
34
  return;
26
35
  }
27
36
 
28
37
  const config = core.getConfiguration();
29
- const LocaleData = sap.ui.require("sap/ui/core/LocaleData");
38
+ const LocaleData = window.sap.ui.require("sap/ui/core/LocaleData");
30
39
 
31
40
  return {
32
41
  animationMode: config.getAnimationMode(),
@@ -41,16 +50,18 @@ const getConfigurationSettingsObject = () => {
41
50
  };
42
51
 
43
52
  const getLocaleDataObject = () => {
53
+ const core = getCore();
44
54
  if (!core) {
45
55
  return;
46
56
  }
47
57
 
48
58
  const config = core.getConfiguration();
49
- const LocaleData = sap.ui.require("sap/ui/core/LocaleData");
59
+ const LocaleData = window.sap.ui.require("sap/ui/core/LocaleData");
50
60
  return LocaleData.getInstance(config.getLocale())._get();
51
61
  };
52
62
 
53
63
  const listenForThemeChange = () => {
64
+ const core = getCore();
54
65
  const config = core.getConfiguration();
55
66
  core.attachThemeChanged(async () => {
56
67
  await setTheme(config.getTheme());
@@ -58,6 +69,7 @@ const listenForThemeChange = () => {
58
69
  };
59
70
 
60
71
  const attachListeners = () => {
72
+ const core = getCore();
61
73
  if (!core) {
62
74
  return;
63
75
  }
@@ -66,6 +78,7 @@ const attachListeners = () => {
66
78
  };
67
79
 
68
80
  const cssVariablesLoaded = () => {
81
+ const core = getCore();
69
82
  if (!core) {
70
83
  return;
71
84
  }
@@ -78,6 +91,26 @@ const cssVariablesLoaded = () => {
78
91
  return !!link.href.match(/\/css(-|_)variables\.css/);
79
92
  };
80
93
 
94
+ const getNextZIndex = () => {
95
+ const core = getCore();
96
+ if (!core) {
97
+ return;
98
+ }
99
+
100
+ const Popup = window.sap.ui.require("sap/ui/core/Popup");
101
+ return Popup.getNextZIndex();
102
+ };
103
+
104
+ const setInitialZIndex = () => {
105
+ const core = getCore();
106
+ if (!core) {
107
+ return;
108
+ }
109
+
110
+ const Popup = window.sap.ui.require("sap/ui/core/Popup");
111
+ Popup.setInitialZIndex(getCurrentZIndex());
112
+ };
113
+
81
114
  const OpenUI5Support = {
82
115
  isLoaded,
83
116
  init,
@@ -85,6 +118,8 @@ const OpenUI5Support = {
85
118
  getLocaleDataObject,
86
119
  attachListeners,
87
120
  cssVariablesLoaded,
121
+ getNextZIndex,
122
+ setInitialZIndex,
88
123
  };
89
124
 
90
125
  registerFeature("OpenUI5Support", OpenUI5Support);
package/src/i18nBundle.js CHANGED
@@ -1,8 +1,10 @@
1
- import { registerI18nBundle, fetchI18nBundle, getI18nBundleData } from "./asset-registries/i18n.js";
1
+ import { registerI18nLoader, fetchI18nBundle, getI18nBundleData } from "./asset-registries/i18n.js";
2
2
  import formatMessage from "./util/formatMessage.js";
3
3
 
4
4
  const I18nBundleInstances = new Map();
5
5
 
6
+ let customGetI18nBundle;
7
+
6
8
  /**
7
9
  * @class
8
10
  * @public
@@ -15,6 +17,7 @@ class I18nBundle {
15
17
  /**
16
18
  * Returns a text in the currently loaded language
17
19
  *
20
+ * @public
18
21
  * @param {Object|String} textObj key/defaultText pair or just the key
19
22
  * @param params Values for the placeholders
20
23
  * @returns {*}
@@ -29,13 +32,16 @@ class I18nBundle {
29
32
  }
30
33
 
31
34
  const bundle = getI18nBundleData(this.packageName);
35
+ if (bundle && !bundle[textObj.key]) {
36
+ console.warn(`Key ${textObj.key} not found in the i18n bundle, the default text will be used`); // eslint-disable-line
37
+ }
32
38
  const messageText = bundle && bundle[textObj.key] ? bundle[textObj.key] : (textObj.defaultText || textObj.key);
33
39
 
34
40
  return formatMessage(messageText, params);
35
41
  }
36
42
  }
37
43
 
38
- const getI18nBundle = packageName => {
44
+ const getI18nBundleSync = packageName => {
39
45
  if (I18nBundleInstances.has(packageName)) {
40
46
  return I18nBundleInstances.get(packageName);
41
47
  }
@@ -45,8 +51,36 @@ const getI18nBundle = packageName => {
45
51
  return i18nBundle;
46
52
  };
47
53
 
54
+ /**
55
+ * Allows developers to provide a custom getI18nBundle implementation
56
+ * If this function is called, the custom implementation will be used for all components and will completely
57
+ * replace the default implementation.
58
+ *
59
+ * @public
60
+ * @param customGet the function to use instead of the standard getI18nBundle implementation
61
+ */
62
+ const registerCustomI18nBundleGetter = customGet => {
63
+ customGetI18nBundle = customGet;
64
+ };
65
+
66
+ /**
67
+ * Fetches and returns the I18nBundle instance for the given package
68
+ *
69
+ * @public
70
+ * @param packageName
71
+ * @returns {Promise<I18nBundle>}
72
+ */
73
+ const getI18nBundle = async packageName => {
74
+ if (customGetI18nBundle) {
75
+ return customGetI18nBundle(packageName);
76
+ }
77
+
78
+ await fetchI18nBundle(packageName);
79
+ return getI18nBundleSync(packageName);
80
+ };
81
+
48
82
  export {
49
- registerI18nBundle,
50
- fetchI18nBundle,
83
+ registerI18nLoader,
51
84
  getI18nBundle,
85
+ registerCustomI18nBundleGetter,
52
86
  };
@@ -0,0 +1,3 @@
1
+ const isLegacyBrowser = () => !!window.ShadyDOM;
2
+
3
+ export default isLegacyBrowser;
@@ -1,4 +1,5 @@
1
- import RenderScheduler from "../RenderScheduler.js";
1
+ import { reRenderAllUI5Elements } from "../Render.js";
2
+ import { fireDirectionChange } from "./directionChange.js";
2
3
 
3
4
  /**
4
5
  * Re-renders all RTL-aware UI5 Elements.
@@ -7,9 +8,10 @@ import RenderScheduler from "../RenderScheduler.js";
7
8
  *
8
9
  * @returns {Promise<void>}
9
10
  */
10
- const applyDirection = () => {
11
- RenderScheduler.reRenderAllUI5Elements({ rtlAware: true });
12
- return RenderScheduler.whenFinished();
11
+ const applyDirection = async () => {
12
+ const listenersResults = fireDirectionChange();
13
+ await Promise.all(listenersResults);
14
+ await reRenderAllUI5Elements({ rtlAware: true });
13
15
  };
14
16
 
15
17
  export default applyDirection;
@@ -0,0 +1,32 @@
1
+ import EventProvider from "../EventProvider.js";
2
+
3
+ const eventProvider = new EventProvider();
4
+ const DIR_CHANGE = "directionChange";
5
+
6
+ /**
7
+ * Attach a callback that will be executed whenever the application calls the "applyDirection" function
8
+ * @public
9
+ * @param listener
10
+ */
11
+ const attachDirectionChange = listener => {
12
+ eventProvider.attachEvent(DIR_CHANGE, listener);
13
+ };
14
+
15
+ /**
16
+ * Detach a callback that was passed with "attachDirectionChange"
17
+ * @public
18
+ * @param listener
19
+ */
20
+ const detachDirectionChange = listener => {
21
+ eventProvider.detachEvent(DIR_CHANGE, listener);
22
+ };
23
+
24
+ const fireDirectionChange = () => {
25
+ return eventProvider.fireEvent(DIR_CHANGE);
26
+ };
27
+
28
+ export {
29
+ attachDirectionChange,
30
+ detachDirectionChange,
31
+ fireDirectionChange,
32
+ };
@@ -0,0 +1,28 @@
1
+ import { getRTL } from "../config/RTL.js";
2
+
3
+ const GLOBAL_DIR_CSS_VAR = "--_ui5_dir";
4
+
5
+ const getEffectiveDir = element => {
6
+ const doc = window.document;
7
+ const dirValues = ["ltr", "rtl"]; // exclude "auto" and "" from all calculations
8
+ const locallyAppliedDir = getComputedStyle(element).getPropertyValue(GLOBAL_DIR_CSS_VAR);
9
+
10
+ // In that order, inspect the CSS Var (for modern browsers), the element itself, html and body (for IE fallback)
11
+ if (dirValues.includes(locallyAppliedDir)) {
12
+ return locallyAppliedDir;
13
+ }
14
+ if (dirValues.includes(element.dir)) {
15
+ return element.dir;
16
+ }
17
+ if (dirValues.includes(doc.documentElement.dir)) {
18
+ return doc.documentElement.dir;
19
+ }
20
+ if (dirValues.includes(doc.body.dir)) {
21
+ return doc.body.dir;
22
+ }
23
+
24
+ // Finally, check the configuration for explicitly set RTL or language-implied RTL
25
+ return getRTL() ? "rtl" : undefined;
26
+ };
27
+
28
+ export default getEffectiveDir;
@@ -2,10 +2,20 @@ import detectNavigatorLanguage from "../util/detectNavigatorLanguage.js";
2
2
  import { getLanguage as getConfigLanguage } from "../config/Language.js";
3
3
  import Locale from "./Locale.js";
4
4
 
5
+ const cache = new Map();
6
+
7
+ const getLocaleInstance = lang => {
8
+ if (!cache.has(lang)) {
9
+ cache.set(lang, new Locale(lang));
10
+ }
11
+
12
+ return cache.get(lang);
13
+ };
14
+
5
15
  const convertToLocaleOrNull = lang => {
6
16
  try {
7
17
  if (lang && typeof lang === "string") {
8
- return new Locale(lang);
18
+ return getLocaleInstance(lang);
9
19
  }
10
20
  } catch (e) {
11
21
  // ignore
@@ -22,7 +32,7 @@ const getLocale = lang => {
22
32
  }
23
33
 
24
34
  if (getConfigLanguage()) {
25
- return new Locale(getConfigLanguage());
35
+ return getLocaleInstance(getConfigLanguage());
26
36
  }
27
37
 
28
38
  return convertToLocaleOrNull(detectNavigatorLanguage());
@@ -12,7 +12,7 @@ const detachLanguageChange = listener => {
12
12
  };
13
13
 
14
14
  const fireLanguageChange = lang => {
15
- return eventProvider.fireEvent(LANG_CHANGE, lang);
15
+ return eventProvider.fireEventAsync(LANG_CHANGE, lang);
16
16
  };
17
17
 
18
18
  export {
@@ -1,31 +1,34 @@
1
- import { html, svg, render } from "lit-html/lit-html.js";
2
- import scopeHTML from "./scopeHTML.js";
1
+ import { render } from "lit-html";
2
+ import {
3
+ html,
4
+ svg,
5
+ unsafeStatic,
6
+ } from "lit-html/static.js";
3
7
 
4
- let tags;
5
- let suffix;
6
-
7
- const setTags = t => {
8
- tags = t;
9
- };
10
- const setSuffix = s => {
11
- suffix = s;
12
- };
13
-
14
- const litRender = (templateResult, domNode, styles, { eventContext } = {}) => {
15
- if (styles) {
16
- templateResult = html`<style>${styles}</style>${templateResult}`;
8
+ const litRender = (templateResult, domNode, styleStrOrHrefsArr, { host } = {}) => {
9
+ if (typeof styleStrOrHrefsArr === "string") {
10
+ templateResult = html`<style>${styleStrOrHrefsArr}</style>${templateResult}`;
11
+ } else if (Array.isArray(styleStrOrHrefsArr) && styleStrOrHrefsArr.length) {
12
+ templateResult = html`${styleStrOrHrefsArr.map(href => html`<link type="text/css" rel="stylesheet" href="${href}">`)}${templateResult}`;
17
13
  }
18
- render(templateResult, domNode, { eventContext });
14
+ render(templateResult, domNode, { host });
19
15
  };
20
16
 
21
- const scopedHtml = (strings, ...values) => html(scopeHTML(strings, tags, suffix), ...values);
22
- const scopedSvg = (strings, ...values) => svg(scopeHTML(strings, tags, suffix), ...values);
17
+ const scopeTag = (tag, tags, suffix) => {
18
+ const resultTag = suffix && (tags || []).includes(tag) ? `${tag}-${suffix}` : tag;
19
+ return unsafeStatic(resultTag);
20
+ };
23
21
 
24
- export { setTags, setSuffix };
25
- export { scopedHtml as html, scopedSvg as svg };
22
+ export {
23
+ html,
24
+ svg,
25
+ unsafeStatic,
26
+ };
27
+ export { scopeTag };
26
28
  export { repeat } from "lit-html/directives/repeat.js";
27
29
  export { classMap } from "lit-html/directives/class-map.js";
28
- export { styleMap } from "lit-html/directives/style-map.js";
30
+ export { styleMap } from "./directives/style-map.js";
31
+ export { ifDefined } from "lit-html/directives/if-defined.js";
29
32
  export { unsafeHTML } from "lit-html/directives/unsafe-html.js";
30
33
 
31
34
  export default litRender;