@ui5/webcomponents-base 0.0.0-e7dd012d7 → 0.0.0-ec448881d

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 (341) hide show
  1. package/.eslintignore +3 -0
  2. package/CHANGELOG.md +272 -0
  3. package/README.md +26 -2
  4. package/bundle.esm.js +13 -11
  5. package/dist/AssetRegistry.js +8 -9
  6. package/dist/Boot.js +59 -0
  7. package/dist/CSP.js +59 -0
  8. package/dist/CustomElementsRegistry.js +60 -4
  9. package/dist/CustomElementsScope.js +20 -98
  10. package/dist/CustomElementsScopeUtils.js +108 -0
  11. package/dist/DOMObserver.js +65 -0
  12. package/dist/Device.js +71 -773
  13. package/dist/EventProvider.js +30 -26
  14. package/dist/FeaturesRegistry.js +4 -1
  15. package/dist/FontFace.js +7 -95
  16. package/dist/InitialConfiguration.js +37 -21
  17. package/dist/Keys.js +98 -0
  18. package/dist/ManagedStyles.js +83 -0
  19. package/dist/MediaRange.js +109 -0
  20. package/{src/util/parseProperties.js → dist/PropertiesFileFormat.js} +6 -0
  21. package/dist/Render.js +175 -0
  22. package/dist/RenderScheduler.js +16 -138
  23. package/dist/Runtimes.js +107 -0
  24. package/dist/StaticArea.js +1 -29
  25. package/dist/StaticAreaItem.js +58 -65
  26. package/dist/SystemCSSVars.js +4 -25
  27. package/dist/UI5Element.js +315 -382
  28. package/dist/UI5ElementMetadata.js +132 -17
  29. package/dist/asset-registries/Icons.js +117 -14
  30. package/dist/asset-registries/Illustrations.js +30 -0
  31. package/dist/asset-registries/LocaleData.js +97 -68
  32. package/dist/asset-registries/Themes.js +29 -35
  33. package/dist/asset-registries/i18n.js +61 -50
  34. package/dist/assets-meta/IconCollectionsAlias.js +18 -0
  35. package/dist/config/Icons.js +52 -0
  36. package/dist/config/Language.js +18 -20
  37. package/dist/config/Theme.js +25 -0
  38. package/dist/css/BusyIndicator.css +80 -0
  39. package/dist/css/FontFace.css +75 -0
  40. package/dist/css/OverrideFontFace.css +32 -0
  41. package/dist/css/SystemCSSVars.css +17 -0
  42. package/dist/delegate/ItemNavigation.js +233 -201
  43. package/dist/delegate/ResizeHandler.js +78 -37
  44. package/dist/delegate/ScrollEnablement.js +49 -20
  45. package/dist/features/F6Navigation.js +106 -0
  46. package/dist/features/OpenUI5Enablement.js +119 -0
  47. package/dist/features/OpenUI5Support.js +41 -6
  48. package/dist/generated/AssetParameters.js +1 -1
  49. package/dist/generated/VersionInfo.js +10 -0
  50. package/dist/generated/css/BusyIndicator.css.js +5 -0
  51. package/dist/generated/css/FontFace.css.js +5 -0
  52. package/dist/generated/css/OverrideFontFace.css.js +5 -0
  53. package/dist/generated/css/SystemCSSVars.css.js +5 -0
  54. package/dist/i18nBundle.js +38 -4
  55. package/dist/isLegacyBrowser.js +3 -0
  56. package/dist/locale/applyDirection.js +6 -4
  57. package/dist/locale/directionChange.js +32 -0
  58. package/dist/locale/getEffectiveDir.js +28 -0
  59. package/dist/locale/languageChange.js +1 -1
  60. package/dist/renderer/LitRenderer.js +39 -18
  61. package/dist/renderer/directives/style-map.js +72 -0
  62. package/dist/renderer/executeTemplate.js +19 -2
  63. package/dist/resources/bundle.esm.js +15 -112
  64. package/dist/resources/bundle.esm.js.map +1 -1
  65. package/dist/sap/base/Log.js +241 -0
  66. package/dist/sap/base/assert.js +8 -0
  67. package/dist/sap/base/security/URLListValidator.js +148 -0
  68. package/dist/sap/base/security/encodeCSS.js +14 -0
  69. package/dist/sap/base/security/encodeXML.js +23 -0
  70. package/dist/sap/base/security/sanitizeHTML.js +16 -0
  71. package/dist/sap/base/strings/toHex.js +8 -0
  72. package/dist/sap/base/util/now.js +7 -0
  73. package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
  74. package/dist/test-resources/assets/Themes.js +8 -8
  75. package/dist/test-resources/elements/Parent.js +6 -2
  76. package/dist/test-resources/elements/WithStaticArea.js +2 -1
  77. package/dist/test-resources/pages/AllTestElements.html +3 -3
  78. package/dist/test-resources/pages/Configuration.html +0 -2
  79. package/dist/test-resources/pages/ConfigurationScript.html +0 -2
  80. package/dist/test-resources/pages/i18n.html +2 -9
  81. package/dist/test-resources/specs/ConfigurationChange.spec.js +10 -8
  82. package/dist/test-resources/specs/ConfigurationScript.spec.js +25 -23
  83. package/dist/test-resources/specs/ConfigurationURL.spec.js +65 -17
  84. package/dist/test-resources/specs/CustomTheme.spec.js +9 -7
  85. package/dist/test-resources/specs/EventProvider.spec.js +63 -0
  86. package/dist/test-resources/specs/StaticArea.spec.js +56 -12
  87. package/dist/test-resources/specs/Theming.spec.js +23 -10
  88. package/dist/test-resources/specs/UI5ElementInvalidation.js +54 -70
  89. package/dist/test-resources/specs/UI5ElementLifecycle.js +17 -15
  90. package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +25 -51
  91. package/dist/test-resources/specs/UI5ElementMetadataExt.js +9 -7
  92. package/dist/test-resources/specs/UI5ElementPropertyValidation.js +7 -5
  93. package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +37 -35
  94. package/dist/test-resources/specs/UI5ElementShadowDOM.js +10 -8
  95. package/dist/test-resources/specs/UI5ElementSlots.js +10 -8
  96. package/dist/theming/CustomStyle.js +25 -5
  97. package/dist/theming/applyTheme.js +11 -16
  98. package/dist/theming/getConstructableStyle.js +7 -6
  99. package/dist/theming/getEffectiveLinksHrefs.js +27 -0
  100. package/dist/theming/getEffectiveStyle.js +24 -8
  101. package/dist/theming/getStylesString.js +4 -2
  102. package/dist/theming/getThemeDesignerTheme.js +25 -5
  103. package/dist/theming/preloadLinks.js +23 -0
  104. package/dist/types/CSSColor.js +9 -0
  105. package/dist/types/CalendarType.js +1 -1
  106. package/dist/types/DataType.js +13 -1
  107. package/dist/types/Float.js +4 -0
  108. package/dist/types/Integer.js +4 -0
  109. package/dist/types/InvisibleMessageMode.js +30 -0
  110. package/dist/types/ItemNavigationBehavior.js +2 -7
  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 +4 -4
  115. package/dist/util/Caret.js +45 -0
  116. package/dist/util/ColorConversion.js +370 -0
  117. package/dist/util/FocusableElements.js +22 -9
  118. package/dist/util/HTMLSanitizer.js +7 -0
  119. package/dist/util/InvisibleMessage.js +60 -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/escapeRegex.js +10 -0
  128. package/dist/util/generateHighlightedMarkup.js +42 -0
  129. package/dist/util/getActiveElement.js +11 -0
  130. package/dist/util/getClassCopy.js +10 -0
  131. package/dist/util/getEffectiveContentDensity.js +5 -0
  132. package/dist/util/getNormalizedTarget.js +16 -0
  133. package/dist/util/isElementInView.js +15 -0
  134. package/dist/util/isNodeHidden.js +1 -1
  135. package/dist/util/isNodeTabbable.js +4 -4
  136. package/hash.txt +1 -0
  137. package/index.js +1 -1
  138. package/lib/generate-asset-parameters/index.js +8 -5
  139. package/lib/generate-styles/index.js +26 -0
  140. package/lib/generate-version-info/index.js +32 -0
  141. package/package-scripts.js +30 -19
  142. package/package.json +19 -13
  143. package/src/AssetRegistry.js +8 -9
  144. package/src/Boot.js +59 -0
  145. package/src/CSP.js +59 -0
  146. package/src/CustomElementsRegistry.js +60 -4
  147. package/src/CustomElementsScope.js +20 -98
  148. package/src/CustomElementsScopeUtils.js +108 -0
  149. package/src/DOMObserver.js +65 -0
  150. package/src/Device.js +71 -773
  151. package/src/EventProvider.js +30 -26
  152. package/src/FeaturesRegistry.js +4 -1
  153. package/src/FontFace.js +7 -95
  154. package/src/InitialConfiguration.js +37 -21
  155. package/src/Keys.js +98 -0
  156. package/src/ManagedStyles.js +83 -0
  157. package/src/MediaRange.js +109 -0
  158. package/{dist/util/parseProperties.js → src/PropertiesFileFormat.js} +6 -0
  159. package/src/Render.js +175 -0
  160. package/src/RenderScheduler.js +16 -138
  161. package/src/Runtimes.js +107 -0
  162. package/src/StaticArea.js +1 -29
  163. package/src/StaticAreaItem.js +58 -65
  164. package/src/SystemCSSVars.js +4 -25
  165. package/src/UI5Element.js +315 -382
  166. package/src/UI5ElementMetadata.js +132 -17
  167. package/src/asset-registries/Icons.js +117 -14
  168. package/src/asset-registries/Illustrations.js +30 -0
  169. package/src/asset-registries/LocaleData.js +97 -68
  170. package/src/asset-registries/Themes.js +29 -35
  171. package/src/asset-registries/i18n.js +61 -50
  172. package/src/assets-meta/IconCollectionsAlias.js +18 -0
  173. package/src/config/Icons.js +52 -0
  174. package/src/config/Language.js +18 -20
  175. package/src/config/Theme.js +25 -0
  176. package/src/css/BusyIndicator.css +80 -0
  177. package/src/css/FontFace.css +75 -0
  178. package/src/css/OverrideFontFace.css +32 -0
  179. package/src/css/SystemCSSVars.css +17 -0
  180. package/src/delegate/ItemNavigation.js +233 -201
  181. package/src/delegate/ResizeHandler.js +78 -37
  182. package/src/delegate/ScrollEnablement.js +49 -20
  183. package/src/features/F6Navigation.js +106 -0
  184. package/src/features/OpenUI5Enablement.js +119 -0
  185. package/src/features/OpenUI5Support.js +41 -6
  186. package/src/i18nBundle.js +38 -4
  187. package/src/isLegacyBrowser.js +3 -0
  188. package/src/locale/applyDirection.js +6 -4
  189. package/src/locale/directionChange.js +32 -0
  190. package/src/locale/getEffectiveDir.js +28 -0
  191. package/src/locale/languageChange.js +1 -1
  192. package/src/renderer/LitRenderer.js +39 -18
  193. package/src/renderer/directives/style-map.js +72 -0
  194. package/src/renderer/executeTemplate.js +19 -2
  195. package/src/theming/CustomStyle.js +25 -5
  196. package/src/theming/applyTheme.js +11 -16
  197. package/src/theming/getConstructableStyle.js +7 -6
  198. package/src/theming/getEffectiveLinksHrefs.js +27 -0
  199. package/src/theming/getEffectiveStyle.js +24 -8
  200. package/src/theming/getStylesString.js +4 -2
  201. package/src/theming/getThemeDesignerTheme.js +25 -5
  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 +4 -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/PopupState.js +1 -1
  211. package/src/types/ValueState.js +1 -1
  212. package/src/updateShadowRoot.js +30 -0
  213. package/src/util/AriaLabelHelper.js +4 -4
  214. package/src/util/Caret.js +45 -0
  215. package/src/util/ColorConversion.js +370 -0
  216. package/src/util/FocusableElements.js +22 -9
  217. package/src/util/HTMLSanitizer.js +7 -0
  218. package/src/util/InvisibleMessage.js +60 -0
  219. package/src/util/PopupUtils.js +93 -0
  220. package/src/util/SlotsHelper.js +43 -0
  221. package/src/util/TabbableElements.js +5 -1
  222. package/src/util/arraysAreEqual.js +15 -0
  223. package/src/util/clamp.js +12 -0
  224. package/src/util/createLinkInHead.js +19 -0
  225. package/src/util/debounce.js +17 -0
  226. package/src/util/escapeRegex.js +10 -0
  227. package/src/util/generateHighlightedMarkup.js +42 -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/getNormalizedTarget.js +16 -0
  232. package/src/util/isElementInView.js +15 -0
  233. package/src/util/isNodeHidden.js +1 -1
  234. package/src/util/isNodeTabbable.js +4 -4
  235. package/used-modules.txt +10 -0
  236. package/bundle.es5.js +0 -28
  237. package/dist/SVGIconRegistry.js +0 -73
  238. package/dist/boot.js +0 -34
  239. package/dist/compatibility/DOMObserver.js +0 -62
  240. package/dist/compatibility/patchNodeValue.js +0 -24
  241. package/dist/compatibility/whenPolyfillLoaded.js +0 -26
  242. package/dist/config/AssetsPath.js +0 -17
  243. package/dist/delegate/CustomResize.js +0 -78
  244. package/dist/delegate/NativeResize.js +0 -45
  245. package/dist/features/PropertiesFormatSupport.js +0 -8
  246. package/dist/features/browsersupport/Edge.js +0 -6
  247. package/dist/features/browsersupport/IE11.js +0 -42
  248. package/dist/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
  249. package/dist/renderer/ifDefined.js +0 -21
  250. package/dist/renderer/scopeHTML.js +0 -32
  251. package/dist/resources/bundle.es5.js +0 -212
  252. package/dist/resources/bundle.es5.js.map +0 -1
  253. package/dist/theming/CSSVarsPonyfill.js +0 -68
  254. package/dist/theming/adaptCSSForIE.js +0 -95
  255. package/dist/theming/createComponentStyleTag.js +0 -54
  256. package/dist/theming/createThemePropertiesStyleTag.js +0 -20
  257. package/dist/thirdparty/Array.from.js +0 -16
  258. package/dist/thirdparty/Array.prototype.fill.js +0 -44
  259. package/dist/thirdparty/Array.prototype.find.js +0 -46
  260. package/dist/thirdparty/Array.prototype.includes.js +0 -51
  261. package/dist/thirdparty/Element.prototype.closest.js +0 -11
  262. package/dist/thirdparty/Element.prototype.matches.js +0 -6
  263. package/dist/thirdparty/Map.prototype.keys.js +0 -9
  264. package/dist/thirdparty/Number.isInteger.js +0 -5
  265. package/dist/thirdparty/Number.isNaN.js +0 -1
  266. package/dist/thirdparty/Number.parseFloat.js +0 -1
  267. package/dist/thirdparty/Number.parseInt.js +0 -1
  268. package/dist/thirdparty/Object.assign.js +0 -31
  269. package/dist/thirdparty/Object.entries.js +0 -11
  270. package/dist/thirdparty/Symbol.js +0 -2
  271. package/dist/thirdparty/WeakSet.js +0 -27
  272. package/dist/thirdparty/es6-string-methods.js +0 -182
  273. package/dist/thirdparty/events-polyfills.js +0 -89
  274. package/dist/thirdparty/fetch.js +0 -1
  275. package/dist/thirdparty/template.js +0 -600
  276. package/dist/thirdparty/webcomponents-sd-ce-pf.js +0 -318
  277. package/dist/util/EffectiveAssetPath.js +0 -27
  278. package/dist/util/encodeCSS.js +0 -24
  279. package/dist/util/isSlot.js +0 -3
  280. package/dist/webcomponentsjs/LICENSE.md +0 -19
  281. package/dist/webcomponentsjs/README.md +0 -229
  282. package/dist/webcomponentsjs/bundles/webcomponents-ce.js +0 -63
  283. package/dist/webcomponentsjs/bundles/webcomponents-ce.js.map +0 -1
  284. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +0 -297
  285. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +0 -1
  286. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js +0 -208
  287. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +0 -1
  288. package/dist/webcomponentsjs/bundles/webcomponents-sd.js +0 -166
  289. package/dist/webcomponentsjs/bundles/webcomponents-sd.js.map +0 -1
  290. package/dist/webcomponentsjs/custom-elements-es5-adapter.js +0 -15
  291. package/dist/webcomponentsjs/package.json +0 -46
  292. package/dist/webcomponentsjs/src/entrypoints/custom-elements-es5-adapter-index.js +0 -16
  293. package/dist/webcomponentsjs/src/entrypoints/webcomponents-bundle-index.js +0 -53
  294. package/dist/webcomponentsjs/src/entrypoints/webcomponents-ce-index.js +0 -17
  295. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-index.js +0 -19
  296. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-pf-index.js +0 -28
  297. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-index.js +0 -18
  298. package/dist/webcomponentsjs/webcomponents-bundle.js +0 -298
  299. package/dist/webcomponentsjs/webcomponents-bundle.js.map +0 -1
  300. package/dist/webcomponentsjs/webcomponents-loader.js +0 -185
  301. package/src/SVGIconRegistry.js +0 -73
  302. package/src/boot.js +0 -34
  303. package/src/compatibility/DOMObserver.js +0 -62
  304. package/src/compatibility/patchNodeValue.js +0 -24
  305. package/src/compatibility/whenPolyfillLoaded.js +0 -26
  306. package/src/config/AssetsPath.js +0 -17
  307. package/src/delegate/CustomResize.js +0 -78
  308. package/src/delegate/NativeResize.js +0 -45
  309. package/src/features/PropertiesFormatSupport.js +0 -8
  310. package/src/features/browsersupport/Edge.js +0 -6
  311. package/src/features/browsersupport/IE11.js +0 -42
  312. package/src/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
  313. package/src/renderer/ifDefined.js +0 -21
  314. package/src/renderer/scopeHTML.js +0 -32
  315. package/src/theming/CSSVarsPonyfill.js +0 -68
  316. package/src/theming/adaptCSSForIE.js +0 -95
  317. package/src/theming/createComponentStyleTag.js +0 -54
  318. package/src/theming/createThemePropertiesStyleTag.js +0 -20
  319. package/src/thirdparty/Array.from.js +0 -16
  320. package/src/thirdparty/Array.prototype.fill.js +0 -44
  321. package/src/thirdparty/Array.prototype.find.js +0 -46
  322. package/src/thirdparty/Array.prototype.includes.js +0 -51
  323. package/src/thirdparty/Element.prototype.closest.js +0 -11
  324. package/src/thirdparty/Element.prototype.matches.js +0 -6
  325. package/src/thirdparty/Map.prototype.keys.js +0 -9
  326. package/src/thirdparty/Number.isInteger.js +0 -5
  327. package/src/thirdparty/Number.isNaN.js +0 -1
  328. package/src/thirdparty/Number.parseFloat.js +0 -1
  329. package/src/thirdparty/Number.parseInt.js +0 -1
  330. package/src/thirdparty/Object.assign.js +0 -31
  331. package/src/thirdparty/Object.entries.js +0 -11
  332. package/src/thirdparty/Symbol.js +0 -2
  333. package/src/thirdparty/WeakSet.js +0 -27
  334. package/src/thirdparty/es6-string-methods.js +0 -182
  335. package/src/thirdparty/events-polyfills.js +0 -89
  336. package/src/thirdparty/fetch.js +0 -1
  337. package/src/thirdparty/template.js +0 -600
  338. package/src/thirdparty/webcomponents-sd-ce-pf.js +0 -318
  339. package/src/util/EffectiveAssetPath.js +0 -27
  340. package/src/util/encodeCSS.js +0 -24
  341. 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,106 @@
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
+ if (isF6Next(event)) {
19
+ this.updateGroups();
20
+ if (this.groups.length < 1) {
21
+ return;
22
+ }
23
+
24
+ const nextIndex = this.groups.indexOf(this.selectedGroup);
25
+ let nextElement = null;
26
+
27
+ if (nextIndex > -1) {
28
+ if (nextIndex + 1 >= this.groups.length) {
29
+ nextElement = this.groups[0];
30
+ } else {
31
+ nextElement = this.groups[nextIndex + 1];
32
+ }
33
+ } else {
34
+ nextElement = this.groups[0];
35
+ }
36
+
37
+ const elementToFocus = await getFirstFocusableElement(nextElement.isUI5Element ? nextElement.getDomRef() : nextElement, true);
38
+ elementToFocus.focus();
39
+ }
40
+
41
+ if (isF6Previous(event)) {
42
+ this.updateGroups();
43
+ if (this.groups.length < 1) {
44
+ return;
45
+ }
46
+
47
+ const nextIndex = this.groups.indexOf(this.selectedGroup);
48
+ let nextElement = null;
49
+
50
+ if (nextIndex > -1) {
51
+ if (nextIndex - 1 < 0) {
52
+ nextElement = this.groups[this.groups.length - 1];
53
+ } else {
54
+ // Handle the situation where the first focusable element of two neighbor groups is the same
55
+ // For example:
56
+ // <ui5-flexible-column-layout>
57
+ // <ui5-list>
58
+ // <ui5-li>List Item</ui5-li>
59
+ // </ui5-list>
60
+ // </ui5-flexible-column-layout>
61
+ // Here for both FCL & List the firstFoccusableElement is the same (the ui5-li)
62
+
63
+ const firstFocusable = await getFirstFocusableElement(this.groups[nextIndex - 1], true);
64
+ const shouldSkipParent = firstFocusable === await getFirstFocusableElement(this.groups[nextIndex], true);
65
+
66
+ nextElement = this.groups[shouldSkipParent ? nextIndex - 2 : nextIndex - 1];
67
+ }
68
+ } else {
69
+ nextElement = this.groups[this.groups.length - 1];
70
+ }
71
+
72
+ const elementToFocus = await getFirstFocusableElement(nextElement.isUI5Element ? nextElement.getDomRef() : nextElement, true);
73
+ elementToFocus.focus();
74
+ }
75
+ }
76
+
77
+ removeEventListeners() {
78
+ document.removeEventListener("keydown", this.keydownHandler);
79
+ }
80
+
81
+ updateGroups() {
82
+ this.setSelectedGroup(document.activeElement);
83
+ this.setGroups();
84
+ }
85
+
86
+ setGroups() {
87
+ this.groups = Array.from(document.querySelectorAll("[data-sap-ui-fastnavgroup='true']")).filter(group => group.clientWidth && window.getComputedStyle(group).visibility !== "hidden");
88
+ }
89
+
90
+ setSelectedGroup(element) {
91
+ while (element && element.getAttribute("data-sap-ui-fastnavgroup") !== "true" && element !== document.querySelector("html")) {
92
+ element = element.parentElement ? element.parentNode : element.parentNode.host;
93
+ }
94
+
95
+ this.selectedGroup = element;
96
+ }
97
+
98
+ destroy() {
99
+ this.removeEventListeners();
100
+ }
101
+ }
102
+
103
+ const F6HelperInstance = new F6Navigation();
104
+ registerFeature("F6Navigation", F6HelperInstance);
105
+
106
+ export default F6Navigation;
@@ -0,0 +1,119 @@
1
+ import { registerFeature } from "../FeaturesRegistry.js";
2
+ import BusyIndicatorStyles from "../generated/css/BusyIndicator.css.js";
3
+ import merge from "../thirdparty/merge.js";
4
+ import {
5
+ isTabPrevious,
6
+ } from "../Keys.js";
7
+
8
+ const busyIndicatorMetadata = {
9
+ properties: {
10
+ __isBusy: {
11
+ type: Boolean,
12
+ },
13
+ },
14
+ };
15
+
16
+ const getBusyIndicatorStyles = () => {
17
+ return BusyIndicatorStyles;
18
+ };
19
+
20
+ const wrapTemplateResultInBusyMarkup = (html, host, templateResult) => {
21
+ if (host.isOpenUI5Component && host.__isBusy) {
22
+ templateResult = html`
23
+ <div class="busy-indicator-wrapper">
24
+ <span tabindex="0" busy-indicator-before-span @focusin=${host.__suppressFocusIn}></span>
25
+ ${templateResult}
26
+ <div class="busy-indicator-overlay"></div>
27
+ <div busy-indicator
28
+ class="busy-indicator-busy-area"
29
+ tabindex="0"
30
+ role="progressbar"
31
+ @keydown=${host.__suppressFocusBack}
32
+ aria-valuemin="0"
33
+ aria-valuemax="100"
34
+ aria-valuetext="Busy">
35
+ <div>
36
+ <div class="busy-indicator-circle circle-animation-0"></div>
37
+ <div class="busy-indicator-circle circle-animation-1"></div>
38
+ <div class="busy-indicator-circle circle-animation-2"></div>
39
+ </div>
40
+ </div>
41
+ </div>`;
42
+ }
43
+
44
+ return templateResult;
45
+ };
46
+
47
+ const enrichBusyIndicatorMetadata = UI5Element => {
48
+ UI5Element.metadata = merge(UI5Element.metadata, busyIndicatorMetadata);
49
+ };
50
+
51
+ const enrichBusyIndicatorMethods = UI5ElementPrototype => {
52
+ Object.defineProperties(UI5ElementPrototype, {
53
+ "__redirectFocus": { value: true, writable: true },
54
+ "__suppressFocusBack": {
55
+ get() {
56
+ const that = this;
57
+
58
+ return {
59
+ handleEvent: e => {
60
+ if (isTabPrevious(e)) {
61
+ const beforeElem = that.shadowRoot.querySelector("[busy-indicator-before-span]");
62
+ that.__redirectFocus = false;
63
+ beforeElem.focus();
64
+ that.__redirectFocus = true;
65
+ }
66
+ },
67
+ capture: true,
68
+ passive: false,
69
+ };
70
+ },
71
+ },
72
+ "isOpenUI5Component": { get: () => { return true; } },
73
+ });
74
+
75
+ UI5ElementPrototype.__suppressFocusIn = function handleFocusIn() {
76
+ const busyIndicator = this.shadowRoot.querySelector("[busy-indicator]");
77
+ if (busyIndicator && this.__redirectFocus) {
78
+ busyIndicator.focus();
79
+ }
80
+ };
81
+
82
+ UI5ElementPrototype.getDomRef = function getDomRef() {
83
+ // If a component set _getRealDomRef to its children, use the return value of this function
84
+ if (typeof this._getRealDomRef === "function") {
85
+ return this._getRealDomRef();
86
+ }
87
+
88
+ if (!this.shadowRoot || this.shadowRoot.children.length === 0) {
89
+ return;
90
+ }
91
+
92
+ const children = [...this.shadowRoot.children].filter(child => !["link", "style"].includes(child.localName));
93
+
94
+ if (children.length !== 1) {
95
+ console.warn(`The shadow DOM for ${this.constructor.getMetadata().getTag()} does not have a top level element, the getDomRef() method might not work as expected`); // eslint-disable-line
96
+ }
97
+
98
+ if (this.__isBusy) {
99
+ return children[0].querySelector(".busy-indicator-wrapper > :not([busy-indicator-before-span]):not(.busy-indicator-overlay):not(.busy-indicator-busy-area)");
100
+ }
101
+
102
+ return children[0];
103
+ };
104
+ };
105
+
106
+ const enrichBusyIndicatorSettings = UI5Element => {
107
+ enrichBusyIndicatorMetadata(UI5Element);
108
+ enrichBusyIndicatorMethods(UI5Element.prototype);
109
+ };
110
+
111
+ const OpenUI5Enablement = {
112
+ enrichBusyIndicatorSettings,
113
+ wrapTemplateResultInBusyMarkup,
114
+ getBusyIndicatorStyles,
115
+ };
116
+
117
+ export default OpenUI5Enablement;
118
+
119
+ registerFeature("OpenUI5Enablement", OpenUI5Enablement);
@@ -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);
@@ -1,4 +1,4 @@
1
- const assetParameters = {"themes":{"default":"sap_fiori_3","all":["sap_fiori_3","sap_fiori_3_dark","sap_belize","sap_belize_hcb","sap_belize_hcw","sap_fiori_3_hcb","sap_fiori_3_hcw"]},"languages":{"default":"en","all":["ar","bg","ca","cs","da","de","el","en","es","et","fi","fr","hi","hr","hu","it","iw","ja","kk","ko","lt","lv","ms","nl","no","pl","pt","ro","ru","sh","sk","sl","sv","th","tr","uk","vi","zh_CN","zh_TW"]},"locales":{"default":"en","all":["ar","ar_EG","ar_SA","bg","ca","cs","da","de","de_AT","de_CH","el","el_CY","en","en_AU","en_GB","en_HK","en_IE","en_IN","en_NZ","en_PG","en_SG","en_ZA","es","es_AR","es_BO","es_CL","es_CO","es_MX","es_PE","es_UY","es_VE","et","fa","fi","fr","fr_BE","fr_CA","fr_CH","fr_LU","he","hi","hr","hu","id","it","it_CH","ja","kk","ko","lt","lv","ms","nb","nl","nl_BE","pl","pt","pt_PT","ro","ru","ru_UA","sk","sl","sr","sv","th","tr","uk","vi","zh_CN","zh_HK","zh_SG","zh_TW"]}};
1
+ const assetParameters = {"themes":{"default":"sap_fiori_3","all":["sap_fiori_3","sap_fiori_3_dark","sap_belize","sap_belize_hcb","sap_belize_hcw","sap_fiori_3_hcb","sap_fiori_3_hcw","sap_horizon","sap_horizon_dark","sap_horizon_hcb","sap_horizon_hcw","sap_horizon_exp"]},"languages":{"default":"en","all":["ar","bg","ca","cs","cy","da","de","el","en","en_GB","en_US_sappsd","en_US_saprigi","en_US_saptrc","es","es_MX","et","fi","fr","fr_CA","hi","hr","hu","in","it","iw","ja","kk","ko","lt","lv","ms","nl","no","pl","pt_PT","pt","ro","ru","sh","sk","sl","sv","th","tr","uk","vi","zh_CN","zh_TW"]},"locales":{"default":"en","all":["ar","ar_EG","ar_SA","bg","ca","cs","da","de","de_AT","de_CH","el","el_CY","en","en_AU","en_GB","en_HK","en_IE","en_IN","en_NZ","en_PG","en_SG","en_ZA","es","es_AR","es_BO","es_CL","es_CO","es_MX","es_PE","es_UY","es_VE","et","fa","fi","fr","fr_BE","fr_CA","fr_CH","fr_LU","he","hi","hr","hu","id","it","it_CH","ja","kk","ko","lt","lv","ms","nb","nl","nl_BE","pl","pt","pt_PT","ro","ru","ru_UA","sk","sl","sr","sr_Latn","sv","th","tr","uk","vi","zh_CN","zh_HK","zh_SG","zh_TW"]}};
2
2
 
3
3
  const DEFAULT_THEME = assetParameters.themes.default;
4
4
  const DEFAULT_LANGUAGE = assetParameters.languages.default;
@@ -0,0 +1,10 @@
1
+ const VersionInfo = {
2
+ version: "0.0.0-ec448881d",
3
+ major: 0,
4
+ minor: 0,
5
+ patch: 0,
6
+ suffix: "-ec448881d",
7
+ isNext: true,
8
+ buildTime: 1653490220,
9
+ };
10
+ export default VersionInfo;
@@ -0,0 +1,5 @@
1
+ export default {
2
+ packageName: "@ui5/webcomponents-base",
3
+ fileName: "BusyIndicator.css",
4
+ content: `.busy-indicator-wrapper{position:relative;height:100%;width:100%}.busy-indicator-overlay{display:var(--ui5_web_components_busy_indicator_display);position:absolute;inset:0;background:var(--ui5_web_components_busy_indicator_background-color);z-index:99}.busy-indicator-busy-area{display:var(--ui5_web_components_busy_indicator_display);position:absolute;z-index:99;inset:0;justify-content:center;align-items:center;background-color:inherit;flex-direction:column;color:var(--_ui5_busy_indicator_color)}:host([__is-busy]) .busy-indicator-wrapper>:not(.busy-indicator-busy-area):not(.busy-indicator-overlay):not([busy-indicator-before-span]){--ui5_web_components_busy_indicator_display:none}.busy-indicator-busy-area:focus{outline:var(--_ui5_busy_indicator_focus_outline);outline-offset:-.125rem}.busy-indicator-circle{width:1rem;height:1rem;display:inline-block;background-color:currentColor;border-radius:50%}.circle-animation-0{animation:grow 1.6s infinite cubic-bezier(.32,.06,.85,1.11)}.circle-animation-1{animation:grow 1.6s infinite cubic-bezier(.32,.06,.85,1.11);animation-delay:.2s}.circle-animation-2{animation:grow 1.6s infinite cubic-bezier(.32,.06,.85,1.11);animation-delay:.4s}.sapUiLocalBusy{--ui5_web_components_busy_indicator_display:none}.busy-indicator-wrapper [ui5-busy-indicator]{display:none}@keyframes grow{0%,100%,50%{-webkit-transform:scale(.5);-moz-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}25%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}`
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ packageName: "@ui5/webcomponents-base",
3
+ fileName: "FontFace.css",
4
+ content: `@font-face{font-family:"72";font-style:normal;font-weight:400;src:local("72"),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular.woff2?ui5-webcomponents) format("woff2"),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular.woff?ui5-webcomponents) format("woff")}@font-face{font-family:"72full";font-style:normal;font-weight:400;src:local('72-full'),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular-full.woff2?ui5-webcomponents) format("woff2"),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular-full.woff?ui5-webcomponents) format("woff")}@font-face{font-family:"72";font-style:normal;font-weight:700;src:local('72-Bold'),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold.woff2?ui5-webcomponents) format("woff2"),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold.woff?ui5-webcomponents) format("woff")}@font-face{font-family:"72full";font-style:normal;font-weight:700;src:local('72-Bold-full'),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold-full.woff2?ui5-webcomponents) format("woff2"),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold-full.woff?ui5-webcomponents) format("woff")}@font-face{font-family:'72-Bold';font-style:normal;src:local('72-Bold'),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold.woff2?ui5-webcomponents) format("woff2"),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold.woff?ui5-webcomponents) format("woff")}@font-face{font-family:'72-Boldfull';font-style:normal;src:url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold-full.woff2?ui5-webcomponents) format("woff2"),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold-full.woff?ui5-webcomponents) format("woff")}@font-face{font-family:'72-Light';font-style:normal;src:local('72-Light'),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Light.woff2?ui5-webcomponents) format("woff2"),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Light.woff?ui5-webcomponents) format("woff")}@font-face{font-family:'72-Lightfull';font-style:normal;src:url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Light-full.woff2?ui5-webcomponents) format("woff2"),url(https://ui5.sap.com/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Light-full.woff?ui5-webcomponents) format("woff")}@font-face{font-family:"72Black";font-style:bold;font-weight:900;src:local('72Black'),url(https://openui5nightly.hana.ondemand.com/resources/sap/ui/core/themes/sap_horizon/fonts/72-Black.woff2?ui5-webcomponents) format("woff2"),url(https://openui5nightly.hana.ondemand.com/resources/sap/ui/core/themes/sap_horizon/fonts/72-Black.woff?ui5-webcomponents) format("woff")}`
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ packageName: "@ui5/webcomponents-base",
3
+ fileName: "OverrideFontFace.css",
4
+ content: `@font-face{font-family:'72override';unicode-range:U+0102-0103,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EB7,U+1EB8-1EC7,U+1EC8-1ECB,U+1ECC-1EE3,U+1EE4-1EF1,U+1EF4-1EF7;src:local('Arial'),local('Helvetica'),local('sans-serif')}`
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ packageName: "@ui5/webcomponents-base",
3
+ fileName: "SystemCSSVars.css",
4
+ content: `:root{--_ui5_content_density:cozy}.sapUiSizeCompact,.ui5-content-density-compact,[data-ui5-compact-size]{--_ui5_content_density:compact}[dir=rtl]{--_ui5_dir:rtl}[dir=ltr]{--_ui5_dir:ltr}`
5
+ };
@@ -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;