@ui5/webcomponents-base 0.0.0-b4cbc43ba → 0.0.0-b93c2a321

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 (212) hide show
  1. package/.eslintignore +3 -0
  2. package/CHANGELOG.md +214 -0
  3. package/README.md +26 -2
  4. package/bundle.esm.js +10 -7
  5. package/dist/AssetRegistry.js +8 -9
  6. package/dist/Boot.js +17 -6
  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 +6 -2
  12. package/dist/Device.js +69 -776
  13. package/dist/EventProvider.js +19 -25
  14. package/dist/FeaturesRegistry.js +4 -1
  15. package/dist/FontFace.js +7 -95
  16. package/dist/InitialConfiguration.js +37 -21
  17. package/dist/Keys.js +74 -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 +3 -2
  22. package/dist/Runtimes.js +107 -0
  23. package/dist/StaticArea.js +3 -0
  24. package/dist/StaticAreaItem.js +31 -10
  25. package/dist/SystemCSSVars.js +4 -25
  26. package/dist/UI5Element.js +66 -65
  27. package/dist/UI5ElementMetadata.js +18 -2
  28. package/dist/asset-registries/Icons.js +117 -14
  29. package/dist/asset-registries/Illustrations.js +30 -0
  30. package/dist/asset-registries/LocaleData.js +97 -68
  31. package/dist/asset-registries/Themes.js +23 -33
  32. package/dist/asset-registries/i18n.js +61 -50
  33. package/dist/assets-meta/IconCollectionsAlias.js +18 -0
  34. package/dist/config/Icons.js +52 -0
  35. package/dist/config/Language.js +15 -15
  36. package/dist/config/Theme.js +25 -0
  37. package/dist/css/BusyIndicator.css +76 -0
  38. package/dist/css/FontFace.css +75 -0
  39. package/dist/css/OverrideFontFace.css +32 -0
  40. package/dist/css/SystemCSSVars.css +17 -0
  41. package/dist/delegate/ItemNavigation.js +163 -105
  42. package/dist/delegate/ScrollEnablement.js +25 -19
  43. package/dist/features/F6Navigation.js +108 -0
  44. package/dist/features/OpenUI5Enablement.js +119 -0
  45. package/dist/features/OpenUI5Support.js +41 -6
  46. package/dist/generated/AssetParameters.js +1 -1
  47. package/dist/generated/VersionInfo.js +10 -0
  48. package/dist/generated/css/BusyIndicator.css.js +5 -0
  49. package/dist/generated/css/FontFace.css.js +5 -0
  50. package/dist/generated/css/OverrideFontFace.css.js +5 -0
  51. package/dist/generated/css/SystemCSSVars.css.js +5 -0
  52. package/dist/i18nBundle.js +38 -4
  53. package/dist/renderer/LitRenderer.js +39 -18
  54. package/dist/renderer/directives/style-map.js +72 -0
  55. package/dist/renderer/executeTemplate.js +19 -2
  56. package/dist/resources/bundle.esm.js +15 -104
  57. package/dist/resources/bundle.esm.js.map +1 -1
  58. package/dist/sap/base/Log.js +241 -0
  59. package/dist/sap/base/assert.js +8 -0
  60. package/dist/sap/base/security/URLListValidator.js +148 -0
  61. package/dist/sap/base/security/encodeCSS.js +14 -0
  62. package/dist/sap/base/security/encodeXML.js +23 -0
  63. package/dist/sap/base/security/sanitizeHTML.js +16 -0
  64. package/dist/sap/base/strings/toHex.js +8 -0
  65. package/dist/sap/base/util/now.js +7 -0
  66. package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
  67. package/dist/test-resources/assets/Themes.js +8 -8
  68. package/dist/test-resources/elements/WithStaticArea.js +2 -1
  69. package/dist/test-resources/pages/AllTestElements.html +3 -0
  70. package/dist/test-resources/pages/i18n.html +2 -9
  71. package/dist/test-resources/specs/ConfigurationChange.spec.js +10 -8
  72. package/dist/test-resources/specs/ConfigurationScript.spec.js +25 -23
  73. package/dist/test-resources/specs/ConfigurationURL.spec.js +65 -17
  74. package/dist/test-resources/specs/CustomTheme.spec.js +9 -7
  75. package/dist/test-resources/specs/EventProvider.spec.js +63 -0
  76. package/dist/test-resources/specs/StaticArea.spec.js +56 -12
  77. package/dist/test-resources/specs/Theming.spec.js +12 -10
  78. package/dist/test-resources/specs/UI5ElementInvalidation.js +30 -28
  79. package/dist/test-resources/specs/UI5ElementLifecycle.js +12 -10
  80. package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +12 -10
  81. package/dist/test-resources/specs/UI5ElementMetadataExt.js +9 -7
  82. package/dist/test-resources/specs/UI5ElementPropertyValidation.js +7 -5
  83. package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +37 -35
  84. package/dist/test-resources/specs/UI5ElementShadowDOM.js +10 -8
  85. package/dist/test-resources/specs/UI5ElementSlots.js +10 -8
  86. package/dist/theming/CustomStyle.js +23 -3
  87. package/dist/theming/applyTheme.js +11 -10
  88. package/dist/theming/getEffectiveLinksHrefs.js +27 -0
  89. package/dist/theming/getEffectiveStyle.js +9 -0
  90. package/dist/theming/getStylesString.js +4 -2
  91. package/dist/theming/getThemeDesignerTheme.js +25 -5
  92. package/dist/theming/preloadLinks.js +23 -0
  93. package/dist/types/CSSColor.js +9 -0
  94. package/dist/types/DataType.js +12 -0
  95. package/dist/types/Float.js +4 -0
  96. package/dist/types/Integer.js +4 -0
  97. package/dist/types/InvisibleMessageMode.js +30 -0
  98. package/dist/updateShadowRoot.js +8 -4
  99. package/dist/util/AriaLabelHelper.js +4 -4
  100. package/dist/util/ColorConversion.js +370 -0
  101. package/dist/util/FocusableElements.js +13 -7
  102. package/dist/util/HTMLSanitizer.js +7 -0
  103. package/dist/util/InvisibleMessage.js +60 -0
  104. package/dist/util/PopupUtils.js +93 -0
  105. package/dist/util/TabbableElements.js +5 -1
  106. package/dist/util/clamp.js +12 -0
  107. package/dist/util/createLinkInHead.js +19 -0
  108. package/dist/util/escapeRegex.js +10 -0
  109. package/dist/util/generateHighlightedMarkup.js +42 -0
  110. package/dist/util/getClassCopy.js +10 -0
  111. package/dist/util/getNormalizedTarget.js +16 -0
  112. package/dist/util/isElementInView.js +15 -0
  113. package/dist/util/isNodeHidden.js +1 -1
  114. package/dist/util/isNodeTabbable.js +4 -4
  115. package/hash.txt +1 -0
  116. package/index.js +1 -1
  117. package/lib/generate-asset-parameters/index.js +0 -1
  118. package/lib/generate-styles/index.js +18 -0
  119. package/lib/generate-version-info/index.js +27 -0
  120. package/package-scripts.js +31 -15
  121. package/package.json +19 -10
  122. package/src/AssetRegistry.js +8 -9
  123. package/src/Boot.js +17 -6
  124. package/src/CSP.js +59 -0
  125. package/src/CustomElementsRegistry.js +60 -4
  126. package/src/CustomElementsScope.js +20 -98
  127. package/src/CustomElementsScopeUtils.js +108 -0
  128. package/src/DOMObserver.js +6 -2
  129. package/src/Device.js +69 -776
  130. package/src/EventProvider.js +19 -25
  131. package/src/FeaturesRegistry.js +4 -1
  132. package/src/FontFace.js +7 -95
  133. package/src/InitialConfiguration.js +37 -21
  134. package/src/Keys.js +74 -0
  135. package/src/ManagedStyles.js +83 -0
  136. package/src/MediaRange.js +109 -0
  137. package/src/{util/parseProperties.js → PropertiesFileFormat.js} +6 -0
  138. package/src/Render.js +3 -2
  139. package/src/Runtimes.js +107 -0
  140. package/src/StaticArea.js +3 -0
  141. package/src/StaticAreaItem.js +31 -10
  142. package/src/SystemCSSVars.js +4 -25
  143. package/src/UI5Element.js +66 -65
  144. package/src/UI5ElementMetadata.js +18 -2
  145. package/src/asset-registries/Icons.js +117 -14
  146. package/src/asset-registries/Illustrations.js +30 -0
  147. package/src/asset-registries/LocaleData.js +97 -68
  148. package/src/asset-registries/Themes.js +23 -33
  149. package/src/asset-registries/i18n.js +61 -50
  150. package/src/assets-meta/IconCollectionsAlias.js +18 -0
  151. package/src/config/Icons.js +52 -0
  152. package/src/config/Language.js +15 -15
  153. package/src/config/Theme.js +25 -0
  154. package/src/css/BusyIndicator.css +76 -0
  155. package/src/css/FontFace.css +75 -0
  156. package/src/css/OverrideFontFace.css +32 -0
  157. package/src/css/SystemCSSVars.css +17 -0
  158. package/src/delegate/ItemNavigation.js +163 -105
  159. package/src/delegate/ScrollEnablement.js +25 -19
  160. package/src/features/F6Navigation.js +108 -0
  161. package/src/features/OpenUI5Enablement.js +119 -0
  162. package/src/features/OpenUI5Support.js +41 -6
  163. package/src/i18nBundle.js +38 -4
  164. package/src/renderer/LitRenderer.js +39 -18
  165. package/src/renderer/directives/style-map.js +72 -0
  166. package/src/renderer/executeTemplate.js +19 -2
  167. package/src/theming/CustomStyle.js +23 -3
  168. package/src/theming/applyTheme.js +11 -10
  169. package/src/theming/getEffectiveLinksHrefs.js +27 -0
  170. package/src/theming/getEffectiveStyle.js +9 -0
  171. package/src/theming/getStylesString.js +4 -2
  172. package/src/theming/getThemeDesignerTheme.js +25 -5
  173. package/src/theming/preloadLinks.js +23 -0
  174. package/src/types/CSSColor.js +9 -0
  175. package/src/types/DataType.js +12 -0
  176. package/src/types/Float.js +4 -0
  177. package/src/types/Integer.js +4 -0
  178. package/src/types/InvisibleMessageMode.js +30 -0
  179. package/src/updateShadowRoot.js +8 -4
  180. package/src/util/AriaLabelHelper.js +4 -4
  181. package/src/util/ColorConversion.js +370 -0
  182. package/src/util/FocusableElements.js +13 -7
  183. package/src/util/HTMLSanitizer.js +7 -0
  184. package/src/util/InvisibleMessage.js +60 -0
  185. package/src/util/PopupUtils.js +93 -0
  186. package/src/util/TabbableElements.js +5 -1
  187. package/src/util/clamp.js +12 -0
  188. package/src/util/createLinkInHead.js +19 -0
  189. package/src/util/escapeRegex.js +10 -0
  190. package/src/util/generateHighlightedMarkup.js +42 -0
  191. package/src/util/getClassCopy.js +10 -0
  192. package/src/util/getNormalizedTarget.js +16 -0
  193. package/src/util/isElementInView.js +15 -0
  194. package/src/util/isNodeHidden.js +1 -1
  195. package/src/util/isNodeTabbable.js +4 -4
  196. package/used-modules.txt +10 -0
  197. package/dist/SVGIconRegistry.js +0 -73
  198. package/dist/config/AssetsPath.js +0 -17
  199. package/dist/features/PropertiesFormatSupport.js +0 -8
  200. package/dist/renderer/ifDefined.js +0 -21
  201. package/dist/renderer/scopeHTML.js +0 -32
  202. package/dist/theming/createThemePropertiesStyleTag.js +0 -20
  203. package/dist/util/EffectiveAssetPath.js +0 -27
  204. package/dist/util/encodeCSS.js +0 -24
  205. package/src/SVGIconRegistry.js +0 -73
  206. package/src/config/AssetsPath.js +0 -17
  207. package/src/features/PropertiesFormatSupport.js +0 -8
  208. package/src/renderer/ifDefined.js +0 -21
  209. package/src/renderer/scopeHTML.js +0 -32
  210. package/src/theming/createThemePropertiesStyleTag.js +0 -20
  211. package/src/util/EffectiveAssetPath.js +0 -27
  212. package/src/util/encodeCSS.js +0 -24
@@ -1,36 +1,37 @@
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
 
@@ -43,14 +44,14 @@ class EventProvider {
43
44
  */
44
45
  fireEvent(eventName, data) {
45
46
  const eventRegistry = this._eventRegistry;
46
- const eventListeners = eventRegistry[eventName];
47
+ const eventListeners = eventRegistry.get(eventName);
47
48
 
48
49
  if (!eventListeners) {
49
50
  return [];
50
51
  }
51
52
 
52
- return eventListeners.map(event => {
53
- return event["function"].call(this, data); // eslint-disable-line
53
+ return eventListeners.map(fn => {
54
+ return fn.call(this, data); // eslint-disable-line
54
55
  });
55
56
  }
56
57
 
@@ -67,24 +68,17 @@ class EventProvider {
67
68
 
68
69
  isHandlerAttached(eventName, fnFunction) {
69
70
  const eventRegistry = this._eventRegistry;
70
- const eventListeners = eventRegistry[eventName];
71
+ const eventListeners = eventRegistry.get(eventName);
71
72
 
72
73
  if (!eventListeners) {
73
74
  return false;
74
75
  }
75
76
 
76
- for (let i = 0; i < eventListeners.length; i++) {
77
- const event = eventListeners[i];
78
- if (event["function"] === fnFunction) { // eslint-disable-line
79
- return true;
80
- }
81
- }
82
-
83
- return false;
77
+ return eventListeners.includes(fnFunction);
84
78
  }
85
79
 
86
80
  hasListeners(eventName) {
87
- return !!this._eventRegistry[eventName];
81
+ return !!this._eventRegistry.get(eventName);
88
82
  }
89
83
  }
90
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,95 +1,7 @@
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";
6
-
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`;
19
-
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");
47
- }
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
-
59
- /**
60
- * Some diacritics are supported by the 72 font:
61
- * * Grave
62
- * * Acute
63
- * * Circumflex
64
- * * Tilde
65
- *
66
- * However, the following diacritics and the combination of multiple diacritics (including the supported ones) are not supported:
67
- * * Breve
68
- * * Horn
69
- * * Dot below
70
- * * Hook above
71
- *
72
- *
73
- * Override for the characters that aren't covered by the '72' font to other system fonts
74
- *
75
- * U+0102-0103: A and a with Breve
76
- * U+01A0-01A1: O and o with Horn
77
- * U+01AF-01B0: U and u with Horn
78
- * U+1EA0-1EB7: A and a with diacritics that are not supported by the font and combination of multiple diacritics
79
- * U+1EB8-1EC7: E and e with diacritics that are not supported by the font and combination of multiple diacritics
80
- * U+1EC8-1ECB: I and i with diacritics that are not supported by the font and combination of multiple diacritics
81
- * U+1ECC-1EE3: O and o with diacritics that are not supported by the font and combination of multiple diacritics
82
- * U+1EE4-1EF1: U and u with diacritics that are not supported by the font and combination of multiple diacritics
83
- * U+1EF4-1EF7: Y and y with diacritics that are not supported by the font and combination of multiple diacritics
84
- *
85
- */
86
- const overrideFontFaceCSS = `
87
- @font-face {
88
- font-family: '72override';
89
- unicode-range: U+0102-0103, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EB7, U+1EB8-1EC7, U+1EC8-1ECB, U+1ECC-1EE3, U+1EE4-1EF1, U+1EF4-1EF7;
90
- src: local('Arial'), local('Helvetica'), local('sans-serif');
91
- }
92
- `;
3
+ import fontFaceCSS from "./generated/css/FontFace.css.js";
4
+ import overrideFontFaceCSS from "./generated/css/OverrideFontFace.css.js";
93
5
 
94
6
  const insertFontFace = () => {
95
7
  const OpenUI5Support = getFeature("OpenUI5Support");
@@ -104,14 +16,14 @@ const insertFontFace = () => {
104
16
  };
105
17
 
106
18
  const insertMainFontFace = () => {
107
- if (!document.querySelector(`head>style[data-ui5-font-face]`)) {
108
- createStyleInHead(fontFaceCSS, { "data-ui5-font-face": "" });
19
+ if (!hasStyle("data-ui5-font-face")) {
20
+ createStyle(fontFaceCSS, "data-ui5-font-face");
109
21
  }
110
22
  };
111
23
 
112
24
  const insertOverrideFontFace = () => {
113
- if (!document.querySelector(`head>style[data-ui5-font-face-override]`)) {
114
- createStyleInHead(overrideFontFaceCSS, { "data-ui5-font-face-override": "" });
25
+ if (!hasStyle("data-ui5-font-face-override")) {
26
+ createStyle(overrideFontFaceCSS, "data-ui5-font-face-override");
115
27
  }
116
28
  };
117
29
 
@@ -12,8 +12,7 @@ let initialConfig = {
12
12
  calendarType: null,
13
13
  noConflict: false, // no URL
14
14
  formatSettings: {},
15
- useDefaultLanguage: false,
16
- assetsPath: "",
15
+ fetchDefaultLanguage: false,
17
16
  };
18
17
 
19
18
  /* General settings */
@@ -38,13 +37,13 @@ const getLanguage = () => {
38
37
  };
39
38
 
40
39
  /**
41
- * Returns if the default language, that is inlined build time,
42
- * should be used, instead of trying fetching the language over the network.
40
+ * Returns if the default language, that is inlined at build time,
41
+ * should be fetched over the network instead.
43
42
  * @returns {Boolean}
44
43
  */
45
- const getUseDefaultLanguage = () => {
44
+ const getFetchDefaultLanguage = () => {
46
45
  initConfiguration();
47
- return initialConfig.useDefaultLanguage;
46
+ return initialConfig.fetchDefaultLanguage;
48
47
  };
49
48
 
50
49
  const getNoConflict = () => {
@@ -62,11 +61,6 @@ const getFormatSettings = () => {
62
61
  return initialConfig.formatSettings;
63
62
  };
64
63
 
65
- const getAssetsPath = () => {
66
- initConfiguration();
67
- return initialConfig.assetsPath;
68
- };
69
-
70
64
  const booleanMapping = new Map();
71
65
  booleanMapping.set("true", true);
72
66
  booleanMapping.set("false", false);
@@ -92,23 +86,47 @@ const parseConfigurationScript = () => {
92
86
  const parseURLParameters = () => {
93
87
  const params = new URLSearchParams(window.location.search);
94
88
 
89
+ // Process "sap-*" params first
95
90
  params.forEach((value, key) => {
96
- if (!key.startsWith("sap-ui")) {
91
+ const parts = key.split("sap-").length;
92
+ if (parts === 0 || parts === key.split("sap-ui-").length) {
97
93
  return;
98
94
  }
99
95
 
100
- const lowerCaseValue = value.toLowerCase();
101
-
102
- const param = key.split("sap-ui-")[1];
96
+ applyURLParam(key, value, "sap");
97
+ });
103
98
 
104
- if (booleanMapping.has(value)) {
105
- value = booleanMapping.get(lowerCaseValue);
99
+ // Process "sap-ui-*" params
100
+ params.forEach((value, key) => {
101
+ if (!key.startsWith("sap-ui")) {
102
+ return;
106
103
  }
107
104
 
108
- initialConfig[param] = value;
105
+ applyURLParam(key, value, "sap-ui");
109
106
  });
110
107
  };
111
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
+
112
130
  const applyOpenUI5Configuration = () => {
113
131
  const OpenUI5Support = getFeature("OpenUI5Support");
114
132
  if (!OpenUI5Support || !OpenUI5Support.isLoaded()) {
@@ -119,7 +137,6 @@ const applyOpenUI5Configuration = () => {
119
137
  initialConfig = merge(initialConfig, OpenUI5Config);
120
138
  };
121
139
 
122
-
123
140
  const initConfiguration = () => {
124
141
  if (initialized) {
125
142
  return;
@@ -142,9 +159,8 @@ export {
142
159
  getTheme,
143
160
  getRTL,
144
161
  getLanguage,
145
- getUseDefaultLanguage,
162
+ getFetchDefaultLanguage,
146
163
  getNoConflict,
147
164
  getCalendarType,
148
165
  getFormatSettings,
149
- getAssetsPath,
150
166
  };
package/dist/Keys.js CHANGED
@@ -111,6 +111,8 @@ const isSpace = event => (event.key ? (event.key === "Spacebar" || event.key ===
111
111
 
112
112
  const isSpaceShift = event => (event.key ? (event.key === "Spacebar" || event.key === " ") : event.keyCode === KeyCodes.SPACE) && checkModifierKeys(event, false, false, true);
113
113
 
114
+ const isSpaceCtrl = event => (event.key ? (event.key === "Spacebar" || event.key === " ") : event.keyCode === KeyCodes.SPACE) && checkModifierKeys(event, true, false, false);
115
+
114
116
  const isLeft = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && !hasModifierKeys(event);
115
117
 
116
118
  const isRight = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && !hasModifierKeys(event);
@@ -127,14 +129,38 @@ const isUpCtrl = event => (event.key ? (event.key === "ArrowUp" || event.key ===
127
129
 
128
130
  const isDownCtrl = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, true, false, false);
129
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
+
130
152
  const isHome = event => (event.key ? event.key === "Home" : event.keyCode === KeyCodes.HOME) && !hasModifierKeys(event);
131
153
 
132
154
  const isEnd = event => (event.key ? event.key === "End" : event.keyCode === KeyCodes.END) && !hasModifierKeys(event);
133
155
 
134
156
  const isHomeCtrl = event => (event.key ? event.key === "Home" : event.keyCode === KeyCodes.HOME) && checkModifierKeys(event, true, false, false);
135
157
 
158
+ const isHomeShift = event => (event.key ? event.key === "Home" : event.keyCode === KeyCodes.HOME) && checkModifierKeys(event, false, false, true);
159
+
136
160
  const isEndCtrl = event => (event.key ? event.key === "End" : event.keyCode === KeyCodes.END) && checkModifierKeys(event, true, false, false);
137
161
 
162
+ const isEndShift = event => (event.key ? event.key === "End" : event.keyCode === KeyCodes.END) && checkModifierKeys(event, false, false, true);
163
+
138
164
  const isEscape = event => (event.key ? event.key === "Escape" || event.key === "Esc" : event.keyCode === KeyCodes.ESCAPE) && !hasModifierKeys(event);
139
165
 
140
166
  const isTabNext = event => (event.key ? event.key === "Tab" : event.keyCode === KeyCodes.TAB) && !hasModifierKeys(event);
@@ -145,14 +171,24 @@ const isBackSpace = event => (event.key ? event.key === "Backspace" : event.keyC
145
171
 
146
172
  const isDelete = event => (event.key ? event.key === "Delete" : event.keyCode === KeyCodes.DELETE) && !hasModifierKeys(event);
147
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
+
148
180
  const isPageUp = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && !hasModifierKeys(event);
149
181
 
150
182
  const isPageDown = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && !hasModifierKeys(event);
151
183
 
152
184
  const isPageUpShift = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, false, false, true);
153
185
 
186
+ const isPageUpAlt = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, false, true, false);
187
+
154
188
  const isPageDownShift = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, false, false, true);
155
189
 
190
+ const isPageDownAlt = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, false, true, false);
191
+
156
192
  const isPageUpShiftCtrl = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, true, false, true);
157
193
 
158
194
  const isPageDownShiftCtrl = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, true, false, true);
@@ -175,10 +211,24 @@ const isF4 = event => {
175
211
 
176
212
  const isF4Shift = event => (event.key ? event.key === "F4" : event.keyCode === KeyCodes.F4) && checkModifierKeys(event, false, false, true);
177
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
+
178
222
  const isShowByArrows = event => {
179
223
  return ((event.key === "ArrowDown" || event.key === "Down") || (event.key === "ArrowUp" || event.key === "Up")) && checkModifierKeys(event, /* Ctrl */ false, /* Alt */ true, /* Shift */ false);
180
224
  };
181
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
+
182
232
  const hasModifierKeys = event => event.shiftKey || event.altKey || getCtrlKey(event);
183
233
 
184
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.
@@ -190,6 +240,7 @@ export {
190
240
  isEnterShift,
191
241
  isSpace,
192
242
  isSpaceShift,
243
+ isSpaceCtrl,
193
244
  isLeft,
194
245
  isRight,
195
246
  isUp,
@@ -198,12 +249,24 @@ export {
198
249
  isRightCtrl,
199
250
  isUpCtrl,
200
251
  isDownCtrl,
252
+ isUpShift,
253
+ isDownShift,
254
+ isUpAlt,
255
+ isDownAlt,
256
+ isLeftShift,
257
+ isRightShift,
258
+ isLeftShiftCtrl,
259
+ isRightShiftCtrl,
260
+ isUpShiftCtrl,
261
+ isDownShiftCtrl,
201
262
  isHome,
202
263
  isEnd,
203
264
  isPlus,
204
265
  isMinus,
205
266
  isHomeCtrl,
206
267
  isEndCtrl,
268
+ isHomeShift,
269
+ isEndShift,
207
270
  isEscape,
208
271
  isTabNext,
209
272
  isTabPrevious,
@@ -212,10 +275,21 @@ export {
212
275
  isShow,
213
276
  isF4,
214
277
  isF4Shift,
278
+ isF6Previous,
279
+ isF6Next,
280
+ isF7,
215
281
  isPageUp,
216
282
  isPageDown,
217
283
  isPageUpShift,
284
+ isPageUpAlt,
218
285
  isPageDownShift,
286
+ isPageDownAlt,
219
287
  isPageUpShiftCtrl,
220
288
  isPageDownShiftCtrl,
289
+ isShift,
290
+ isCtrlA,
291
+ isCtrlV,
292
+ isDeleteShift,
293
+ isInsertShift,
294
+ isInsertCtrl,
221
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;