@ui5/webcomponents-base 0.0.0-306572ffa → 0.0.0-3236d56be

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 (342) hide show
  1. package/.eslintignore +3 -0
  2. package/CHANGELOG.md +308 -0
  3. package/README.md +26 -2
  4. package/bundle.esm.js +13 -11
  5. package/dist/AssetRegistry.js +8 -7
  6. package/dist/Boot.js +59 -0
  7. package/dist/CSP.js +59 -0
  8. package/dist/CustomElementsRegistry.js +60 -4
  9. package/dist/CustomElementsScope.js +20 -98
  10. package/dist/CustomElementsScopeUtils.js +108 -0
  11. package/dist/DOMObserver.js +65 -0
  12. package/dist/Device.js +71 -773
  13. package/dist/EventProvider.js +30 -26
  14. package/dist/FeaturesRegistry.js +4 -1
  15. package/dist/FontFace.js +19 -62
  16. package/dist/InitialConfiguration.js +43 -8
  17. package/dist/Keys.js +107 -0
  18. package/dist/ManagedStyles.js +83 -0
  19. package/dist/MediaRange.js +109 -0
  20. package/{src/util/parseProperties.js → dist/PropertiesFileFormat.js} +6 -0
  21. package/dist/Render.js +175 -0
  22. package/dist/RenderScheduler.js +16 -138
  23. package/dist/Runtimes.js +107 -0
  24. package/dist/StaticArea.js +1 -29
  25. package/dist/StaticAreaItem.js +58 -65
  26. package/dist/SystemCSSVars.js +4 -25
  27. package/dist/Theming.js +2 -1
  28. package/dist/UI5Element.js +319 -364
  29. package/dist/UI5ElementMetadata.js +132 -17
  30. package/dist/asset-registries/Icons.js +117 -13
  31. package/dist/asset-registries/Illustrations.js +30 -0
  32. package/dist/asset-registries/LocaleData.js +105 -66
  33. package/dist/asset-registries/Themes.js +23 -32
  34. package/dist/asset-registries/i18n.js +62 -48
  35. package/dist/assets-meta/IconCollectionsAlias.js +18 -0
  36. package/dist/config/Icons.js +52 -0
  37. package/dist/config/Language.js +33 -6
  38. package/dist/config/Theme.js +25 -0
  39. package/dist/css/BusyIndicator.css +76 -0
  40. package/dist/css/FontFace.css +75 -0
  41. package/dist/css/OverrideFontFace.css +32 -0
  42. package/dist/css/SystemCSSVars.css +17 -0
  43. package/dist/delegate/ItemNavigation.js +239 -170
  44. package/dist/delegate/ResizeHandler.js +78 -37
  45. package/dist/delegate/ScrollEnablement.js +49 -20
  46. package/dist/features/F6Navigation.js +108 -0
  47. package/dist/features/OpenUI5Enablement.js +119 -0
  48. package/dist/features/OpenUI5Support.js +41 -6
  49. package/dist/generated/AssetParameters.js +1 -1
  50. package/dist/generated/VersionInfo.js +10 -0
  51. package/dist/generated/css/BusyIndicator.css.js +5 -0
  52. package/dist/generated/css/FontFace.css.js +5 -0
  53. package/dist/generated/css/OverrideFontFace.css.js +5 -0
  54. package/dist/generated/css/SystemCSSVars.css.js +5 -0
  55. package/dist/i18nBundle.js +38 -4
  56. package/dist/isLegacyBrowser.js +3 -0
  57. package/dist/locale/applyDirection.js +6 -4
  58. package/dist/locale/directionChange.js +32 -0
  59. package/dist/locale/getEffectiveDir.js +28 -0
  60. package/dist/locale/getLocale.js +12 -2
  61. package/dist/locale/languageChange.js +1 -1
  62. package/dist/renderer/LitRenderer.js +39 -18
  63. package/dist/renderer/directives/style-map.js +72 -0
  64. package/dist/renderer/executeTemplate.js +19 -2
  65. package/dist/resources/bundle.esm.js +15 -112
  66. package/dist/resources/bundle.esm.js.map +1 -1
  67. package/dist/sap/base/Log.js +241 -0
  68. package/dist/sap/base/assert.js +8 -0
  69. package/dist/sap/base/security/URLListValidator.js +148 -0
  70. package/dist/sap/base/security/encodeCSS.js +14 -0
  71. package/dist/sap/base/security/encodeXML.js +23 -0
  72. package/dist/sap/base/security/sanitizeHTML.js +16 -0
  73. package/dist/sap/base/strings/toHex.js +8 -0
  74. package/dist/sap/base/util/now.js +7 -0
  75. package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
  76. package/dist/test-resources/assets/Themes.js +8 -8
  77. package/dist/test-resources/elements/Parent.js +6 -2
  78. package/dist/test-resources/elements/WithStaticArea.js +2 -1
  79. package/dist/test-resources/pages/AllTestElements.html +3 -3
  80. package/dist/test-resources/pages/Configuration.html +0 -2
  81. package/dist/test-resources/pages/ConfigurationScript.html +0 -2
  82. package/dist/test-resources/pages/i18n.html +2 -9
  83. package/dist/test-resources/specs/ConfigurationChange.spec.js +10 -8
  84. package/dist/test-resources/specs/ConfigurationScript.spec.js +25 -23
  85. package/dist/test-resources/specs/ConfigurationURL.spec.js +65 -17
  86. package/dist/test-resources/specs/CustomTheme.spec.js +9 -7
  87. package/dist/test-resources/specs/EventProvider.spec.js +63 -0
  88. package/dist/test-resources/specs/StaticArea.spec.js +56 -12
  89. package/dist/test-resources/specs/Theming.spec.js +12 -10
  90. package/dist/test-resources/specs/UI5ElementInvalidation.js +54 -70
  91. package/dist/test-resources/specs/UI5ElementLifecycle.js +17 -15
  92. package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +25 -51
  93. package/dist/test-resources/specs/UI5ElementMetadataExt.js +9 -7
  94. package/dist/test-resources/specs/UI5ElementPropertyValidation.js +7 -5
  95. package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +37 -35
  96. package/dist/test-resources/specs/UI5ElementShadowDOM.js +10 -8
  97. package/dist/test-resources/specs/UI5ElementSlots.js +10 -8
  98. package/dist/theming/CustomStyle.js +25 -5
  99. package/dist/theming/ThemeLoaded.js +22 -0
  100. package/dist/theming/applyTheme.js +13 -15
  101. package/dist/theming/getConstructableStyle.js +7 -6
  102. package/dist/theming/getEffectiveLinksHrefs.js +27 -0
  103. package/dist/theming/getEffectiveStyle.js +24 -8
  104. package/dist/theming/getStylesString.js +4 -2
  105. package/dist/theming/getThemeDesignerTheme.js +25 -5
  106. package/dist/theming/preloadLinks.js +23 -0
  107. package/dist/types/CSSColor.js +9 -0
  108. package/dist/types/CalendarType.js +1 -1
  109. package/dist/types/DataType.js +13 -1
  110. package/dist/types/Float.js +4 -0
  111. package/dist/types/Integer.js +4 -0
  112. package/dist/types/InvisibleMessageMode.js +30 -0
  113. package/dist/types/ItemNavigationBehavior.js +2 -7
  114. package/dist/types/PopupState.js +1 -1
  115. package/dist/types/ValueState.js +1 -1
  116. package/dist/updateShadowRoot.js +30 -0
  117. package/dist/util/AriaLabelHelper.js +41 -0
  118. package/dist/util/Caret.js +45 -0
  119. package/dist/util/ColorConversion.js +370 -0
  120. package/dist/util/FocusableElements.js +22 -9
  121. package/dist/util/HTMLSanitizer.js +7 -0
  122. package/dist/util/InvisibleMessage.js +60 -0
  123. package/dist/util/PopupUtils.js +93 -0
  124. package/dist/util/SlotsHelper.js +43 -0
  125. package/dist/util/TabbableElements.js +5 -1
  126. package/dist/util/arraysAreEqual.js +15 -0
  127. package/dist/util/clamp.js +12 -0
  128. package/dist/util/createLinkInHead.js +19 -0
  129. package/dist/util/debounce.js +17 -0
  130. package/dist/util/escapeRegex.js +10 -0
  131. package/dist/util/generateHighlightedMarkup.js +42 -0
  132. package/dist/util/getActiveElement.js +11 -0
  133. package/dist/util/getClassCopy.js +10 -0
  134. package/dist/util/getEffectiveContentDensity.js +5 -0
  135. package/dist/util/getNormalizedTarget.js +16 -0
  136. package/dist/util/isElementInView.js +15 -0
  137. package/dist/util/isNodeHidden.js +1 -1
  138. package/dist/util/isNodeTabbable.js +4 -4
  139. package/dist/util/isValidPropertyName.js +4 -2
  140. package/index.js +1 -1
  141. package/lib/generate-asset-parameters/index.js +8 -5
  142. package/lib/generate-styles/index.js +26 -0
  143. package/lib/generate-version-info/index.js +32 -0
  144. package/package-scripts.js +30 -19
  145. package/package.json +19 -13
  146. package/src/AssetRegistry.js +8 -7
  147. package/src/Boot.js +59 -0
  148. package/src/CSP.js +59 -0
  149. package/src/CustomElementsRegistry.js +60 -4
  150. package/src/CustomElementsScope.js +20 -98
  151. package/src/CustomElementsScopeUtils.js +108 -0
  152. package/src/DOMObserver.js +65 -0
  153. package/src/Device.js +71 -773
  154. package/src/EventProvider.js +30 -26
  155. package/src/FeaturesRegistry.js +4 -1
  156. package/src/FontFace.js +19 -62
  157. package/src/InitialConfiguration.js +43 -8
  158. package/src/Keys.js +107 -0
  159. package/src/ManagedStyles.js +83 -0
  160. package/src/MediaRange.js +109 -0
  161. package/{dist/util/parseProperties.js → src/PropertiesFileFormat.js} +6 -0
  162. package/src/Render.js +175 -0
  163. package/src/RenderScheduler.js +16 -138
  164. package/src/Runtimes.js +107 -0
  165. package/src/StaticArea.js +1 -29
  166. package/src/StaticAreaItem.js +58 -65
  167. package/src/SystemCSSVars.js +4 -25
  168. package/src/Theming.js +2 -1
  169. package/src/UI5Element.js +319 -364
  170. package/src/UI5ElementMetadata.js +132 -17
  171. package/src/asset-registries/Icons.js +117 -13
  172. package/src/asset-registries/Illustrations.js +30 -0
  173. package/src/asset-registries/LocaleData.js +105 -66
  174. package/src/asset-registries/Themes.js +23 -32
  175. package/src/asset-registries/i18n.js +62 -48
  176. package/src/assets-meta/IconCollectionsAlias.js +18 -0
  177. package/src/config/Icons.js +52 -0
  178. package/src/config/Language.js +33 -6
  179. package/src/config/Theme.js +25 -0
  180. package/src/css/BusyIndicator.css +76 -0
  181. package/src/css/FontFace.css +75 -0
  182. package/src/css/OverrideFontFace.css +32 -0
  183. package/src/css/SystemCSSVars.css +17 -0
  184. package/src/delegate/ItemNavigation.js +239 -170
  185. package/src/delegate/ResizeHandler.js +78 -37
  186. package/src/delegate/ScrollEnablement.js +49 -20
  187. package/src/features/F6Navigation.js +108 -0
  188. package/src/features/OpenUI5Enablement.js +119 -0
  189. package/src/features/OpenUI5Support.js +41 -6
  190. package/src/i18nBundle.js +38 -4
  191. package/src/isLegacyBrowser.js +3 -0
  192. package/src/locale/applyDirection.js +6 -4
  193. package/src/locale/directionChange.js +32 -0
  194. package/src/locale/getEffectiveDir.js +28 -0
  195. package/src/locale/getLocale.js +12 -2
  196. package/src/locale/languageChange.js +1 -1
  197. package/src/renderer/LitRenderer.js +39 -18
  198. package/src/renderer/directives/style-map.js +72 -0
  199. package/src/renderer/executeTemplate.js +19 -2
  200. package/src/theming/CustomStyle.js +25 -5
  201. package/src/theming/ThemeLoaded.js +22 -0
  202. package/src/theming/applyTheme.js +13 -15
  203. package/src/theming/getConstructableStyle.js +7 -6
  204. package/src/theming/getEffectiveLinksHrefs.js +27 -0
  205. package/src/theming/getEffectiveStyle.js +24 -8
  206. package/src/theming/getStylesString.js +4 -2
  207. package/src/theming/getThemeDesignerTheme.js +25 -5
  208. package/src/theming/preloadLinks.js +23 -0
  209. package/src/types/CSSColor.js +9 -0
  210. package/src/types/CalendarType.js +1 -1
  211. package/src/types/DataType.js +13 -1
  212. package/src/types/Float.js +4 -0
  213. package/src/types/Integer.js +4 -0
  214. package/src/types/InvisibleMessageMode.js +30 -0
  215. package/src/types/ItemNavigationBehavior.js +2 -7
  216. package/src/types/PopupState.js +1 -1
  217. package/src/types/ValueState.js +1 -1
  218. package/src/updateShadowRoot.js +30 -0
  219. package/src/util/AriaLabelHelper.js +41 -0
  220. package/src/util/Caret.js +45 -0
  221. package/src/util/ColorConversion.js +370 -0
  222. package/src/util/FocusableElements.js +22 -9
  223. package/src/util/HTMLSanitizer.js +7 -0
  224. package/src/util/InvisibleMessage.js +60 -0
  225. package/src/util/PopupUtils.js +93 -0
  226. package/src/util/SlotsHelper.js +43 -0
  227. package/src/util/TabbableElements.js +5 -1
  228. package/src/util/arraysAreEqual.js +15 -0
  229. package/src/util/clamp.js +12 -0
  230. package/src/util/createLinkInHead.js +19 -0
  231. package/src/util/debounce.js +17 -0
  232. package/src/util/escapeRegex.js +10 -0
  233. package/src/util/generateHighlightedMarkup.js +42 -0
  234. package/src/util/getActiveElement.js +11 -0
  235. package/src/util/getClassCopy.js +10 -0
  236. package/src/util/getEffectiveContentDensity.js +5 -0
  237. package/src/util/getNormalizedTarget.js +16 -0
  238. package/src/util/isElementInView.js +15 -0
  239. package/src/util/isNodeHidden.js +1 -1
  240. package/src/util/isNodeTabbable.js +4 -4
  241. package/src/util/isValidPropertyName.js +4 -2
  242. package/used-modules.txt +10 -0
  243. package/bundle.es5.js +0 -28
  244. package/dist/SVGIconRegistry.js +0 -62
  245. package/dist/boot.js +0 -34
  246. package/dist/compatibility/DOMObserver.js +0 -62
  247. package/dist/compatibility/patchNodeValue.js +0 -24
  248. package/dist/compatibility/whenPolyfillLoaded.js +0 -26
  249. package/dist/delegate/CustomResize.js +0 -78
  250. package/dist/delegate/NativeResize.js +0 -44
  251. package/dist/features/PropertiesFormatSupport.js +0 -8
  252. package/dist/features/browsersupport/Edge.js +0 -6
  253. package/dist/features/browsersupport/IE11.js +0 -41
  254. package/dist/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
  255. package/dist/renderer/ifDefined.js +0 -21
  256. package/dist/renderer/scopeHTML.js +0 -32
  257. package/dist/resources/bundle.es5.js +0 -212
  258. package/dist/resources/bundle.es5.js.map +0 -1
  259. package/dist/theming/CSSVarsPonyfill.js +0 -24
  260. package/dist/theming/adaptCSSForIE.js +0 -95
  261. package/dist/theming/createComponentStyleTag.js +0 -55
  262. package/dist/theming/createThemePropertiesStyleTag.js +0 -20
  263. package/dist/thirdparty/Array.from.js +0 -16
  264. package/dist/thirdparty/Array.prototype.fill.js +0 -44
  265. package/dist/thirdparty/Array.prototype.find.js +0 -46
  266. package/dist/thirdparty/Array.prototype.includes.js +0 -51
  267. package/dist/thirdparty/Element.prototype.closest.js +0 -11
  268. package/dist/thirdparty/Element.prototype.matches.js +0 -6
  269. package/dist/thirdparty/Map.prototype.keys.js +0 -9
  270. package/dist/thirdparty/Number.isInteger.js +0 -5
  271. package/dist/thirdparty/Number.isNaN.js +0 -1
  272. package/dist/thirdparty/Number.parseInt.js +0 -1
  273. package/dist/thirdparty/Object.assign.js +0 -31
  274. package/dist/thirdparty/Object.entries.js +0 -11
  275. package/dist/thirdparty/Symbol.js +0 -2
  276. package/dist/thirdparty/WeakSet.js +0 -27
  277. package/dist/thirdparty/es6-string-methods.js +0 -182
  278. package/dist/thirdparty/events-polyfills.js +0 -89
  279. package/dist/thirdparty/fetch.js +0 -1
  280. package/dist/thirdparty/template.js +0 -600
  281. package/dist/thirdparty/webcomponents-sd-ce-pf.js +0 -318
  282. package/dist/util/getEffectiveAriaLabelText.js +0 -28
  283. package/dist/util/isSlot.js +0 -3
  284. package/dist/webcomponentsjs/LICENSE.md +0 -19
  285. package/dist/webcomponentsjs/README.md +0 -229
  286. package/dist/webcomponentsjs/bundles/webcomponents-ce.js +0 -63
  287. package/dist/webcomponentsjs/bundles/webcomponents-ce.js.map +0 -1
  288. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +0 -297
  289. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +0 -1
  290. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js +0 -208
  291. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +0 -1
  292. package/dist/webcomponentsjs/bundles/webcomponents-sd.js +0 -166
  293. package/dist/webcomponentsjs/bundles/webcomponents-sd.js.map +0 -1
  294. package/dist/webcomponentsjs/custom-elements-es5-adapter.js +0 -15
  295. package/dist/webcomponentsjs/package.json +0 -46
  296. package/dist/webcomponentsjs/src/entrypoints/custom-elements-es5-adapter-index.js +0 -16
  297. package/dist/webcomponentsjs/src/entrypoints/webcomponents-bundle-index.js +0 -53
  298. package/dist/webcomponentsjs/src/entrypoints/webcomponents-ce-index.js +0 -17
  299. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-index.js +0 -19
  300. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-pf-index.js +0 -28
  301. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-index.js +0 -18
  302. package/dist/webcomponentsjs/webcomponents-bundle.js +0 -298
  303. package/dist/webcomponentsjs/webcomponents-bundle.js.map +0 -1
  304. package/dist/webcomponentsjs/webcomponents-loader.js +0 -185
  305. package/src/SVGIconRegistry.js +0 -62
  306. package/src/boot.js +0 -34
  307. package/src/compatibility/DOMObserver.js +0 -62
  308. package/src/compatibility/patchNodeValue.js +0 -24
  309. package/src/compatibility/whenPolyfillLoaded.js +0 -26
  310. package/src/delegate/CustomResize.js +0 -78
  311. package/src/delegate/NativeResize.js +0 -44
  312. package/src/features/PropertiesFormatSupport.js +0 -8
  313. package/src/features/browsersupport/Edge.js +0 -6
  314. package/src/features/browsersupport/IE11.js +0 -41
  315. package/src/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
  316. package/src/renderer/ifDefined.js +0 -21
  317. package/src/renderer/scopeHTML.js +0 -32
  318. package/src/theming/CSSVarsPonyfill.js +0 -24
  319. package/src/theming/adaptCSSForIE.js +0 -95
  320. package/src/theming/createComponentStyleTag.js +0 -55
  321. package/src/theming/createThemePropertiesStyleTag.js +0 -20
  322. package/src/thirdparty/Array.from.js +0 -16
  323. package/src/thirdparty/Array.prototype.fill.js +0 -44
  324. package/src/thirdparty/Array.prototype.find.js +0 -46
  325. package/src/thirdparty/Array.prototype.includes.js +0 -51
  326. package/src/thirdparty/Element.prototype.closest.js +0 -11
  327. package/src/thirdparty/Element.prototype.matches.js +0 -6
  328. package/src/thirdparty/Map.prototype.keys.js +0 -9
  329. package/src/thirdparty/Number.isInteger.js +0 -5
  330. package/src/thirdparty/Number.isNaN.js +0 -1
  331. package/src/thirdparty/Number.parseInt.js +0 -1
  332. package/src/thirdparty/Object.assign.js +0 -31
  333. package/src/thirdparty/Object.entries.js +0 -11
  334. package/src/thirdparty/Symbol.js +0 -2
  335. package/src/thirdparty/WeakSet.js +0 -27
  336. package/src/thirdparty/es6-string-methods.js +0 -182
  337. package/src/thirdparty/events-polyfills.js +0 -89
  338. package/src/thirdparty/fetch.js +0 -1
  339. package/src/thirdparty/template.js +0 -600
  340. package/src/thirdparty/webcomponents-sd-ce-pf.js +0 -318
  341. package/src/util/getEffectiveAriaLabelText.js +0 -28
  342. 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,18 +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
+
132
180
  const isPageUp = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && !hasModifierKeys(event);
133
181
 
134
182
  const isPageDown = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && !hasModifierKeys(event);
135
183
 
136
184
  const isPageUpShift = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, false, false, true);
137
185
 
186
+ const isPageUpAlt = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, false, true, false);
187
+
138
188
  const isPageDownShift = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, false, false, true);
139
189
 
190
+ const isPageDownAlt = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, false, true, false);
191
+
140
192
  const isPageUpShiftCtrl = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, true, false, true);
141
193
 
142
194
  const isPageDownShiftCtrl = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, true, false, true);
143
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
+
144
200
  const isShow = event => {
145
201
  if (event.key) {
146
202
  return isF4(event) || isShowByArrows(event);
@@ -153,10 +209,26 @@ const isF4 = event => {
153
209
  return event.key === "F4" && !hasModifierKeys(event);
154
210
  };
155
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
+
156
222
  const isShowByArrows = event => {
157
223
  return ((event.key === "ArrowDown" || event.key === "Down") || (event.key === "ArrowUp" || event.key === "Up")) && checkModifierKeys(event, /* Ctrl */ false, /* Alt */ true, /* Shift */ false);
158
224
  };
159
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
+
160
232
  const hasModifierKeys = event => event.shiftKey || event.altKey || getCtrlKey(event);
161
233
 
162
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.
@@ -165,13 +237,36 @@ const checkModifierKeys = (event, bCtrlKey, bAltKey, bShiftKey) => event.shiftKe
165
237
 
166
238
  export {
167
239
  isEnter,
240
+ isEnterShift,
168
241
  isSpace,
242
+ isSpaceShift,
243
+ isSpaceCtrl,
169
244
  isLeft,
170
245
  isRight,
171
246
  isUp,
172
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,
173
262
  isHome,
174
263
  isEnd,
264
+ isPlus,
265
+ isMinus,
266
+ isHomeCtrl,
267
+ isEndCtrl,
268
+ isHomeShift,
269
+ isEndShift,
175
270
  isEscape,
176
271
  isTabNext,
177
272
  isTabPrevious,
@@ -179,10 +274,22 @@ export {
179
274
  isDelete,
180
275
  isShow,
181
276
  isF4,
277
+ isF4Shift,
278
+ isF6Previous,
279
+ isF6Next,
280
+ isF7,
182
281
  isPageUp,
183
282
  isPageDown,
184
283
  isPageUpShift,
284
+ isPageUpAlt,
185
285
  isPageDownShift,
286
+ isPageDownAlt,
186
287
  isPageUpShiftCtrl,
187
288
  isPageDownShiftCtrl,
289
+ isShift,
290
+ isCtrlA,
291
+ isCtrlV,
292
+ isDeleteShift,
293
+ isInsertShift,
294
+ isInsertCtrl,
188
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;