@ui5/webcomponents-base 0.0.0-c6d8872f3 → 0.0.0-cf069fb29

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 (351) hide show
  1. package/.eslintignore +5 -0
  2. package/CHANGELOG.md +293 -0
  3. package/README.md +26 -2
  4. package/bundle.esm.js +17 -7
  5. package/dist/AssetRegistry.js +8 -6
  6. package/dist/Boot.js +61 -0
  7. package/dist/CSP.js +59 -0
  8. package/dist/CustomElementsRegistry.js +95 -0
  9. package/dist/CustomElementsScope.js +108 -0
  10. package/dist/DOMObserver.js +65 -0
  11. package/dist/Device.js +69 -776
  12. package/dist/EventProvider.js +38 -26
  13. package/dist/FeaturesRegistry.js +4 -1
  14. package/dist/FontFace.js +19 -62
  15. package/dist/InitialConfiguration.js +45 -9
  16. package/dist/Keys.js +112 -2
  17. package/dist/ManagedStyles.js +83 -0
  18. package/dist/MediaRange.js +109 -0
  19. package/dist/PropertiesFileFormat.js +95 -0
  20. package/dist/Render.js +175 -0
  21. package/dist/RenderQueue.js +41 -17
  22. package/dist/RenderScheduler.js +24 -145
  23. package/dist/Runtimes.js +107 -0
  24. package/dist/StaticArea.js +1 -39
  25. package/dist/StaticAreaItem.js +61 -50
  26. package/dist/SystemCSSVars.js +10 -0
  27. package/dist/Theming.js +2 -5
  28. package/dist/UI5Element.js +448 -297
  29. package/dist/UI5ElementMetadata.js +173 -19
  30. package/dist/asset-registries/Icons.js +129 -14
  31. package/dist/asset-registries/Illustrations.js +30 -0
  32. package/dist/asset-registries/LocaleData.js +100 -68
  33. package/dist/asset-registries/Themes.js +35 -32
  34. package/dist/asset-registries/i18n.js +76 -29
  35. package/dist/assets-meta/IconCollectionsAlias.js +18 -0
  36. package/dist/config/AnimationMode.js +11 -1
  37. package/dist/config/Language.js +58 -2
  38. package/dist/config/Theme.js +14 -0
  39. package/dist/css/FontFace.css +45 -0
  40. package/dist/css/OverrideFontFace.css +32 -0
  41. package/dist/css/SystemCSSVars.css +17 -0
  42. package/dist/delegate/ItemNavigation.js +244 -171
  43. package/dist/delegate/ResizeHandler.js +78 -38
  44. package/dist/delegate/ScrollEnablement.js +101 -19
  45. package/dist/features/F6Navigation.js +106 -0
  46. package/dist/features/OpenUI5Support.js +56 -7
  47. package/dist/generated/AssetParameters.js +13 -0
  48. package/dist/generated/VersionInfo.js +10 -0
  49. package/dist/generated/css/FontFace.css.js +5 -0
  50. package/dist/generated/css/OverrideFontFace.css.js +5 -0
  51. package/dist/generated/css/SystemCSSVars.css.js +5 -0
  52. package/dist/getSharedResource.js +30 -0
  53. package/dist/i18nBundle.js +59 -8
  54. package/dist/isLegacyBrowser.js +3 -0
  55. package/dist/locale/RTLAwareRegistry.js +14 -0
  56. package/dist/locale/applyDirection.js +17 -0
  57. package/dist/locale/directionChange.js +32 -0
  58. package/dist/locale/getEffectiveDir.js +28 -0
  59. package/dist/locale/getLocale.js +12 -2
  60. package/dist/locale/languageChange.js +22 -0
  61. package/dist/locale/nextFallbackLocale.js +6 -4
  62. package/dist/locale/normalizeLocale.js +7 -1
  63. package/dist/renderer/LitRenderer.js +26 -7
  64. package/dist/renderer/directives/style-map.js +72 -0
  65. package/dist/renderer/executeTemplate.js +17 -0
  66. package/dist/resources/bundle.esm.js +20 -106
  67. package/dist/resources/bundle.esm.js.map +1 -1
  68. package/dist/sap/base/Log.js +241 -0
  69. package/dist/sap/base/assert.js +8 -0
  70. package/dist/sap/base/security/URLListValidator.js +148 -0
  71. package/dist/sap/base/security/encodeCSS.js +14 -0
  72. package/dist/sap/base/security/encodeXML.js +23 -0
  73. package/dist/sap/base/security/sanitizeHTML.js +16 -0
  74. package/dist/sap/base/strings/toHex.js +8 -0
  75. package/dist/sap/base/util/now.js +7 -0
  76. package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
  77. package/dist/test-resources/assets/Themes.js +10 -6
  78. package/dist/test-resources/elements/Parent.js +6 -2
  79. package/dist/test-resources/elements/WithStaticArea.js +77 -0
  80. package/dist/test-resources/pages/AllTestElements.html +5 -3
  81. package/dist/test-resources/pages/Configuration.html +0 -2
  82. package/dist/test-resources/pages/ConfigurationScript.html +1 -3
  83. package/dist/test-resources/pages/assets/messagebundle_de.properties +1 -0
  84. package/dist/test-resources/pages/assets/messagebundle_en.properties +1 -0
  85. package/dist/test-resources/pages/assets/messagebundle_es.properties +1 -0
  86. package/dist/test-resources/pages/assets/messagebundle_fr.properties +1 -0
  87. package/dist/test-resources/pages/i18n.html +33 -0
  88. package/dist/test-resources/specs/ConfigurationChange.spec.js +11 -9
  89. package/dist/test-resources/specs/ConfigurationScript.spec.js +25 -23
  90. package/dist/test-resources/specs/ConfigurationURL.spec.js +65 -17
  91. package/dist/test-resources/specs/CustomTheme.spec.js +9 -7
  92. package/dist/test-resources/specs/EventProvider.spec.js +63 -0
  93. package/dist/test-resources/specs/StaticArea.spec.js +78 -0
  94. package/dist/test-resources/specs/Theming.spec.js +12 -10
  95. package/dist/test-resources/specs/UI5ElementInvalidation.js +54 -70
  96. package/dist/test-resources/specs/UI5ElementLifecycle.js +19 -14
  97. package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +25 -51
  98. package/dist/test-resources/specs/UI5ElementMetadataExt.js +9 -7
  99. package/dist/test-resources/specs/UI5ElementPropertyValidation.js +7 -5
  100. package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +37 -35
  101. package/dist/test-resources/specs/UI5ElementShadowDOM.js +10 -8
  102. package/dist/test-resources/specs/UI5ElementSlots.js +10 -8
  103. package/dist/theming/CustomStyle.js +47 -6
  104. package/dist/theming/ThemeLoaded.js +22 -0
  105. package/dist/theming/applyTheme.js +69 -9
  106. package/dist/theming/getConstructableStyle.js +15 -10
  107. package/dist/theming/getEffectiveLinksHrefs.js +20 -0
  108. package/dist/theming/getEffectiveStyle.js +23 -8
  109. package/dist/theming/getStylesString.js +15 -0
  110. package/dist/theming/getThemeDesignerTheme.js +87 -0
  111. package/dist/theming/preloadLinks.js +23 -0
  112. package/dist/types/CSSColor.js +9 -0
  113. package/dist/types/CalendarType.js +1 -1
  114. package/dist/types/DataType.js +13 -1
  115. package/dist/types/Float.js +14 -0
  116. package/dist/types/Integer.js +4 -0
  117. package/dist/types/InvisibleMessageMode.js +30 -0
  118. package/dist/types/ItemNavigationBehavior.js +2 -7
  119. package/dist/types/NavigationMode.js +1 -0
  120. package/dist/types/PopupState.js +1 -1
  121. package/dist/types/ValueState.js +1 -1
  122. package/dist/updateShadowRoot.js +30 -0
  123. package/dist/util/AriaLabelHelper.js +41 -0
  124. package/dist/util/Caret.js +45 -0
  125. package/dist/util/ColorConversion.js +370 -0
  126. package/dist/util/FocusableElements.js +30 -11
  127. package/dist/util/HTMLSanitizer.js +7 -0
  128. package/dist/util/InvisibleMessage.js +58 -0
  129. package/dist/util/PopupUtils.js +93 -0
  130. package/dist/util/SlotsHelper.js +43 -0
  131. package/dist/util/TabbableElements.js +5 -1
  132. package/dist/util/arraysAreEqual.js +15 -0
  133. package/dist/util/clamp.js +12 -0
  134. package/dist/util/createLinkInHead.js +19 -0
  135. package/dist/util/debounce.js +17 -0
  136. package/dist/util/detectNavigatorLanguage.js +3 -1
  137. package/dist/util/escapeRegex.js +10 -0
  138. package/dist/util/findNodeOwner.js +35 -0
  139. package/dist/util/generateHighlightedMarkup.js +42 -0
  140. package/dist/util/getActiveElement.js +11 -0
  141. package/dist/util/getClassCopy.js +10 -0
  142. package/dist/util/getEffectiveContentDensity.js +5 -0
  143. package/dist/util/getFileExtension.js +21 -0
  144. package/dist/util/getSingletonElementInstance.js +13 -0
  145. package/dist/util/isElementInView.js +15 -0
  146. package/dist/util/isNodeHidden.js +1 -5
  147. package/dist/util/isNodeTabbable.js +4 -4
  148. package/dist/util/isValidPropertyName.js +11 -2
  149. package/dist/util/setToArray.js +10 -0
  150. package/hash.txt +1 -0
  151. package/index.js +1 -1
  152. package/lib/generate-asset-parameters/index.js +21 -0
  153. package/lib/generate-styles/index.js +18 -0
  154. package/lib/generate-version-info/index.js +27 -0
  155. package/package-scripts.js +43 -17
  156. package/package.json +19 -12
  157. package/src/AssetRegistry.js +8 -6
  158. package/src/Boot.js +61 -0
  159. package/src/CSP.js +59 -0
  160. package/src/CustomElementsRegistry.js +95 -0
  161. package/src/CustomElementsScope.js +108 -0
  162. package/src/DOMObserver.js +65 -0
  163. package/src/Device.js +69 -776
  164. package/src/EventProvider.js +38 -26
  165. package/src/FeaturesRegistry.js +4 -1
  166. package/src/FontFace.js +19 -62
  167. package/src/InitialConfiguration.js +45 -9
  168. package/src/Keys.js +112 -2
  169. package/src/ManagedStyles.js +83 -0
  170. package/src/MediaRange.js +109 -0
  171. package/src/PropertiesFileFormat.js +95 -0
  172. package/src/Render.js +175 -0
  173. package/src/RenderQueue.js +41 -17
  174. package/src/RenderScheduler.js +24 -145
  175. package/src/Runtimes.js +107 -0
  176. package/src/StaticArea.js +1 -39
  177. package/src/StaticAreaItem.js +61 -50
  178. package/src/SystemCSSVars.js +10 -0
  179. package/src/Theming.js +2 -5
  180. package/src/UI5Element.js +448 -297
  181. package/src/UI5ElementMetadata.js +173 -19
  182. package/src/asset-registries/Icons.js +129 -14
  183. package/src/asset-registries/Illustrations.js +30 -0
  184. package/src/asset-registries/LocaleData.js +100 -68
  185. package/src/asset-registries/Themes.js +35 -32
  186. package/src/asset-registries/i18n.js +76 -29
  187. package/src/assets-meta/IconCollectionsAlias.js +18 -0
  188. package/src/config/AnimationMode.js +11 -1
  189. package/src/config/Language.js +58 -2
  190. package/src/config/Theme.js +14 -0
  191. package/src/css/FontFace.css +45 -0
  192. package/src/css/OverrideFontFace.css +32 -0
  193. package/src/css/SystemCSSVars.css +17 -0
  194. package/src/delegate/ItemNavigation.js +244 -171
  195. package/src/delegate/ResizeHandler.js +78 -38
  196. package/src/delegate/ScrollEnablement.js +101 -19
  197. package/src/features/F6Navigation.js +106 -0
  198. package/src/features/OpenUI5Support.js +56 -7
  199. package/src/getSharedResource.js +30 -0
  200. package/src/i18nBundle.js +59 -8
  201. package/src/isLegacyBrowser.js +3 -0
  202. package/src/locale/RTLAwareRegistry.js +14 -0
  203. package/src/locale/applyDirection.js +17 -0
  204. package/src/locale/directionChange.js +32 -0
  205. package/src/locale/getEffectiveDir.js +28 -0
  206. package/src/locale/getLocale.js +12 -2
  207. package/src/locale/languageChange.js +22 -0
  208. package/src/locale/nextFallbackLocale.js +6 -4
  209. package/src/locale/normalizeLocale.js +7 -1
  210. package/src/renderer/LitRenderer.js +26 -7
  211. package/src/renderer/directives/style-map.js +72 -0
  212. package/src/renderer/executeTemplate.js +17 -0
  213. package/src/theming/CustomStyle.js +47 -6
  214. package/src/theming/ThemeLoaded.js +22 -0
  215. package/src/theming/applyTheme.js +69 -9
  216. package/src/theming/getConstructableStyle.js +15 -10
  217. package/src/theming/getEffectiveLinksHrefs.js +20 -0
  218. package/src/theming/getEffectiveStyle.js +23 -8
  219. package/src/theming/getStylesString.js +15 -0
  220. package/src/theming/getThemeDesignerTheme.js +87 -0
  221. package/src/theming/preloadLinks.js +23 -0
  222. package/src/types/CSSColor.js +9 -0
  223. package/src/types/CalendarType.js +1 -1
  224. package/src/types/DataType.js +13 -1
  225. package/src/types/Float.js +14 -0
  226. package/src/types/Integer.js +4 -0
  227. package/src/types/InvisibleMessageMode.js +30 -0
  228. package/src/types/ItemNavigationBehavior.js +2 -7
  229. package/src/types/NavigationMode.js +1 -0
  230. package/src/types/PopupState.js +1 -1
  231. package/src/types/ValueState.js +1 -1
  232. package/src/updateShadowRoot.js +30 -0
  233. package/src/util/AriaLabelHelper.js +41 -0
  234. package/src/util/Caret.js +45 -0
  235. package/src/util/ColorConversion.js +370 -0
  236. package/src/util/FocusableElements.js +30 -11
  237. package/src/util/HTMLSanitizer.js +7 -0
  238. package/src/util/InvisibleMessage.js +58 -0
  239. package/src/util/PopupUtils.js +93 -0
  240. package/src/util/SlotsHelper.js +43 -0
  241. package/src/util/TabbableElements.js +5 -1
  242. package/src/util/arraysAreEqual.js +15 -0
  243. package/src/util/clamp.js +12 -0
  244. package/src/util/createLinkInHead.js +19 -0
  245. package/src/util/debounce.js +17 -0
  246. package/src/util/detectNavigatorLanguage.js +3 -1
  247. package/src/util/escapeRegex.js +10 -0
  248. package/src/util/findNodeOwner.js +35 -0
  249. package/src/util/generateHighlightedMarkup.js +42 -0
  250. package/src/util/getActiveElement.js +11 -0
  251. package/src/util/getClassCopy.js +10 -0
  252. package/src/util/getEffectiveContentDensity.js +5 -0
  253. package/src/util/getFileExtension.js +21 -0
  254. package/src/util/getSingletonElementInstance.js +13 -0
  255. package/src/util/isElementInView.js +15 -0
  256. package/src/util/isNodeHidden.js +1 -5
  257. package/src/util/isNodeTabbable.js +4 -4
  258. package/src/util/isValidPropertyName.js +11 -2
  259. package/src/util/setToArray.js +10 -0
  260. package/used-modules.txt +10 -0
  261. package/bundle.es5.js +0 -28
  262. package/dist/SVGIconRegistry.js +0 -60
  263. package/dist/boot.js +0 -32
  264. package/dist/compatibility/DOMObserver.js +0 -62
  265. package/dist/compatibility/patchNodeValue.js +0 -24
  266. package/dist/compatibility/whenPolyfillLoaded.js +0 -26
  267. package/dist/delegate/CustomResize.js +0 -78
  268. package/dist/delegate/NativeResize.js +0 -44
  269. package/dist/features/browsersupport/Edge.js +0 -6
  270. package/dist/features/browsersupport/IE11.js +0 -41
  271. package/dist/renderer/ifDefined.js +0 -21
  272. package/dist/resources/bundle.es5.js +0 -212
  273. package/dist/resources/bundle.es5.js.map +0 -1
  274. package/dist/test-resources/dev-helpers/ExternalThemePresent.js +0 -3
  275. package/dist/theming/CSSVarsPonyfill.js +0 -25
  276. package/dist/theming/ExternalThemePresent.js +0 -12
  277. package/dist/theming/adaptCSSForIE.js +0 -90
  278. package/dist/theming/createComponentStyleTag.js +0 -32
  279. package/dist/theming/createThemePropertiesStyleTag.js +0 -27
  280. package/dist/thirdparty/Array.from.js +0 -16
  281. package/dist/thirdparty/Array.prototype.fill.js +0 -44
  282. package/dist/thirdparty/Array.prototype.find.js +0 -46
  283. package/dist/thirdparty/Array.prototype.includes.js +0 -51
  284. package/dist/thirdparty/Element.prototype.closest.js +0 -11
  285. package/dist/thirdparty/Element.prototype.matches.js +0 -6
  286. package/dist/thirdparty/Map.prototype.keys.js +0 -9
  287. package/dist/thirdparty/Number.isInteger.js +0 -5
  288. package/dist/thirdparty/Number.isNaN.js +0 -1
  289. package/dist/thirdparty/Number.parseInt.js +0 -1
  290. package/dist/thirdparty/Object.assign.js +0 -31
  291. package/dist/thirdparty/Object.entries.js +0 -11
  292. package/dist/thirdparty/Symbol.js +0 -2
  293. package/dist/thirdparty/WeakSet.js +0 -27
  294. package/dist/thirdparty/es6-string-methods.js +0 -182
  295. package/dist/thirdparty/events-polyfills.js +0 -89
  296. package/dist/thirdparty/fetch.js +0 -1
  297. package/dist/thirdparty/template.js +0 -600
  298. package/dist/webcomponentsjs/LICENSE.md +0 -19
  299. package/dist/webcomponentsjs/README.md +0 -229
  300. package/dist/webcomponentsjs/bundles/webcomponents-ce.js +0 -63
  301. package/dist/webcomponentsjs/bundles/webcomponents-ce.js.map +0 -1
  302. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +0 -297
  303. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +0 -1
  304. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js +0 -208
  305. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +0 -1
  306. package/dist/webcomponentsjs/bundles/webcomponents-sd.js +0 -166
  307. package/dist/webcomponentsjs/bundles/webcomponents-sd.js.map +0 -1
  308. package/dist/webcomponentsjs/custom-elements-es5-adapter.js +0 -15
  309. package/dist/webcomponentsjs/package.json +0 -46
  310. package/dist/webcomponentsjs/src/entrypoints/custom-elements-es5-adapter-index.js +0 -16
  311. package/dist/webcomponentsjs/src/entrypoints/webcomponents-bundle-index.js +0 -53
  312. package/dist/webcomponentsjs/src/entrypoints/webcomponents-ce-index.js +0 -17
  313. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-index.js +0 -19
  314. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-pf-index.js +0 -28
  315. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-index.js +0 -18
  316. package/dist/webcomponentsjs/webcomponents-bundle.js +0 -298
  317. package/dist/webcomponentsjs/webcomponents-bundle.js.map +0 -1
  318. package/dist/webcomponentsjs/webcomponents-loader.js +0 -185
  319. package/src/SVGIconRegistry.js +0 -60
  320. package/src/boot.js +0 -32
  321. package/src/compatibility/DOMObserver.js +0 -62
  322. package/src/compatibility/patchNodeValue.js +0 -24
  323. package/src/compatibility/whenPolyfillLoaded.js +0 -26
  324. package/src/delegate/CustomResize.js +0 -78
  325. package/src/delegate/NativeResize.js +0 -44
  326. package/src/features/browsersupport/Edge.js +0 -6
  327. package/src/features/browsersupport/IE11.js +0 -41
  328. package/src/renderer/ifDefined.js +0 -21
  329. package/src/theming/CSSVarsPonyfill.js +0 -25
  330. package/src/theming/ExternalThemePresent.js +0 -12
  331. package/src/theming/adaptCSSForIE.js +0 -90
  332. package/src/theming/createComponentStyleTag.js +0 -32
  333. package/src/theming/createThemePropertiesStyleTag.js +0 -27
  334. package/src/thirdparty/Array.from.js +0 -16
  335. package/src/thirdparty/Array.prototype.fill.js +0 -44
  336. package/src/thirdparty/Array.prototype.find.js +0 -46
  337. package/src/thirdparty/Array.prototype.includes.js +0 -51
  338. package/src/thirdparty/Element.prototype.closest.js +0 -11
  339. package/src/thirdparty/Element.prototype.matches.js +0 -6
  340. package/src/thirdparty/Map.prototype.keys.js +0 -9
  341. package/src/thirdparty/Number.isInteger.js +0 -5
  342. package/src/thirdparty/Number.isNaN.js +0 -1
  343. package/src/thirdparty/Number.parseInt.js +0 -1
  344. package/src/thirdparty/Object.assign.js +0 -31
  345. package/src/thirdparty/Object.entries.js +0 -11
  346. package/src/thirdparty/Symbol.js +0 -2
  347. package/src/thirdparty/WeakSet.js +0 -27
  348. package/src/thirdparty/es6-string-methods.js +0 -182
  349. package/src/thirdparty/events-polyfills.js +0 -89
  350. package/src/thirdparty/fetch.js +0 -1
  351. package/src/thirdparty/template.js +0 -600
@@ -1,72 +1,84 @@
1
1
  class EventProvider {
2
2
  constructor() {
3
- this._eventRegistry = {};
3
+ this._eventRegistry = new Map();
4
4
  }
5
5
 
6
6
  attachEvent(eventName, fnFunction) {
7
7
  const eventRegistry = this._eventRegistry;
8
- let eventListeners = eventRegistry[eventName];
8
+ const eventListeners = eventRegistry.get(eventName);
9
9
 
10
10
  if (!Array.isArray(eventListeners)) {
11
- eventRegistry[eventName] = [];
12
- eventListeners = eventRegistry[eventName];
11
+ eventRegistry.set(eventName, [fnFunction]);
12
+ return;
13
13
  }
14
14
 
15
- eventListeners.push({
16
- "function": fnFunction,
17
- });
15
+ if (!eventListeners.includes(fnFunction)) {
16
+ eventListeners.push(fnFunction);
17
+ }
18
18
  }
19
19
 
20
20
  detachEvent(eventName, fnFunction) {
21
21
  const eventRegistry = this._eventRegistry;
22
- let eventListeners = eventRegistry[eventName];
22
+ const eventListeners = eventRegistry.get(eventName);
23
23
 
24
24
  if (!eventListeners) {
25
25
  return;
26
26
  }
27
+ const indexOfFnToDetach = eventListeners.indexOf(fnFunction);
27
28
 
28
- eventListeners = eventListeners.filter(event => {
29
- return event["function"] !== fnFunction; // eslint-disable-line
30
- });
29
+ if (indexOfFnToDetach !== -1) {
30
+ eventListeners.splice(indexOfFnToDetach, 1);
31
+ }
31
32
 
32
33
  if (eventListeners.length === 0) {
33
- delete eventRegistry[eventName];
34
+ eventRegistry.delete(eventName);
34
35
  }
35
36
  }
36
37
 
38
+ /**
39
+ * Fires an event and returns the results of all event listeners as an array.
40
+ *
41
+ * @param eventName the event to fire
42
+ * @param data optional data to pass to each event listener
43
+ * @returns {Array} an array with the results of all event listeners
44
+ */
37
45
  fireEvent(eventName, data) {
38
46
  const eventRegistry = this._eventRegistry;
39
- const eventListeners = eventRegistry[eventName];
47
+ const eventListeners = eventRegistry.get(eventName);
40
48
 
41
49
  if (!eventListeners) {
42
- return;
50
+ return [];
43
51
  }
44
52
 
45
- eventListeners.forEach(event => {
46
- event["function"].call(this, data); // eslint-disable-line
53
+ return eventListeners.map(fn => {
54
+ return fn.call(this, data); // eslint-disable-line
47
55
  });
48
56
  }
49
57
 
58
+ /**
59
+ * Fires an event and returns a promise that will resolve once all listeners have resolved.
60
+ *
61
+ * @param eventName the event to fire
62
+ * @param data optional data to pass to each event listener
63
+ * @returns {Promise} a promise that will resolve when all listeners have resolved
64
+ */
65
+ fireEventAsync(eventName, data) {
66
+ return Promise.all(this.fireEvent(eventName, data));
67
+ }
68
+
50
69
  isHandlerAttached(eventName, fnFunction) {
51
70
  const eventRegistry = this._eventRegistry;
52
- const eventListeners = eventRegistry[eventName];
71
+ const eventListeners = eventRegistry.get(eventName);
53
72
 
54
73
  if (!eventListeners) {
55
74
  return false;
56
75
  }
57
76
 
58
- for (let i = 0; i < eventListeners.length; i++) {
59
- const event = eventListeners[i];
60
- if (event["function"] === fnFunction) { // eslint-disable-line
61
- return true;
62
- }
63
- }
64
-
65
- return false;
77
+ return eventListeners.includes(fnFunction);
66
78
  }
67
79
 
68
80
  hasListeners(eventName) {
69
- return !!this._eventRegistry[eventName];
81
+ return !!this._eventRegistry.get(eventName);
70
82
  }
71
83
  }
72
84
 
@@ -8,4 +8,7 @@ const getFeature = name => {
8
8
  return features.get(name);
9
9
  };
10
10
 
11
- export { registerFeature, getFeature };
11
+ export {
12
+ registerFeature,
13
+ getFeature,
14
+ };
package/dist/FontFace.js CHANGED
@@ -1,73 +1,30 @@
1
- /**
2
- * CSS font face used for the texts provided by SAP.
3
- */
4
- import createStyleInHead from "./util/createStyleInHead.js";
1
+ import { hasStyle, createStyle } from "./ManagedStyles.js";
5
2
  import { getFeature } from "./FeaturesRegistry.js";
3
+ import fontFaceCSS from "./generated/css/FontFace.css.js";
4
+ import overrideFontFaceCSS from "./generated/css/OverrideFontFace.css.js";
6
5
 
7
- /* CDN Locations */
8
- const font72RegularWoff = `https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular.woff?ui5-webcomponents`;
9
- const font72RegularWoff2 = `https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular.woff2?ui5-webcomponents`;
10
-
11
- const font72RegularFullWoff = `https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular-full.woff?ui5-webcomponents`;
12
- const font72RegularFullWoff2 = `https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular-full.woff2?ui5-webcomponents`;
13
-
14
- const font72BoldWoff = `https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold.woff?ui5-webcomponents`;
15
- const font72BoldWoff2 = `https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold.woff2?ui5-webcomponents`;
16
-
17
- const font72BoldFullWoff = `https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold-full.woff?ui5-webcomponents`;
18
- const font72BoldFullWoff2 = `https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold-full.woff2?ui5-webcomponents`;
6
+ const insertFontFace = () => {
7
+ const OpenUI5Support = getFeature("OpenUI5Support");
19
8
 
20
- const fontFaceCSS = `
21
- @font-face {
22
- font-family: "72";
23
- font-style: normal;
24
- font-weight: 400;
25
- src: local("72"),
26
- url(${font72RegularWoff2}) format("woff2"),
27
- url(${font72RegularWoff}) format("woff");
28
- }
29
-
30
- @font-face {
31
- font-family: "72full";
32
- font-style: normal;
33
- font-weight: 400;
34
- src: local('72-full'),
35
- url(${font72RegularFullWoff2}) format("woff2"),
36
- url(${font72RegularFullWoff}) format("woff");
37
-
38
- }
39
-
40
- @font-face {
41
- font-family: "72";
42
- font-style: normal;
43
- font-weight: 700;
44
- src: local('72-Bold'),
45
- url(${font72BoldWoff2}) format("woff2"),
46
- url(${font72BoldWoff}) format("woff");
9
+ // Only set the main font if there is no OpenUI5 support, or there is, but OpenUI5 is not loaded
10
+ if (!OpenUI5Support || !OpenUI5Support.isLoaded()) {
11
+ insertMainFontFace();
47
12
  }
48
-
49
- @font-face {
50
- font-family: "72full";
51
- font-style: normal;
52
- font-weight: 700;
53
- src: local('72-Bold-full'),
54
- url(${font72BoldFullWoff2}) format("woff2"),
55
- url(${font72BoldFullWoff}) format("woff");
56
- }
57
- `;
58
13
 
59
- const insertFontFace = () => {
60
- if (document.querySelector(`head>style[data-ui5-font-face]`)) {
61
- return;
62
- }
14
+ // Always set the override font - OpenUI5 in CSS Vars mode does not set it, unlike the main font
15
+ insertOverrideFontFace();
16
+ };
63
17
 
64
- // If OpenUI5 is found, let it set the font
65
- const OpenUI5Support = getFeature("OpenUI5Support");
66
- if (OpenUI5Support && OpenUI5Support.isLoaded()) {
67
- return;
18
+ const insertMainFontFace = () => {
19
+ if (!hasStyle("data-ui5-font-face")) {
20
+ createStyle(fontFaceCSS, "data-ui5-font-face");
68
21
  }
22
+ };
69
23
 
70
- createStyleInHead(fontFaceCSS, { "data-ui5-font-face": "" });
24
+ const insertOverrideFontFace = () => {
25
+ if (!hasStyle("data-ui5-font-face-override")) {
26
+ createStyle(overrideFontFaceCSS, "data-ui5-font-face-override");
27
+ }
71
28
  };
72
29
 
73
30
  export default insertFontFace;
@@ -1,16 +1,18 @@
1
1
  import merge from "./thirdparty/merge.js";
2
2
  import { getFeature } from "./FeaturesRegistry.js";
3
+ import { DEFAULT_THEME } from "./generated/AssetParameters.js";
3
4
 
4
5
  let initialized = false;
5
6
 
6
7
  let initialConfig = {
7
8
  animationMode: "full",
8
- theme: "sap_fiori_3",
9
+ theme: DEFAULT_THEME,
9
10
  rtl: null,
10
11
  language: null,
11
12
  calendarType: null,
12
13
  noConflict: false, // no URL
13
14
  formatSettings: {},
15
+ fetchDefaultLanguage: false,
14
16
  };
15
17
 
16
18
  /* General settings */
@@ -34,6 +36,16 @@ const getLanguage = () => {
34
36
  return initialConfig.language;
35
37
  };
36
38
 
39
+ /**
40
+ * Returns if the default language, that is inlined at build time,
41
+ * should be fetched over the network instead.
42
+ * @returns {Boolean}
43
+ */
44
+ const getFetchDefaultLanguage = () => {
45
+ initConfiguration();
46
+ return initialConfig.fetchDefaultLanguage;
47
+ };
48
+
37
49
  const getNoConflict = () => {
38
50
  initConfiguration();
39
51
  return initialConfig.noConflict;
@@ -74,23 +86,47 @@ const parseConfigurationScript = () => {
74
86
  const parseURLParameters = () => {
75
87
  const params = new URLSearchParams(window.location.search);
76
88
 
89
+ // Process "sap-*" params first
77
90
  params.forEach((value, key) => {
78
- if (!key.startsWith("sap-ui")) {
91
+ const parts = key.split("sap-").length;
92
+ if (parts === 0 || parts === key.split("sap-ui-").length) {
79
93
  return;
80
94
  }
81
95
 
82
- const lowerCaseValue = value.toLowerCase();
83
-
84
- const param = key.split("sap-ui-")[1];
96
+ applyURLParam(key, value, "sap");
97
+ });
85
98
 
86
- if (booleanMapping.has(value)) {
87
- value = booleanMapping.get(lowerCaseValue);
99
+ // Process "sap-ui-*" params
100
+ params.forEach((value, key) => {
101
+ if (!key.startsWith("sap-ui")) {
102
+ return;
88
103
  }
89
104
 
90
- initialConfig[param] = value;
105
+ applyURLParam(key, value, "sap-ui");
91
106
  });
92
107
  };
93
108
 
109
+ const normalizeParamValue = (param, value) => {
110
+ if (param === "theme" && value.includes("@")) { // the theme parameter might have @<URL-TO-THEME> in the value - strip this
111
+ return value.split("@")[0];
112
+ }
113
+
114
+ return value;
115
+ };
116
+
117
+ const applyURLParam = (key, value, paramType) => {
118
+ const lowerCaseValue = value.toLowerCase();
119
+ const param = key.split(`${paramType}-`)[1];
120
+
121
+ if (booleanMapping.has(value)) {
122
+ value = booleanMapping.get(lowerCaseValue);
123
+ }
124
+
125
+ value = normalizeParamValue(param, value);
126
+
127
+ initialConfig[param] = value;
128
+ };
129
+
94
130
  const applyOpenUI5Configuration = () => {
95
131
  const OpenUI5Support = getFeature("OpenUI5Support");
96
132
  if (!OpenUI5Support || !OpenUI5Support.isLoaded()) {
@@ -101,7 +137,6 @@ const applyOpenUI5Configuration = () => {
101
137
  initialConfig = merge(initialConfig, OpenUI5Config);
102
138
  };
103
139
 
104
-
105
140
  const initConfiguration = () => {
106
141
  if (initialized) {
107
142
  return;
@@ -124,6 +159,7 @@ export {
124
159
  getTheme,
125
160
  getRTL,
126
161
  getLanguage,
162
+ getFetchDefaultLanguage,
127
163
  getNoConflict,
128
164
  getCalendarType,
129
165
  getFormatSettings,
package/dist/Keys.js CHANGED
@@ -105,8 +105,12 @@ const KeyCodes = {
105
105
 
106
106
  const isEnter = event => (event.key ? event.key === "Enter" : event.keyCode === KeyCodes.ENTER) && !hasModifierKeys(event);
107
107
 
108
+ const isEnterShift = event => (event.key ? event.key === "Enter" : event.keyCode === KeyCodes.ENTER) && checkModifierKeys(event, false, false, true);
109
+
108
110
  const isSpace = event => (event.key ? (event.key === "Spacebar" || event.key === " ") : event.keyCode === KeyCodes.SPACE) && !hasModifierKeys(event);
109
111
 
112
+ const isSpaceShift = event => (event.key ? (event.key === "Spacebar" || event.key === " ") : event.keyCode === KeyCodes.SPACE) && checkModifierKeys(event, false, false, true);
113
+
110
114
  const isLeft = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && !hasModifierKeys(event);
111
115
 
112
116
  const isRight = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && !hasModifierKeys(event);
@@ -115,10 +119,42 @@ const isUp = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up
115
119
 
116
120
  const isDown = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && !hasModifierKeys(event);
117
121
 
122
+ const isLeftCtrl = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && checkModifierKeys(event, true, false, false);
123
+
124
+ const isRightCtrl = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && checkModifierKeys(event, true, false, false);
125
+
126
+ const isUpCtrl = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_UP) && checkModifierKeys(event, true, false, false);
127
+
128
+ const isDownCtrl = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, true, false, false);
129
+
130
+ const isUpShift = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_UP) && checkModifierKeys(event, false, false, true);
131
+
132
+ const isDownShift = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, false, false, true);
133
+
134
+ const isUpAlt = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_UP) && checkModifierKeys(event, false, true, false);
135
+
136
+ const isDownAlt = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, false, true, false);
137
+
138
+ const isLeftShift = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && checkModifierKeys(event, false, false, true);
139
+
140
+ const isRightShift = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && checkModifierKeys(event, false, false, true);
141
+
142
+ const isLeftShiftCtrl = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && checkModifierKeys(event, true, false, true);
143
+
144
+ const isRightShiftCtrl = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && checkModifierKeys(event, true, false, true);
145
+
146
+ const isUpShiftCtrl = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_UP) && checkModifierKeys(event, true, false, true);
147
+
148
+ const isDownShiftCtrl = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, true, false, true);
149
+
118
150
  const isHome = event => (event.key ? event.key === "Home" : event.keyCode === KeyCodes.HOME) && !hasModifierKeys(event);
119
151
 
120
152
  const isEnd = event => (event.key ? event.key === "End" : event.keyCode === KeyCodes.END) && !hasModifierKeys(event);
121
153
 
154
+ const isHomeCtrl = event => (event.key ? event.key === "Home" : event.keyCode === KeyCodes.HOME) && checkModifierKeys(event, true, false, false);
155
+
156
+ const isEndCtrl = event => (event.key ? event.key === "End" : event.keyCode === KeyCodes.END) && checkModifierKeys(event, true, false, false);
157
+
122
158
  const isEscape = event => (event.key ? event.key === "Escape" || event.key === "Esc" : event.keyCode === KeyCodes.ESCAPE) && !hasModifierKeys(event);
123
159
 
124
160
  const isTabNext = event => (event.key ? event.key === "Tab" : event.keyCode === KeyCodes.TAB) && !hasModifierKeys(event);
@@ -129,33 +165,107 @@ const isBackSpace = event => (event.key ? event.key === "Backspace" : event.keyC
129
165
 
130
166
  const isDelete = event => (event.key ? event.key === "Delete" : event.keyCode === KeyCodes.DELETE) && !hasModifierKeys(event);
131
167
 
168
+ const isPageUp = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && !hasModifierKeys(event);
169
+
170
+ const isPageDown = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && !hasModifierKeys(event);
171
+
172
+ const isPageUpShift = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, false, false, true);
173
+
174
+ const isPageUpAlt = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, false, true, false);
175
+
176
+ const isPageDownShift = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, false, false, true);
177
+
178
+ const isPageDownAlt = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, false, true, false);
179
+
180
+ const isPageUpShiftCtrl = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, true, false, true);
181
+
182
+ const isPageDownShiftCtrl = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, true, false, true);
183
+
184
+ const isPlus = event => (event.key ? event.key === "+" : event.keyCode === KeyCodes.PLUS) || (event.keyCode === KeyCodes.NUMPAD_PLUS && !hasModifierKeys(event));
185
+
186
+ const isMinus = event => (event.key ? event.key === "-" : event.keyCode === KeyCodes.MINUS) || (event.keyCode === KeyCodes.NUMPAD_MINUS && !hasModifierKeys(event));
187
+
132
188
  const isShow = event => {
133
189
  if (event.key) {
134
- return (event.key === "F4" && !hasModifierKeys(event)) || (((event.key === "ArrowDown" || event.key === "Down") || (event.key === "ArrowUp" || event.key === "Up")) && checkModifierKeys(event, /* Ctrl */ false, /* Alt */ true, /* Shift */ false));
190
+ return isF4(event) || isShowByArrows(event);
135
191
  }
136
192
 
137
193
  return (event.keyCode === KeyCodes.F4 && !hasModifierKeys(event)) || (event.keyCode === KeyCodes.ARROW_DOWN && checkModifierKeys(event, /* Ctrl */ false, /* Alt */ true, /* Shift */ false));
138
194
  };
139
195
 
196
+ const isF4 = event => {
197
+ return event.key === "F4" && !hasModifierKeys(event);
198
+ };
199
+
200
+ const isF4Shift = event => (event.key ? event.key === "F4" : event.keyCode === KeyCodes.F4) && checkModifierKeys(event, false, false, true);
201
+
202
+ const isF6Next = event => ((event.key ? event.key === "F6" : event.keyCode === KeyCodes.F6) && checkModifierKeys(event, false, false, false))
203
+ || ((event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, true, true, false));
204
+
205
+ const isF6Previous = event => ((event.key ? event.key === "F6" : event.keyCode === KeyCodes.F6) && checkModifierKeys(event, false, false, true))
206
+ || ((event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_Up) && checkModifierKeys(event, true, true, false));
207
+
208
+ const isF7 = event => (event.key ? event.key === "F7" : event.keyCode === KeyCodes.F7) && !hasModifierKeys(event);
209
+
210
+ const isShowByArrows = event => {
211
+ return ((event.key === "ArrowDown" || event.key === "Down") || (event.key === "ArrowUp" || event.key === "Up")) && checkModifierKeys(event, /* Ctrl */ false, /* Alt */ true, /* Shift */ false);
212
+ };
213
+
214
+ const isShift = event => event.key === "Shift" || event.keyCode === KeyCodes.SHIFT;
215
+
140
216
  const hasModifierKeys = event => event.shiftKey || event.altKey || getCtrlKey(event);
141
217
 
142
218
  const getCtrlKey = event => !!(event.metaKey || event.ctrlKey); // double negation doesn't have effect on boolean but ensures null and undefined are equivalent to false.
143
219
 
144
- const checkModifierKeys = (oEvent, bCtrlKey, bAltKey, bShiftKey) => oEvent.shiftKey === bShiftKey && oEvent.altKey === bAltKey && getCtrlKey(oEvent) === bCtrlKey;
220
+ const checkModifierKeys = (event, bCtrlKey, bAltKey, bShiftKey) => event.shiftKey === bShiftKey && event.altKey === bAltKey && getCtrlKey(event) === bCtrlKey;
145
221
 
146
222
  export {
147
223
  isEnter,
224
+ isEnterShift,
148
225
  isSpace,
226
+ isSpaceShift,
149
227
  isLeft,
150
228
  isRight,
151
229
  isUp,
152
230
  isDown,
231
+ isLeftCtrl,
232
+ isRightCtrl,
233
+ isUpCtrl,
234
+ isDownCtrl,
235
+ isUpShift,
236
+ isDownShift,
237
+ isUpAlt,
238
+ isDownAlt,
239
+ isLeftShift,
240
+ isRightShift,
241
+ isLeftShiftCtrl,
242
+ isRightShiftCtrl,
243
+ isUpShiftCtrl,
244
+ isDownShiftCtrl,
153
245
  isHome,
154
246
  isEnd,
247
+ isPlus,
248
+ isMinus,
249
+ isHomeCtrl,
250
+ isEndCtrl,
155
251
  isEscape,
156
252
  isTabNext,
157
253
  isTabPrevious,
158
254
  isBackSpace,
159
255
  isDelete,
160
256
  isShow,
257
+ isF4,
258
+ isF4Shift,
259
+ isF6Previous,
260
+ isF6Next,
261
+ isF7,
262
+ isPageUp,
263
+ isPageDown,
264
+ isPageUpShift,
265
+ isPageUpAlt,
266
+ isPageDownShift,
267
+ isPageDownAlt,
268
+ isPageUpShiftCtrl,
269
+ isPageDownShiftCtrl,
270
+ isShift,
161
271
  };
@@ -0,0 +1,83 @@
1
+ import createStyleInHead from "./util/createStyleInHead.js";
2
+ import createLinkInHead from "./util/createLinkInHead.js";
3
+ import { shouldUseLinks, getUrl } from "./CSP.js";
4
+
5
+ const getStyleId = (name, value) => {
6
+ return value ? `${name}|${value}` : name;
7
+ };
8
+
9
+ const createStyle = (data, name, value = "") => {
10
+ const content = typeof data === "string" ? data : data.content;
11
+
12
+ if (shouldUseLinks()) {
13
+ const attributes = {};
14
+ attributes[name] = value;
15
+ const href = getUrl(data.packageName, data.fileName);
16
+ createLinkInHead(href, attributes);
17
+ } else if (document.adoptedStyleSheets) {
18
+ const stylesheet = new CSSStyleSheet();
19
+ stylesheet.replaceSync(content);
20
+ stylesheet._ui5StyleId = getStyleId(name, value); // set an id so that we can find the style later
21
+ document.adoptedStyleSheets = [...document.adoptedStyleSheets, stylesheet];
22
+ } else {
23
+ const attributes = {};
24
+ attributes[name] = value;
25
+ createStyleInHead(content, attributes);
26
+ }
27
+ };
28
+
29
+ const updateStyle = (data, name, value = "") => {
30
+ const content = typeof data === "string" ? data : data.content;
31
+
32
+ if (shouldUseLinks()) {
33
+ document.querySelector(`head>link[${name}="${value}"]`).href = getUrl(data.packageName, data.fileName);
34
+ } else if (document.adoptedStyleSheets) {
35
+ document.adoptedStyleSheets.find(sh => sh._ui5StyleId === getStyleId(name, value)).replaceSync(content || "");
36
+ } else {
37
+ document.querySelector(`head>style[${name}="${value}"]`).textContent = content || "";
38
+ }
39
+ };
40
+
41
+ const hasStyle = (name, value = "") => {
42
+ if (shouldUseLinks()) {
43
+ return !!document.querySelector(`head>link[${name}="${value}"]`);
44
+ }
45
+
46
+ if (document.adoptedStyleSheets) {
47
+ return !!document.adoptedStyleSheets.find(sh => sh._ui5StyleId === getStyleId(name, value));
48
+ }
49
+
50
+ return !!document.querySelector(`head>style[${name}="${value}"]`);
51
+ };
52
+
53
+ const removeStyle = (name, value = "") => {
54
+ if (shouldUseLinks()) {
55
+ const linkElement = document.querySelector(`head>link[${name}="${value}"]`);
56
+ if (linkElement) {
57
+ linkElement.parentElement.removeChild(linkElement);
58
+ }
59
+ } else if (document.adoptedStyleSheets) {
60
+ document.adoptedStyleSheets = document.adoptedStyleSheets.filter(sh => sh._ui5StyleId !== getStyleId(name, value));
61
+ } else {
62
+ const styleElement = document.querySelector(`head > style[${name}="${value}"]`);
63
+ if (styleElement) {
64
+ styleElement.parentElement.removeChild(styleElement);
65
+ }
66
+ }
67
+ };
68
+
69
+ const createOrUpdateStyle = (data, name, value = "") => {
70
+ if (hasStyle(name, value)) {
71
+ updateStyle(data, name, value);
72
+ } else {
73
+ createStyle(data, name, value);
74
+ }
75
+ };
76
+
77
+ export {
78
+ createStyle,
79
+ hasStyle,
80
+ updateStyle,
81
+ removeStyle,
82
+ createOrUpdateStyle,
83
+ };
@@ -0,0 +1,109 @@
1
+ const querySets = {};
2
+
3
+ /**
4
+ * Initializes a screen width media query range set.
5
+ *
6
+ * This initialization step makes the range set ready to be used for one of the other functions in namespace <code>MediaRange</code>.
7
+ *
8
+ * A range set can be defined as shown in the following example:
9
+ * <pre>
10
+ * MediaRange.initRangeSet("MyRangeSet", [200, 400], ["Small", "Medium", "Large"]);
11
+ * </pre>
12
+ * This example defines the following named ranges:
13
+ * <ul>
14
+ * <li><code>"Small"</code>: For screens smaller than 200 pixels.</li>
15
+ * <li><code>"Medium"</code>: For screens greater than or equal to 200 pixels and smaller than 400 pixels.</li>
16
+ * <li><code>"Large"</code>: For screens greater than or equal to 400 pixels.</li>
17
+ * </ul>
18
+ *
19
+ * @param {string} name The name of the range set to be initialized.
20
+ * The name must be a valid id and consist only of letters and numeric digits.
21
+ *
22
+ * @param {int[]} [borders] The range borders
23
+ *
24
+ * @param {string[]} [names] The names of the ranges. The names must be a valid id and consist only of letters and digits.
25
+ *
26
+ * @name MediaRange.initRangeSet
27
+ * @function
28
+ * @public
29
+ */
30
+ const _initRangeSet = (name, borders, names) => {
31
+ querySets[name] = {
32
+ borders,
33
+ names,
34
+ };
35
+ };
36
+
37
+ /**
38
+ * Returns information about the current active range of the range set with the given name.
39
+ *
40
+ * If the optional parameter <code>width</code> is given, the active range will be determined for that width,
41
+ * otherwise it is determined for the current window size.
42
+ *
43
+ * @param {string} name The name of the range set. The range set must be initialized beforehand ({@link MediaRange.initRangeSet})
44
+ * @param {int} [width] An optional width, based on which the range should be determined;
45
+ * If <code>width</code> is not provided, the window size will be used.
46
+ * @returns {string} The name of the current active interval of the range set.
47
+ *
48
+ * @name MediaRange.getCurrentRange
49
+ * @function
50
+ * @public
51
+ */
52
+ const _getCurrentRange = (name, width = window.innerWidth) => {
53
+ const querySet = querySets[name];
54
+ let i = 0;
55
+
56
+ if (!querySet) {
57
+ return null;
58
+ }
59
+
60
+ for (; i < querySet.borders.length; i++) {
61
+ if (width < querySet.borders[i]) {
62
+ return querySet.names[i];
63
+ }
64
+ }
65
+
66
+ return querySet.names[i];
67
+ };
68
+
69
+ /**
70
+ * Enumeration containing the names and settings of predefined screen width media query range sets.
71
+ *
72
+ * @namespace
73
+ * @name MediaRange.RANGESETS
74
+ * @public
75
+ */
76
+ const RANGESETS = {
77
+ /**
78
+ * A 4-step range set (S-M-L-XL).
79
+ *
80
+ * The ranges of this set are:
81
+ * <ul>
82
+ * <li><code>"S"</code>: For screens smaller than 600 pixels.</li>
83
+ * <li><code>"M"</code>: For screens greater than or equal to 600 pixels and smaller than 1024 pixels.</li>
84
+ * <li><code>"L"</code>: For screens greater than or equal to 1024 pixels and smaller than 1440 pixels.</li>
85
+ * <li><code>"XL"</code>: For screens greater than or equal to 1440 pixels.</li>
86
+ * </ul>
87
+ *
88
+ * @name MediaRange.RANGESETS.RANGE_4STEPS
89
+ * @public
90
+ */
91
+ RANGE_4STEPS: "4Step",
92
+ };
93
+
94
+ /**
95
+ * API for screen width changes.
96
+ *
97
+ * @namespace
98
+ * @name MediaRange
99
+ */
100
+
101
+ const MediaRange = {
102
+ RANGESETS,
103
+ initRangeSet: _initRangeSet,
104
+ getCurrentRange: _getCurrentRange,
105
+ };
106
+
107
+ MediaRange.initRangeSet(MediaRange.RANGESETS.RANGE_4STEPS, [600, 1024, 1440], ["S", "M", "L", "XL"]);
108
+
109
+ export default MediaRange;