@ui5/webcomponents-base 0.0.0-dff5837d7 → 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 (351) hide show
  1. package/.eslintignore +3 -0
  2. package/CHANGELOG.md +336 -0
  3. package/README.md +26 -2
  4. package/bundle.esm.js +16 -7
  5. package/dist/AssetRegistry.js +8 -7
  6. package/dist/Boot.js +59 -0
  7. package/dist/CSP.js +59 -0
  8. package/dist/CustomElementsRegistry.js +60 -4
  9. package/dist/CustomElementsScope.js +30 -0
  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 +19 -62
  16. package/dist/InitialConfiguration.js +43 -8
  17. package/dist/Keys.js +125 -0
  18. package/dist/ManagedStyles.js +83 -0
  19. package/dist/MediaRange.js +109 -0
  20. package/dist/{util/parseProperties.js → PropertiesFileFormat.js} +6 -0
  21. package/dist/Render.js +175 -0
  22. package/dist/RenderQueue.js +41 -17
  23. package/dist/RenderScheduler.js +24 -158
  24. package/dist/Runtimes.js +107 -0
  25. package/dist/StaticArea.js +1 -39
  26. package/dist/StaticAreaItem.js +58 -62
  27. package/dist/SystemCSSVars.js +4 -25
  28. package/dist/Theming.js +2 -1
  29. package/dist/UI5Element.js +391 -350
  30. package/dist/UI5ElementMetadata.js +158 -18
  31. package/dist/asset-registries/Icons.js +117 -13
  32. package/dist/asset-registries/Illustrations.js +30 -0
  33. package/dist/asset-registries/LocaleData.js +105 -66
  34. package/dist/asset-registries/Themes.js +29 -34
  35. package/dist/asset-registries/i18n.js +63 -48
  36. package/dist/assets-meta/IconCollectionsAlias.js +18 -0
  37. package/dist/config/AnimationMode.js +11 -1
  38. package/dist/config/Icons.js +52 -0
  39. package/dist/config/Language.js +33 -6
  40. package/dist/config/Theme.js +25 -0
  41. package/dist/css/BusyIndicator.css +80 -0
  42. package/dist/css/FontFace.css +75 -0
  43. package/dist/css/OverrideFontFace.css +32 -0
  44. package/dist/css/SystemCSSVars.css +17 -0
  45. package/dist/delegate/ItemNavigation.js +239 -170
  46. package/dist/delegate/ResizeHandler.js +78 -37
  47. package/dist/delegate/ScrollEnablement.js +49 -20
  48. package/dist/features/F6Navigation.js +106 -0
  49. package/dist/features/OpenUI5Enablement.js +119 -0
  50. package/dist/features/OpenUI5Support.js +42 -7
  51. package/dist/generated/AssetParameters.js +1 -1
  52. package/dist/generated/VersionInfo.js +10 -0
  53. package/dist/generated/css/BusyIndicator.css.js +5 -0
  54. package/dist/generated/css/FontFace.css.js +5 -0
  55. package/dist/generated/css/OverrideFontFace.css.js +5 -0
  56. package/dist/generated/css/SystemCSSVars.css.js +5 -0
  57. package/dist/getSharedResource.js +30 -0
  58. package/dist/i18nBundle.js +58 -5
  59. package/dist/isLegacyBrowser.js +3 -0
  60. package/dist/locale/applyDirection.js +6 -4
  61. package/dist/locale/directionChange.js +32 -0
  62. package/dist/locale/getEffectiveDir.js +28 -0
  63. package/dist/locale/getLocale.js +12 -2
  64. package/dist/locale/languageChange.js +1 -1
  65. package/dist/renderer/LitRenderer.js +44 -7
  66. package/dist/renderer/directives/style-map.js +72 -0
  67. package/dist/renderer/executeTemplate.js +34 -0
  68. package/dist/resources/bundle.esm.js +15 -112
  69. package/dist/resources/bundle.esm.js.map +1 -1
  70. package/dist/sap/base/Log.js +241 -0
  71. package/dist/sap/base/assert.js +8 -0
  72. package/dist/sap/base/security/URLListValidator.js +148 -0
  73. package/dist/sap/base/security/encodeCSS.js +14 -0
  74. package/dist/sap/base/security/encodeXML.js +23 -0
  75. package/dist/sap/base/security/sanitizeHTML.js +16 -0
  76. package/dist/sap/base/strings/toHex.js +8 -0
  77. package/dist/sap/base/util/now.js +7 -0
  78. package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
  79. package/dist/test-resources/assets/Themes.js +10 -6
  80. package/dist/test-resources/elements/Parent.js +6 -2
  81. package/dist/test-resources/elements/WithStaticArea.js +2 -1
  82. package/dist/test-resources/pages/AllTestElements.html +3 -3
  83. package/dist/test-resources/pages/Configuration.html +0 -2
  84. package/dist/test-resources/pages/ConfigurationScript.html +0 -2
  85. package/dist/test-resources/pages/assets/messagebundle_de.properties +1 -0
  86. package/dist/test-resources/pages/assets/messagebundle_en.properties +1 -0
  87. package/dist/test-resources/pages/assets/messagebundle_es.properties +1 -0
  88. package/dist/test-resources/pages/assets/messagebundle_fr.properties +1 -0
  89. package/dist/test-resources/pages/i18n.html +33 -0
  90. package/dist/test-resources/specs/ConfigurationChange.spec.js +10 -8
  91. package/dist/test-resources/specs/ConfigurationScript.spec.js +25 -23
  92. package/dist/test-resources/specs/ConfigurationURL.spec.js +65 -17
  93. package/dist/test-resources/specs/CustomTheme.spec.js +9 -7
  94. package/dist/test-resources/specs/EventProvider.spec.js +63 -0
  95. package/dist/test-resources/specs/StaticArea.spec.js +56 -12
  96. package/dist/test-resources/specs/Theming.spec.js +23 -10
  97. package/dist/test-resources/specs/UI5ElementInvalidation.js +54 -70
  98. package/dist/test-resources/specs/UI5ElementLifecycle.js +19 -14
  99. package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +25 -51
  100. package/dist/test-resources/specs/UI5ElementMetadataExt.js +9 -7
  101. package/dist/test-resources/specs/UI5ElementPropertyValidation.js +7 -5
  102. package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +37 -35
  103. package/dist/test-resources/specs/UI5ElementShadowDOM.js +10 -8
  104. package/dist/test-resources/specs/UI5ElementSlots.js +10 -8
  105. package/dist/theming/CustomStyle.js +47 -6
  106. package/dist/theming/ThemeLoaded.js +22 -0
  107. package/dist/theming/applyTheme.js +13 -15
  108. package/dist/theming/getConstructableStyle.js +15 -10
  109. package/dist/theming/getEffectiveLinksHrefs.js +27 -0
  110. package/dist/theming/getEffectiveStyle.js +32 -8
  111. package/dist/theming/getStylesString.js +15 -0
  112. package/dist/theming/getThemeDesignerTheme.js +25 -5
  113. package/dist/theming/preloadLinks.js +23 -0
  114. package/dist/types/CSSColor.js +9 -0
  115. package/dist/types/CalendarType.js +1 -1
  116. package/dist/types/DataType.js +13 -1
  117. package/dist/types/Float.js +4 -0
  118. package/dist/types/Integer.js +4 -0
  119. package/dist/types/InvisibleMessageMode.js +30 -0
  120. package/dist/types/ItemNavigationBehavior.js +2 -7
  121. package/dist/types/PopupState.js +1 -1
  122. package/dist/types/ValueState.js +1 -1
  123. package/dist/updateShadowRoot.js +30 -0
  124. package/dist/util/AriaLabelHelper.js +41 -0
  125. package/dist/util/Caret.js +45 -0
  126. package/dist/util/ColorConversion.js +370 -0
  127. package/dist/util/FocusableElements.js +22 -9
  128. package/dist/util/HTMLSanitizer.js +7 -0
  129. package/dist/util/InvisibleMessage.js +60 -0
  130. package/dist/util/PopupUtils.js +93 -0
  131. package/dist/util/SlotsHelper.js +43 -0
  132. package/dist/util/TabbableElements.js +5 -1
  133. package/dist/util/arraysAreEqual.js +15 -0
  134. package/dist/util/clamp.js +12 -0
  135. package/dist/util/createLinkInHead.js +19 -0
  136. package/dist/util/debounce.js +17 -0
  137. package/dist/util/escapeRegex.js +10 -0
  138. package/dist/util/generateHighlightedMarkup.js +42 -0
  139. package/dist/util/getActiveElement.js +11 -0
  140. package/dist/util/getClassCopy.js +10 -0
  141. package/dist/util/getEffectiveContentDensity.js +5 -0
  142. package/dist/util/getNormalizedTarget.js +16 -0
  143. package/dist/util/getSingletonElementInstance.js +13 -0
  144. package/dist/util/isElementInView.js +15 -0
  145. package/dist/util/isNodeHidden.js +1 -1
  146. package/dist/util/isNodeTabbable.js +4 -4
  147. package/dist/util/isValidPropertyName.js +6 -5
  148. package/hash.txt +1 -0
  149. package/index.js +1 -1
  150. package/lib/generate-asset-parameters/index.js +8 -5
  151. package/lib/generate-styles/index.js +26 -0
  152. package/lib/generate-version-info/index.js +32 -0
  153. package/package-scripts.js +30 -19
  154. package/package.json +19 -13
  155. package/src/AssetRegistry.js +8 -7
  156. package/src/Boot.js +59 -0
  157. package/src/CSP.js +59 -0
  158. package/src/CustomElementsRegistry.js +60 -4
  159. package/src/CustomElementsScope.js +30 -0
  160. package/src/CustomElementsScopeUtils.js +108 -0
  161. package/src/DOMObserver.js +65 -0
  162. package/src/Device.js +71 -773
  163. package/src/EventProvider.js +30 -26
  164. package/src/FeaturesRegistry.js +4 -1
  165. package/src/FontFace.js +19 -62
  166. package/src/InitialConfiguration.js +43 -8
  167. package/src/Keys.js +125 -0
  168. package/src/ManagedStyles.js +83 -0
  169. package/src/MediaRange.js +109 -0
  170. package/src/{util/parseProperties.js → PropertiesFileFormat.js} +6 -0
  171. package/src/Render.js +175 -0
  172. package/src/RenderQueue.js +41 -17
  173. package/src/RenderScheduler.js +24 -158
  174. package/src/Runtimes.js +107 -0
  175. package/src/StaticArea.js +1 -39
  176. package/src/StaticAreaItem.js +58 -62
  177. package/src/SystemCSSVars.js +4 -25
  178. package/src/Theming.js +2 -1
  179. package/src/UI5Element.js +391 -350
  180. package/src/UI5ElementMetadata.js +158 -18
  181. package/src/asset-registries/Icons.js +117 -13
  182. package/src/asset-registries/Illustrations.js +30 -0
  183. package/src/asset-registries/LocaleData.js +105 -66
  184. package/src/asset-registries/Themes.js +29 -34
  185. package/src/asset-registries/i18n.js +63 -48
  186. package/src/assets-meta/IconCollectionsAlias.js +18 -0
  187. package/src/config/AnimationMode.js +11 -1
  188. package/src/config/Icons.js +52 -0
  189. package/src/config/Language.js +33 -6
  190. package/src/config/Theme.js +25 -0
  191. package/src/css/BusyIndicator.css +80 -0
  192. package/src/css/FontFace.css +75 -0
  193. package/src/css/OverrideFontFace.css +32 -0
  194. package/src/css/SystemCSSVars.css +17 -0
  195. package/src/delegate/ItemNavigation.js +239 -170
  196. package/src/delegate/ResizeHandler.js +78 -37
  197. package/src/delegate/ScrollEnablement.js +49 -20
  198. package/src/features/F6Navigation.js +106 -0
  199. package/src/features/OpenUI5Enablement.js +119 -0
  200. package/src/features/OpenUI5Support.js +42 -7
  201. package/src/getSharedResource.js +30 -0
  202. package/src/i18nBundle.js +58 -5
  203. package/src/isLegacyBrowser.js +3 -0
  204. package/src/locale/applyDirection.js +6 -4
  205. package/src/locale/directionChange.js +32 -0
  206. package/src/locale/getEffectiveDir.js +28 -0
  207. package/src/locale/getLocale.js +12 -2
  208. package/src/locale/languageChange.js +1 -1
  209. package/src/renderer/LitRenderer.js +44 -7
  210. package/src/renderer/directives/style-map.js +72 -0
  211. package/src/renderer/executeTemplate.js +34 -0
  212. package/src/theming/CustomStyle.js +47 -6
  213. package/src/theming/ThemeLoaded.js +22 -0
  214. package/src/theming/applyTheme.js +13 -15
  215. package/src/theming/getConstructableStyle.js +15 -10
  216. package/src/theming/getEffectiveLinksHrefs.js +27 -0
  217. package/src/theming/getEffectiveStyle.js +32 -8
  218. package/src/theming/getStylesString.js +15 -0
  219. package/src/theming/getThemeDesignerTheme.js +25 -5
  220. package/src/theming/preloadLinks.js +23 -0
  221. package/src/types/CSSColor.js +9 -0
  222. package/src/types/CalendarType.js +1 -1
  223. package/src/types/DataType.js +13 -1
  224. package/src/types/Float.js +4 -0
  225. package/src/types/Integer.js +4 -0
  226. package/src/types/InvisibleMessageMode.js +30 -0
  227. package/src/types/ItemNavigationBehavior.js +2 -7
  228. package/src/types/PopupState.js +1 -1
  229. package/src/types/ValueState.js +1 -1
  230. package/src/updateShadowRoot.js +30 -0
  231. package/src/util/AriaLabelHelper.js +41 -0
  232. package/src/util/Caret.js +45 -0
  233. package/src/util/ColorConversion.js +370 -0
  234. package/src/util/FocusableElements.js +22 -9
  235. package/src/util/HTMLSanitizer.js +7 -0
  236. package/src/util/InvisibleMessage.js +60 -0
  237. package/src/util/PopupUtils.js +93 -0
  238. package/src/util/SlotsHelper.js +43 -0
  239. package/src/util/TabbableElements.js +5 -1
  240. package/src/util/arraysAreEqual.js +15 -0
  241. package/src/util/clamp.js +12 -0
  242. package/src/util/createLinkInHead.js +19 -0
  243. package/src/util/debounce.js +17 -0
  244. package/src/util/escapeRegex.js +10 -0
  245. package/src/util/generateHighlightedMarkup.js +42 -0
  246. package/src/util/getActiveElement.js +11 -0
  247. package/src/util/getClassCopy.js +10 -0
  248. package/src/util/getEffectiveContentDensity.js +5 -0
  249. package/src/util/getNormalizedTarget.js +16 -0
  250. package/src/util/getSingletonElementInstance.js +13 -0
  251. package/src/util/isElementInView.js +15 -0
  252. package/src/util/isNodeHidden.js +1 -1
  253. package/src/util/isNodeTabbable.js +4 -4
  254. package/src/util/isValidPropertyName.js +6 -5
  255. package/used-modules.txt +10 -0
  256. package/bundle.es5.js +0 -28
  257. package/dist/SVGIconRegistry.js +0 -60
  258. package/dist/boot.js +0 -34
  259. package/dist/compatibility/DOMObserver.js +0 -62
  260. package/dist/compatibility/patchNodeValue.js +0 -24
  261. package/dist/compatibility/whenPolyfillLoaded.js +0 -26
  262. package/dist/delegate/CustomResize.js +0 -78
  263. package/dist/delegate/NativeResize.js +0 -44
  264. package/dist/features/PropertiesFormatSupport.js +0 -8
  265. package/dist/features/browsersupport/Edge.js +0 -6
  266. package/dist/features/browsersupport/IE11.js +0 -41
  267. package/dist/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
  268. package/dist/renderer/ifDefined.js +0 -21
  269. package/dist/resources/bundle.es5.js +0 -212
  270. package/dist/resources/bundle.es5.js.map +0 -1
  271. package/dist/theming/CSSVarsPonyfill.js +0 -24
  272. package/dist/theming/adaptCSSForIE.js +0 -90
  273. package/dist/theming/createComponentStyleTag.js +0 -49
  274. package/dist/theming/createThemePropertiesStyleTag.js +0 -20
  275. package/dist/thirdparty/Array.from.js +0 -16
  276. package/dist/thirdparty/Array.prototype.fill.js +0 -44
  277. package/dist/thirdparty/Array.prototype.find.js +0 -46
  278. package/dist/thirdparty/Array.prototype.includes.js +0 -51
  279. package/dist/thirdparty/Element.prototype.closest.js +0 -11
  280. package/dist/thirdparty/Element.prototype.matches.js +0 -6
  281. package/dist/thirdparty/Map.prototype.keys.js +0 -9
  282. package/dist/thirdparty/Number.isInteger.js +0 -5
  283. package/dist/thirdparty/Number.isNaN.js +0 -1
  284. package/dist/thirdparty/Number.parseInt.js +0 -1
  285. package/dist/thirdparty/Object.assign.js +0 -31
  286. package/dist/thirdparty/Object.entries.js +0 -11
  287. package/dist/thirdparty/Symbol.js +0 -2
  288. package/dist/thirdparty/WeakSet.js +0 -27
  289. package/dist/thirdparty/es6-string-methods.js +0 -182
  290. package/dist/thirdparty/events-polyfills.js +0 -89
  291. package/dist/thirdparty/fetch.js +0 -1
  292. package/dist/thirdparty/template.js +0 -600
  293. package/dist/thirdparty/webcomponents-sd-ce-pf.js +0 -318
  294. package/dist/util/isSlot.js +0 -3
  295. package/dist/webcomponentsjs/LICENSE.md +0 -19
  296. package/dist/webcomponentsjs/README.md +0 -229
  297. package/dist/webcomponentsjs/bundles/webcomponents-ce.js +0 -63
  298. package/dist/webcomponentsjs/bundles/webcomponents-ce.js.map +0 -1
  299. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +0 -297
  300. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +0 -1
  301. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js +0 -208
  302. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +0 -1
  303. package/dist/webcomponentsjs/bundles/webcomponents-sd.js +0 -166
  304. package/dist/webcomponentsjs/bundles/webcomponents-sd.js.map +0 -1
  305. package/dist/webcomponentsjs/custom-elements-es5-adapter.js +0 -15
  306. package/dist/webcomponentsjs/package.json +0 -46
  307. package/dist/webcomponentsjs/src/entrypoints/custom-elements-es5-adapter-index.js +0 -16
  308. package/dist/webcomponentsjs/src/entrypoints/webcomponents-bundle-index.js +0 -53
  309. package/dist/webcomponentsjs/src/entrypoints/webcomponents-ce-index.js +0 -17
  310. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-index.js +0 -19
  311. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-pf-index.js +0 -28
  312. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-index.js +0 -18
  313. package/dist/webcomponentsjs/webcomponents-bundle.js +0 -298
  314. package/dist/webcomponentsjs/webcomponents-bundle.js.map +0 -1
  315. package/dist/webcomponentsjs/webcomponents-loader.js +0 -185
  316. package/src/SVGIconRegistry.js +0 -60
  317. package/src/boot.js +0 -34
  318. package/src/compatibility/DOMObserver.js +0 -62
  319. package/src/compatibility/patchNodeValue.js +0 -24
  320. package/src/compatibility/whenPolyfillLoaded.js +0 -26
  321. package/src/delegate/CustomResize.js +0 -78
  322. package/src/delegate/NativeResize.js +0 -44
  323. package/src/features/PropertiesFormatSupport.js +0 -8
  324. package/src/features/browsersupport/Edge.js +0 -6
  325. package/src/features/browsersupport/IE11.js +0 -41
  326. package/src/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
  327. package/src/renderer/ifDefined.js +0 -21
  328. package/src/theming/CSSVarsPonyfill.js +0 -24
  329. package/src/theming/adaptCSSForIE.js +0 -90
  330. package/src/theming/createComponentStyleTag.js +0 -49
  331. package/src/theming/createThemePropertiesStyleTag.js +0 -20
  332. package/src/thirdparty/Array.from.js +0 -16
  333. package/src/thirdparty/Array.prototype.fill.js +0 -44
  334. package/src/thirdparty/Array.prototype.find.js +0 -46
  335. package/src/thirdparty/Array.prototype.includes.js +0 -51
  336. package/src/thirdparty/Element.prototype.closest.js +0 -11
  337. package/src/thirdparty/Element.prototype.matches.js +0 -6
  338. package/src/thirdparty/Map.prototype.keys.js +0 -9
  339. package/src/thirdparty/Number.isInteger.js +0 -5
  340. package/src/thirdparty/Number.isNaN.js +0 -1
  341. package/src/thirdparty/Number.parseInt.js +0 -1
  342. package/src/thirdparty/Object.assign.js +0 -31
  343. package/src/thirdparty/Object.entries.js +0 -11
  344. package/src/thirdparty/Symbol.js +0 -2
  345. package/src/thirdparty/WeakSet.js +0 -27
  346. package/src/thirdparty/es6-string-methods.js +0 -182
  347. package/src/thirdparty/events-polyfills.js +0 -89
  348. package/src/thirdparty/fetch.js +0 -1
  349. package/src/thirdparty/template.js +0 -600
  350. package/src/thirdparty/webcomponents-sd-ce-pf.js +0 -318
  351. package/src/util/isSlot.js +0 -3
@@ -1,42 +1,42 @@
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
 
37
38
  /**
38
39
  * Fires an event and returns the results of all event listeners as an array.
39
- * Example: If listeners return promises, you can: await fireEvent("myEvent") to know when all listeners have finished.
40
40
  *
41
41
  * @param eventName the event to fire
42
42
  * @param data optional data to pass to each event listener
@@ -44,37 +44,41 @@ class EventProvider {
44
44
  */
45
45
  fireEvent(eventName, data) {
46
46
  const eventRegistry = this._eventRegistry;
47
- const eventListeners = eventRegistry[eventName];
47
+ const eventListeners = eventRegistry.get(eventName);
48
48
 
49
49
  if (!eventListeners) {
50
50
  return [];
51
51
  }
52
52
 
53
- return eventListeners.map(event => {
54
- return event["function"].call(this, data); // eslint-disable-line
53
+ return eventListeners.map(fn => {
54
+ return fn.call(this, data); // eslint-disable-line
55
55
  });
56
56
  }
57
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
+
58
69
  isHandlerAttached(eventName, fnFunction) {
59
70
  const eventRegistry = this._eventRegistry;
60
- const eventListeners = eventRegistry[eventName];
71
+ const eventListeners = eventRegistry.get(eventName);
61
72
 
62
73
  if (!eventListeners) {
63
74
  return false;
64
75
  }
65
76
 
66
- for (let i = 0; i < eventListeners.length; i++) {
67
- const event = eventListeners[i];
68
- if (event["function"] === fnFunction) { // eslint-disable-line
69
- return true;
70
- }
71
- }
72
-
73
- return false;
77
+ return eventListeners.includes(fnFunction);
74
78
  }
75
79
 
76
80
  hasListeners(eventName) {
77
- return !!this._eventRegistry[eventName];
81
+ return !!this._eventRegistry.get(eventName);
78
82
  }
79
83
  }
80
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;
@@ -12,6 +12,7 @@ let initialConfig = {
12
12
  calendarType: null,
13
13
  noConflict: false, // no URL
14
14
  formatSettings: {},
15
+ fetchDefaultLanguage: false,
15
16
  };
16
17
 
17
18
  /* General settings */
@@ -35,6 +36,16 @@ const getLanguage = () => {
35
36
  return initialConfig.language;
36
37
  };
37
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
+
38
49
  const getNoConflict = () => {
39
50
  initConfiguration();
40
51
  return initialConfig.noConflict;
@@ -75,23 +86,47 @@ const parseConfigurationScript = () => {
75
86
  const parseURLParameters = () => {
76
87
  const params = new URLSearchParams(window.location.search);
77
88
 
89
+ // Process "sap-*" params first
78
90
  params.forEach((value, key) => {
79
- if (!key.startsWith("sap-ui")) {
91
+ const parts = key.split("sap-").length;
92
+ if (parts === 0 || parts === key.split("sap-ui-").length) {
80
93
  return;
81
94
  }
82
95
 
83
- const lowerCaseValue = value.toLowerCase();
84
-
85
- const param = key.split("sap-ui-")[1];
96
+ applyURLParam(key, value, "sap");
97
+ });
86
98
 
87
- if (booleanMapping.has(value)) {
88
- value = booleanMapping.get(lowerCaseValue);
99
+ // Process "sap-ui-*" params
100
+ params.forEach((value, key) => {
101
+ if (!key.startsWith("sap-ui")) {
102
+ return;
89
103
  }
90
104
 
91
- initialConfig[param] = value;
105
+ applyURLParam(key, value, "sap-ui");
92
106
  });
93
107
  };
94
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
+
95
130
  const applyOpenUI5Configuration = () => {
96
131
  const OpenUI5Support = getFeature("OpenUI5Support");
97
132
  if (!OpenUI5Support || !OpenUI5Support.isLoaded()) {
@@ -102,7 +137,6 @@ const applyOpenUI5Configuration = () => {
102
137
  initialConfig = merge(initialConfig, OpenUI5Config);
103
138
  };
104
139
 
105
-
106
140
  const initConfiguration = () => {
107
141
  if (initialized) {
108
142
  return;
@@ -125,6 +159,7 @@ export {
125
159
  getTheme,
126
160
  getRTL,
127
161
  getLanguage,
162
+ getFetchDefaultLanguage,
128
163
  getNoConflict,
129
164
  getCalendarType,
130
165
  getFormatSettings,
package/dist/Keys.js CHANGED
@@ -105,8 +105,14 @@ 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
+
114
+ const isSpaceCtrl = event => (event.key ? (event.key === "Spacebar" || event.key === " ") : event.keyCode === KeyCodes.SPACE) && checkModifierKeys(event, true, false, false);
115
+
110
116
  const isLeft = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && !hasModifierKeys(event);
111
117
 
112
118
  const isRight = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && !hasModifierKeys(event);
@@ -115,10 +121,46 @@ const isUp = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up
115
121
 
116
122
  const isDown = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && !hasModifierKeys(event);
117
123
 
124
+ const isLeftCtrl = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && checkModifierKeys(event, true, false, false);
125
+
126
+ const isRightCtrl = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && checkModifierKeys(event, true, false, false);
127
+
128
+ const isUpCtrl = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_UP) && checkModifierKeys(event, true, false, false);
129
+
130
+ const isDownCtrl = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, true, false, false);
131
+
132
+ const isUpShift = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_UP) && checkModifierKeys(event, false, false, true);
133
+
134
+ const isDownShift = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, false, false, true);
135
+
136
+ const isUpAlt = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_UP) && checkModifierKeys(event, false, true, false);
137
+
138
+ const isDownAlt = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, false, true, false);
139
+
140
+ const isLeftShift = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && checkModifierKeys(event, false, false, true);
141
+
142
+ const isRightShift = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && checkModifierKeys(event, false, false, true);
143
+
144
+ const isLeftShiftCtrl = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && checkModifierKeys(event, true, false, true);
145
+
146
+ const isRightShiftCtrl = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && checkModifierKeys(event, true, false, true);
147
+
148
+ const isUpShiftCtrl = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_UP) && checkModifierKeys(event, true, false, true);
149
+
150
+ const isDownShiftCtrl = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, true, false, true);
151
+
118
152
  const isHome = event => (event.key ? event.key === "Home" : event.keyCode === KeyCodes.HOME) && !hasModifierKeys(event);
119
153
 
120
154
  const isEnd = event => (event.key ? event.key === "End" : event.keyCode === KeyCodes.END) && !hasModifierKeys(event);
121
155
 
156
+ const isHomeCtrl = event => (event.key ? event.key === "Home" : event.keyCode === KeyCodes.HOME) && checkModifierKeys(event, true, false, false);
157
+
158
+ const isHomeShift = event => (event.key ? event.key === "Home" : event.keyCode === KeyCodes.HOME) && checkModifierKeys(event, false, false, true);
159
+
160
+ const isEndCtrl = event => (event.key ? event.key === "End" : event.keyCode === KeyCodes.END) && checkModifierKeys(event, true, false, false);
161
+
162
+ const isEndShift = event => (event.key ? event.key === "End" : event.keyCode === KeyCodes.END) && checkModifierKeys(event, false, false, true);
163
+
122
164
  const isEscape = event => (event.key ? event.key === "Escape" || event.key === "Esc" : event.keyCode === KeyCodes.ESCAPE) && !hasModifierKeys(event);
123
165
 
124
166
  const isTabNext = event => (event.key ? event.key === "Tab" : event.keyCode === KeyCodes.TAB) && !hasModifierKeys(event);
@@ -129,6 +171,32 @@ const isBackSpace = event => (event.key ? event.key === "Backspace" : event.keyC
129
171
 
130
172
  const isDelete = event => (event.key ? event.key === "Delete" : event.keyCode === KeyCodes.DELETE) && !hasModifierKeys(event);
131
173
 
174
+ const isDeleteShift = event => (event.key ? event.key === "Delete" : event.keyCode === KeyCodes.DELETE) && checkModifierKeys(event, false, false, true);
175
+
176
+ const isInsertShift = event => (event.key ? event.key === "Insert" : event.keyCode === KeyCodes.DELETE) && checkModifierKeys(event, false, false, true);
177
+
178
+ const isInsertCtrl = event => (event.key ? event.key === "Insert" : event.keyCode === KeyCodes.DELETE) && checkModifierKeys(event, true, false, false);
179
+
180
+ const isPageUp = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && !hasModifierKeys(event);
181
+
182
+ const isPageDown = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && !hasModifierKeys(event);
183
+
184
+ const isPageUpShift = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, false, false, true);
185
+
186
+ const isPageUpAlt = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, false, true, false);
187
+
188
+ const isPageDownShift = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, false, false, true);
189
+
190
+ const isPageDownAlt = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, false, true, false);
191
+
192
+ const isPageUpShiftCtrl = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, true, false, true);
193
+
194
+ const isPageDownShiftCtrl = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, true, false, true);
195
+
196
+ const isPlus = event => (event.key ? event.key === "+" : event.keyCode === KeyCodes.PLUS) || (event.keyCode === KeyCodes.NUMPAD_PLUS && !hasModifierKeys(event));
197
+
198
+ const isMinus = event => (event.key ? event.key === "-" : event.keyCode === KeyCodes.MINUS) || (event.keyCode === KeyCodes.NUMPAD_MINUS && !hasModifierKeys(event));
199
+
132
200
  const isShow = event => {
133
201
  if (event.key) {
134
202
  return isF4(event) || isShowByArrows(event);
@@ -141,10 +209,26 @@ const isF4 = event => {
141
209
  return event.key === "F4" && !hasModifierKeys(event);
142
210
  };
143
211
 
212
+ const isF4Shift = event => (event.key ? event.key === "F4" : event.keyCode === KeyCodes.F4) && checkModifierKeys(event, false, false, true);
213
+
214
+ const isF6Next = event => ((event.key ? event.key === "F6" : event.keyCode === KeyCodes.F6) && checkModifierKeys(event, false, false, false))
215
+ || ((event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, true, true, false));
216
+
217
+ const isF6Previous = event => ((event.key ? event.key === "F6" : event.keyCode === KeyCodes.F6) && checkModifierKeys(event, false, false, true))
218
+ || ((event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_Up) && checkModifierKeys(event, true, true, false));
219
+
220
+ const isF7 = event => (event.key ? event.key === "F7" : event.keyCode === KeyCodes.F7) && !hasModifierKeys(event);
221
+
144
222
  const isShowByArrows = event => {
145
223
  return ((event.key === "ArrowDown" || event.key === "Down") || (event.key === "ArrowUp" || event.key === "Up")) && checkModifierKeys(event, /* Ctrl */ false, /* Alt */ true, /* Shift */ false);
146
224
  };
147
225
 
226
+ const isShift = event => event.key === "Shift" || event.keyCode === KeyCodes.SHIFT;
227
+
228
+ const isCtrlA = event => ((event.key === "A" || event.key === "a") || event.which === KeyCodes.A) && checkModifierKeys(event, true, false, false);
229
+
230
+ const isCtrlV = event => ((event.key === "V" || event.key === "v") || event.which === KeyCodes.V) && checkModifierKeys(event, true, false, false);
231
+
148
232
  const hasModifierKeys = event => event.shiftKey || event.altKey || getCtrlKey(event);
149
233
 
150
234
  const getCtrlKey = event => !!(event.metaKey || event.ctrlKey); // double negation doesn't have effect on boolean but ensures null and undefined are equivalent to false.
@@ -153,13 +237,36 @@ const checkModifierKeys = (event, bCtrlKey, bAltKey, bShiftKey) => event.shiftKe
153
237
 
154
238
  export {
155
239
  isEnter,
240
+ isEnterShift,
156
241
  isSpace,
242
+ isSpaceShift,
243
+ isSpaceCtrl,
157
244
  isLeft,
158
245
  isRight,
159
246
  isUp,
160
247
  isDown,
248
+ isLeftCtrl,
249
+ isRightCtrl,
250
+ isUpCtrl,
251
+ isDownCtrl,
252
+ isUpShift,
253
+ isDownShift,
254
+ isUpAlt,
255
+ isDownAlt,
256
+ isLeftShift,
257
+ isRightShift,
258
+ isLeftShiftCtrl,
259
+ isRightShiftCtrl,
260
+ isUpShiftCtrl,
261
+ isDownShiftCtrl,
161
262
  isHome,
162
263
  isEnd,
264
+ isPlus,
265
+ isMinus,
266
+ isHomeCtrl,
267
+ isEndCtrl,
268
+ isHomeShift,
269
+ isEndShift,
163
270
  isEscape,
164
271
  isTabNext,
165
272
  isTabPrevious,
@@ -167,4 +274,22 @@ export {
167
274
  isDelete,
168
275
  isShow,
169
276
  isF4,
277
+ isF4Shift,
278
+ isF6Previous,
279
+ isF6Next,
280
+ isF7,
281
+ isPageUp,
282
+ isPageDown,
283
+ isPageUpShift,
284
+ isPageUpAlt,
285
+ isPageDownShift,
286
+ isPageDownAlt,
287
+ isPageUpShiftCtrl,
288
+ isPageDownShiftCtrl,
289
+ isShift,
290
+ isCtrlA,
291
+ isCtrlV,
292
+ isDeleteShift,
293
+ isInsertShift,
294
+ isInsertCtrl,
170
295
  };
@@ -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;