@ui5/webcomponents-base 0.0.0-bef62af04 → 0.0.0-c638668a1

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 (129) hide show
  1. package/.eslintignore +3 -1
  2. package/CHANGELOG.md +97 -0
  3. package/README.md +26 -2
  4. package/bundle.esm.js +6 -2
  5. package/dist/Boot.js +32 -14
  6. package/dist/CSP.js +59 -0
  7. package/dist/CustomElementsRegistry.js +60 -4
  8. package/dist/Device.js +15 -1
  9. package/dist/EventProvider.js +19 -25
  10. package/dist/FeaturesRegistry.js +4 -1
  11. package/dist/FontFace.js +7 -95
  12. package/dist/InitialConfiguration.js +11 -7
  13. package/dist/Keys.js +29 -0
  14. package/dist/ManagedStyles.js +83 -0
  15. package/dist/Render.js +3 -1
  16. package/dist/Runtimes.js +107 -0
  17. package/dist/StaticAreaItem.js +14 -9
  18. package/dist/SystemCSSVars.js +4 -25
  19. package/dist/UI5Element.js +20 -23
  20. package/dist/UI5ElementMetadata.js +17 -1
  21. package/dist/asset-registries/Icons.js +25 -14
  22. package/dist/asset-registries/Illustrations.js +10 -3
  23. package/dist/asset-registries/LocaleData.js +11 -2
  24. package/dist/assets-meta/IconCollectionsAlias.js +18 -0
  25. package/dist/config/Theme.js +14 -0
  26. package/dist/css/FontFace.css +45 -0
  27. package/dist/css/OverrideFontFace.css +32 -0
  28. package/dist/css/SystemCSSVars.css +17 -0
  29. package/dist/delegate/ItemNavigation.js +66 -0
  30. package/dist/features/F6Navigation.js +106 -0
  31. package/dist/generated/AssetParameters.js +1 -1
  32. package/dist/generated/VersionInfo.js +10 -0
  33. package/dist/generated/css/FontFace.css.js +5 -0
  34. package/dist/generated/css/OverrideFontFace.css.js +5 -0
  35. package/dist/generated/css/SystemCSSVars.css.js +5 -0
  36. package/dist/i18nBundle.js +33 -2
  37. package/dist/renderer/LitRenderer.js +6 -4
  38. package/dist/renderer/directives/style-map.js +72 -0
  39. package/dist/resources/bundle.esm.js +19 -8
  40. package/dist/resources/bundle.esm.js.map +1 -1
  41. package/dist/sap/base/Log.js +2 -10
  42. package/dist/sap/base/assert.js +1 -5
  43. package/dist/sap/base/security/encodeCSS.js +14 -0
  44. package/dist/sap/base/security/encodeXML.js +23 -0
  45. package/dist/sap/base/strings/toHex.js +8 -0
  46. package/dist/test-resources/elements/WithStaticArea.js +2 -1
  47. package/dist/test-resources/pages/AllTestElements.html +3 -0
  48. package/dist/test-resources/pages/i18n.html +1 -3
  49. package/dist/test-resources/specs/ConfigurationChange.spec.js +9 -9
  50. package/dist/test-resources/specs/ConfigurationScript.spec.js +24 -24
  51. package/dist/test-resources/specs/ConfigurationURL.spec.js +33 -33
  52. package/dist/test-resources/specs/CustomTheme.spec.js +7 -7
  53. package/dist/test-resources/specs/EventProvider.spec.js +63 -0
  54. package/dist/test-resources/specs/StaticArea.spec.js +55 -13
  55. package/dist/test-resources/specs/Theming.spec.js +11 -11
  56. package/dist/test-resources/specs/UI5ElementInvalidation.js +29 -29
  57. package/dist/test-resources/specs/UI5ElementLifecycle.js +11 -11
  58. package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +11 -11
  59. package/dist/test-resources/specs/UI5ElementMetadataExt.js +8 -8
  60. package/dist/test-resources/specs/UI5ElementPropertyValidation.js +6 -6
  61. package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +36 -36
  62. package/dist/test-resources/specs/UI5ElementShadowDOM.js +9 -9
  63. package/dist/test-resources/specs/UI5ElementSlots.js +9 -9
  64. package/dist/theming/CustomStyle.js +23 -3
  65. package/dist/theming/applyTheme.js +11 -10
  66. package/dist/theming/getEffectiveLinksHrefs.js +20 -0
  67. package/dist/theming/getStylesString.js +4 -2
  68. package/dist/theming/getThemeDesignerTheme.js +25 -5
  69. package/dist/theming/preloadLinks.js +23 -0
  70. package/dist/updateShadowRoot.js +8 -4
  71. package/dist/util/FocusableElements.js +8 -6
  72. package/dist/util/createLinkInHead.js +19 -0
  73. package/dist/util/escapeRegex.js +10 -0
  74. package/dist/util/generateHighlightedMarkup.js +42 -0
  75. package/dist/util/isNodeHidden.js +1 -1
  76. package/hash.txt +1 -1
  77. package/lib/generate-asset-parameters/index.js +0 -1
  78. package/lib/generate-styles/index.js +18 -0
  79. package/lib/generate-version-info/index.js +27 -0
  80. package/package-scripts.js +11 -6
  81. package/package.json +9 -11
  82. package/src/Boot.js +32 -14
  83. package/src/CSP.js +59 -0
  84. package/src/CustomElementsRegistry.js +60 -4
  85. package/src/Device.js +15 -1
  86. package/src/EventProvider.js +19 -25
  87. package/src/FeaturesRegistry.js +4 -1
  88. package/src/FontFace.js +7 -95
  89. package/src/InitialConfiguration.js +11 -7
  90. package/src/Keys.js +29 -0
  91. package/src/ManagedStyles.js +83 -0
  92. package/src/Render.js +3 -1
  93. package/src/Runtimes.js +107 -0
  94. package/src/StaticAreaItem.js +14 -9
  95. package/src/SystemCSSVars.js +4 -25
  96. package/src/UI5Element.js +20 -23
  97. package/src/UI5ElementMetadata.js +17 -1
  98. package/src/asset-registries/Icons.js +25 -14
  99. package/src/asset-registries/Illustrations.js +10 -3
  100. package/src/asset-registries/LocaleData.js +11 -2
  101. package/src/assets-meta/IconCollectionsAlias.js +18 -0
  102. package/src/config/Theme.js +14 -0
  103. package/src/css/FontFace.css +45 -0
  104. package/src/css/OverrideFontFace.css +32 -0
  105. package/src/css/SystemCSSVars.css +17 -0
  106. package/src/delegate/ItemNavigation.js +66 -0
  107. package/src/features/F6Navigation.js +106 -0
  108. package/src/i18nBundle.js +33 -2
  109. package/src/renderer/LitRenderer.js +6 -4
  110. package/src/renderer/directives/style-map.js +72 -0
  111. package/src/theming/CustomStyle.js +23 -3
  112. package/src/theming/applyTheme.js +11 -10
  113. package/src/theming/getEffectiveLinksHrefs.js +20 -0
  114. package/src/theming/getStylesString.js +4 -2
  115. package/src/theming/getThemeDesignerTheme.js +25 -5
  116. package/src/theming/preloadLinks.js +23 -0
  117. package/src/updateShadowRoot.js +8 -4
  118. package/src/util/FocusableElements.js +8 -6
  119. package/src/util/createLinkInHead.js +19 -0
  120. package/src/util/escapeRegex.js +10 -0
  121. package/src/util/generateHighlightedMarkup.js +42 -0
  122. package/src/util/isNodeHidden.js +1 -1
  123. package/used-modules.txt +4 -1
  124. package/dist/config/AssetsPath.js +0 -17
  125. package/dist/theming/createThemePropertiesStyleTag.js +0 -20
  126. package/dist/util/encodeCSS.js +0 -24
  127. package/src/config/AssetsPath.js +0 -17
  128. package/src/theming/createThemePropertiesStyleTag.js +0 -20
  129. package/src/util/encodeCSS.js +0 -24
@@ -13,7 +13,6 @@ let initialConfig = {
13
13
  noConflict: false, // no URL
14
14
  formatSettings: {},
15
15
  fetchDefaultLanguage: false,
16
- assetsPath: "",
17
16
  };
18
17
 
19
18
  /* General settings */
@@ -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);
@@ -112,6 +106,14 @@ const parseURLParameters = () => {
112
106
  });
113
107
  };
114
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
+
115
117
  const applyURLParam = (key, value, paramType) => {
116
118
  const lowerCaseValue = value.toLowerCase();
117
119
  const param = key.split(`${paramType}-`)[1];
@@ -119,6 +121,9 @@ const applyURLParam = (key, value, paramType) => {
119
121
  if (booleanMapping.has(value)) {
120
122
  value = booleanMapping.get(lowerCaseValue);
121
123
  }
124
+
125
+ value = normalizeParamValue(param, value);
126
+
122
127
  initialConfig[param] = value;
123
128
  };
124
129
 
@@ -158,5 +163,4 @@ export {
158
163
  getNoConflict,
159
164
  getCalendarType,
160
165
  getFormatSettings,
161
- getAssetsPath,
162
166
  };
package/dist/Keys.js CHANGED
@@ -131,10 +131,18 @@ const isUpShift = event => (event.key ? (event.key === "ArrowUp" || event.key ==
131
131
 
132
132
  const isDownShift = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, false, false, true);
133
133
 
134
+ const isUpAlt = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_UP) && checkModifierKeys(event, false, true, false);
135
+
136
+ const isDownAlt = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, false, true, false);
137
+
134
138
  const isLeftShift = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && checkModifierKeys(event, false, false, true);
135
139
 
136
140
  const isRightShift = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && checkModifierKeys(event, false, false, true);
137
141
 
142
+ const isLeftShiftCtrl = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && checkModifierKeys(event, true, false, true);
143
+
144
+ const isRightShiftCtrl = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && checkModifierKeys(event, true, false, true);
145
+
138
146
  const isUpShiftCtrl = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_UP) && checkModifierKeys(event, true, false, true);
139
147
 
140
148
  const isDownShiftCtrl = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, true, false, true);
@@ -163,8 +171,12 @@ const isPageDown = event => (event.key ? event.key === "PageDown" : event.keyCod
163
171
 
164
172
  const isPageUpShift = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, false, false, true);
165
173
 
174
+ const isPageUpAlt = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, false, true, false);
175
+
166
176
  const isPageDownShift = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, false, false, true);
167
177
 
178
+ const isPageDownAlt = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, false, true, false);
179
+
168
180
  const isPageUpShiftCtrl = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, true, false, true);
169
181
 
170
182
  const isPageDownShiftCtrl = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, true, false, true);
@@ -187,12 +199,20 @@ const isF4 = event => {
187
199
 
188
200
  const isF4Shift = event => (event.key ? event.key === "F4" : event.keyCode === KeyCodes.F4) && checkModifierKeys(event, false, false, true);
189
201
 
202
+ const isF6Next = event => ((event.key ? event.key === "F6" : event.keyCode === KeyCodes.F6) && checkModifierKeys(event, false, false, false))
203
+ || ((event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, true, true, false));
204
+
205
+ const isF6Previous = event => ((event.key ? event.key === "F6" : event.keyCode === KeyCodes.F6) && checkModifierKeys(event, false, false, true))
206
+ || ((event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_Up) && checkModifierKeys(event, true, true, false));
207
+
190
208
  const isF7 = event => (event.key ? event.key === "F7" : event.keyCode === KeyCodes.F7) && !hasModifierKeys(event);
191
209
 
192
210
  const isShowByArrows = event => {
193
211
  return ((event.key === "ArrowDown" || event.key === "Down") || (event.key === "ArrowUp" || event.key === "Up")) && checkModifierKeys(event, /* Ctrl */ false, /* Alt */ true, /* Shift */ false);
194
212
  };
195
213
 
214
+ const isShift = event => event.key === "Shift" || event.keyCode === KeyCodes.SHIFT;
215
+
196
216
  const hasModifierKeys = event => event.shiftKey || event.altKey || getCtrlKey(event);
197
217
 
198
218
  const getCtrlKey = event => !!(event.metaKey || event.ctrlKey); // double negation doesn't have effect on boolean but ensures null and undefined are equivalent to false.
@@ -214,8 +234,12 @@ export {
214
234
  isDownCtrl,
215
235
  isUpShift,
216
236
  isDownShift,
237
+ isUpAlt,
238
+ isDownAlt,
217
239
  isLeftShift,
218
240
  isRightShift,
241
+ isLeftShiftCtrl,
242
+ isRightShiftCtrl,
219
243
  isUpShiftCtrl,
220
244
  isDownShiftCtrl,
221
245
  isHome,
@@ -232,11 +256,16 @@ export {
232
256
  isShow,
233
257
  isF4,
234
258
  isF4Shift,
259
+ isF6Previous,
260
+ isF6Next,
235
261
  isF7,
236
262
  isPageUp,
237
263
  isPageDown,
238
264
  isPageUpShift,
265
+ isPageUpAlt,
239
266
  isPageDownShift,
267
+ isPageDownAlt,
240
268
  isPageUpShiftCtrl,
241
269
  isPageDownShiftCtrl,
270
+ isShift,
242
271
  };
@@ -0,0 +1,83 @@
1
+ import createStyleInHead from "./util/createStyleInHead.js";
2
+ import createLinkInHead from "./util/createLinkInHead.js";
3
+ import { shouldUseLinks, getUrl } from "./CSP.js";
4
+
5
+ const getStyleId = (name, value) => {
6
+ return value ? `${name}|${value}` : name;
7
+ };
8
+
9
+ const createStyle = (data, name, value = "") => {
10
+ const content = typeof data === "string" ? data : data.content;
11
+
12
+ if (shouldUseLinks()) {
13
+ const attributes = {};
14
+ attributes[name] = value;
15
+ const href = getUrl(data.packageName, data.fileName);
16
+ createLinkInHead(href, attributes);
17
+ } else if (document.adoptedStyleSheets) {
18
+ const stylesheet = new CSSStyleSheet();
19
+ stylesheet.replaceSync(content);
20
+ stylesheet._ui5StyleId = getStyleId(name, value); // set an id so that we can find the style later
21
+ document.adoptedStyleSheets = [...document.adoptedStyleSheets, stylesheet];
22
+ } else {
23
+ const attributes = {};
24
+ attributes[name] = value;
25
+ createStyleInHead(content, attributes);
26
+ }
27
+ };
28
+
29
+ const updateStyle = (data, name, value = "") => {
30
+ const content = typeof data === "string" ? data : data.content;
31
+
32
+ if (shouldUseLinks()) {
33
+ document.querySelector(`head>link[${name}="${value}"]`).href = getUrl(data.packageName, data.fileName);
34
+ } else if (document.adoptedStyleSheets) {
35
+ document.adoptedStyleSheets.find(sh => sh._ui5StyleId === getStyleId(name, value)).replaceSync(content || "");
36
+ } else {
37
+ document.querySelector(`head>style[${name}="${value}"]`).textContent = content || "";
38
+ }
39
+ };
40
+
41
+ const hasStyle = (name, value = "") => {
42
+ if (shouldUseLinks()) {
43
+ return !!document.querySelector(`head>link[${name}="${value}"]`);
44
+ }
45
+
46
+ if (document.adoptedStyleSheets) {
47
+ return !!document.adoptedStyleSheets.find(sh => sh._ui5StyleId === getStyleId(name, value));
48
+ }
49
+
50
+ return !!document.querySelector(`head>style[${name}="${value}"]`);
51
+ };
52
+
53
+ const removeStyle = (name, value = "") => {
54
+ if (shouldUseLinks()) {
55
+ const linkElement = document.querySelector(`head>link[${name}="${value}"]`);
56
+ if (linkElement) {
57
+ linkElement.parentElement.removeChild(linkElement);
58
+ }
59
+ } else if (document.adoptedStyleSheets) {
60
+ document.adoptedStyleSheets = document.adoptedStyleSheets.filter(sh => sh._ui5StyleId !== getStyleId(name, value));
61
+ } else {
62
+ const styleElement = document.querySelector(`head > style[${name}="${value}"]`);
63
+ if (styleElement) {
64
+ styleElement.parentElement.removeChild(styleElement);
65
+ }
66
+ }
67
+ };
68
+
69
+ const createOrUpdateStyle = (data, name, value = "") => {
70
+ if (hasStyle(name, value)) {
71
+ updateStyle(data, name, value);
72
+ } else {
73
+ createStyle(data, name, value);
74
+ }
75
+ };
76
+
77
+ export {
78
+ createStyle,
79
+ hasStyle,
80
+ updateStyle,
81
+ removeStyle,
82
+ createOrUpdateStyle,
83
+ };
package/dist/Render.js CHANGED
@@ -135,6 +135,7 @@ const _resolveTaskPromise = () => {
135
135
  * reRenderAllUI5Elements({tag: "ui5-button"}) -> re-renders only instances of ui5-button
136
136
  * reRenderAllUI5Elements({rtlAware: true}) -> re-renders only rtlAware components
137
137
  * reRenderAllUI5Elements({languageAware: true}) -> re-renders only languageAware components
138
+ * reRenderAllUI5Elements({themeAware: true}) -> re-renders only themeAware components
138
139
  * reRenderAllUI5Elements({rtlAware: true, languageAware: true}) -> re-renders components that are rtlAware or languageAware
139
140
  * etc...
140
141
  *
@@ -147,7 +148,8 @@ const reRenderAllUI5Elements = async filters => {
147
148
  const tag = element.constructor.getMetadata().getTag();
148
149
  const rtlAware = isRtlAware(element.constructor);
149
150
  const languageAware = element.constructor.getMetadata().isLanguageAware();
150
- if (!filters || (filters.tag === tag) || (filters.rtlAware && rtlAware) || (filters.languageAware && languageAware)) {
151
+ const themeAware = element.constructor.getMetadata().isThemeAware();
152
+ if (!filters || (filters.tag === tag) || (filters.rtlAware && rtlAware) || (filters.languageAware && languageAware) || (filters.themeAware && themeAware)) {
151
153
  renderDeferred(element);
152
154
  }
153
155
  });
@@ -0,0 +1,107 @@
1
+ import VersionInfo from "./generated/VersionInfo.js";
2
+ import getSharedResource from "./getSharedResource.js";
3
+
4
+ let currentRuntimeIndex;
5
+ let currentRuntimeAlias = "";
6
+
7
+ const compareCache = new Map();
8
+
9
+ /**
10
+ * Central registry where all runtimes register themselves by pushing an object.
11
+ * The index in the registry servers as an ID for the runtime.
12
+ * @type {*}
13
+ */
14
+ const Runtimes = getSharedResource("Runtimes", []);
15
+
16
+ /**
17
+ * Registers the current runtime in the shared runtimes resource registry
18
+ */
19
+ const registerCurrentRuntime = () => {
20
+ if (currentRuntimeIndex === undefined) {
21
+ currentRuntimeIndex = Runtimes.length;
22
+ Runtimes.push({
23
+ ...VersionInfo,
24
+ alias: currentRuntimeAlias,
25
+ description: `Runtime ${currentRuntimeIndex} - ver ${VersionInfo.version}${currentRuntimeAlias ? ` (${currentRuntimeAlias})` : ""}`,
26
+ });
27
+ }
28
+ };
29
+
30
+ /**
31
+ * Returns the index of the current runtime's object in the shared runtimes resource registry
32
+ * @returns {*}
33
+ */
34
+ const getCurrentRuntimeIndex = () => {
35
+ return currentRuntimeIndex;
36
+ };
37
+
38
+ /**
39
+ * Compares two runtimes and returns 1 if the first is of a bigger version, -1 if the second is of a bigger version, and 0 if equal
40
+ * @param index1 The index of the first runtime to compare
41
+ * @param index2 The index of the second runtime to compare
42
+ * @returns {number}
43
+ */
44
+ const compareRuntimes = (index1, index2) => {
45
+ const cacheIndex = `${index1},${index2}`;
46
+ if (compareCache.has(cacheIndex)) {
47
+ return compareCache.get(cacheIndex);
48
+ }
49
+
50
+ const runtime1 = Runtimes[index1];
51
+ const runtime2 = Runtimes[index2];
52
+
53
+ if (!runtime1 || !runtime2) {
54
+ throw new Error("Invalid runtime index supplied");
55
+ }
56
+
57
+ // If any of the two is a next version, bigger buildTime wins
58
+ if (runtime1.isNext || runtime2.isNext) {
59
+ return runtime1.buildTime - runtime2.buildTime;
60
+ }
61
+
62
+ // If major versions differ, bigger one wins
63
+ const majorDiff = runtime1.major - runtime2.major;
64
+ if (majorDiff) {
65
+ return majorDiff;
66
+ }
67
+
68
+ // If minor versions differ, bigger one wins
69
+ const minorDiff = runtime1.minor - runtime2.minor;
70
+ if (minorDiff) {
71
+ return minorDiff;
72
+ }
73
+
74
+ // If patch versions differ, bigger one wins
75
+ const patchDiff = runtime1.patch - runtime2.patch;
76
+ if (patchDiff) {
77
+ return patchDiff;
78
+ }
79
+
80
+ // Bigger suffix wins, f.e. rc10 > rc9
81
+ // Important: suffix is alphanumeric, must use natural compare
82
+ const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: "base" });
83
+ const result = collator.compare(runtime1.suffix, runtime2.suffix);
84
+
85
+ compareCache.set(cacheIndex, result);
86
+ return result;
87
+ };
88
+
89
+ /**
90
+ * Set an alias for the the current app/library/microfrontend which will appear in debug messages and console warnings
91
+ * @param alias
92
+ */
93
+ const setRuntimeAlias = alias => {
94
+ currentRuntimeAlias = alias;
95
+ };
96
+
97
+ const getAllRuntimes = () => {
98
+ return Runtimes;
99
+ };
100
+
101
+ export {
102
+ getCurrentRuntimeIndex,
103
+ registerCurrentRuntime,
104
+ compareRuntimes,
105
+ setRuntimeAlias,
106
+ getAllRuntimes,
107
+ };
@@ -3,6 +3,7 @@ import updateShadowRoot from "./updateShadowRoot.js";
3
3
  import { renderFinished } from "./Render.js";
4
4
  import getEffectiveContentDensity from "./util/getEffectiveContentDensity.js";
5
5
  import { getEffectiveScopingSuffixForTag } from "./CustomElementsScope.js";
6
+ import getEffectiveDir from "./locale/getEffectiveDir.js";
6
7
 
7
8
  /**
8
9
  *
@@ -24,6 +25,9 @@ class StaticAreaItem extends HTMLElement {
24
25
  setOwnerElement(ownerElement) {
25
26
  this.ownerElement = ownerElement;
26
27
  this.classList.add(this.ownerElement._id); // used for getting the popover in the tests
28
+ if (this.ownerElement.hasAttribute("data-ui5-static-stable")) {
29
+ this.setAttribute("data-ui5-stable", this.ownerElement.getAttribute("data-ui5-static-stable")); // stable selector
30
+ }
27
31
  }
28
32
 
29
33
  /**
@@ -33,6 +37,7 @@ class StaticAreaItem extends HTMLElement {
33
37
  update() {
34
38
  if (this._rendered) {
35
39
  this._updateContentDensity();
40
+ this._updateDirection();
36
41
  updateShadowRoot(this.ownerElement, true);
37
42
  }
38
43
  }
@@ -51,6 +56,15 @@ class StaticAreaItem extends HTMLElement {
51
56
  }
52
57
  }
53
58
 
59
+ _updateDirection() {
60
+ const dir = getEffectiveDir(this.ownerElement);
61
+ if (dir) {
62
+ this.setAttribute("dir", dir);
63
+ } else {
64
+ this.removeAttribute("dir");
65
+ }
66
+ }
67
+
54
68
  /**
55
69
  * @protected
56
70
  * Returns reference to the DOM element where the current fragment is added.
@@ -65,15 +79,6 @@ class StaticAreaItem extends HTMLElement {
65
79
  return this.shadowRoot;
66
80
  }
67
81
 
68
- /**
69
- * @protected
70
- * @param refName
71
- * @returns {Element}
72
- */
73
- getStableDomRef(refName) {
74
- return this.shadowRoot.querySelector(`[data-ui5-stable=${refName}]`);
75
- }
76
-
77
82
  static getTag() {
78
83
  const pureTag = "ui5-static-area-item";
79
84
  const suffix = getEffectiveScopingSuffixForTag(pureTag);
@@ -1,31 +1,10 @@
1
- import createStyleInHead from "./util/createStyleInHead.js";
2
-
3
- const systemCSSVars = `
4
- :root {
5
- --_ui5_content_density:cozy;
6
- }
7
-
8
- [data-ui5-compact-size],
9
- .ui5-content-density-compact,
10
- .sapUiSizeCompact {
11
- --_ui5_content_density:compact;
12
- }
13
-
14
- [dir="rtl"] {
15
- --_ui5_dir:rtl;
16
- }
17
-
18
- [dir="ltr"] {
19
- --_ui5_dir:ltr;
20
- }
21
- `;
1
+ import { hasStyle, createStyle } from "./ManagedStyles.js";
2
+ import systemCSSVars from "./generated/css/SystemCSSVars.css.js";
22
3
 
23
4
  const insertSystemCSSVars = () => {
24
- if (document.querySelector(`head>style[data-ui5-system-css-vars]`)) {
25
- return;
5
+ if (!hasStyle("data-ui5-system-css-vars")) {
6
+ createStyle(systemCSSVars, "data-ui5-system-css-vars");
26
7
  }
27
-
28
- createStyleInHead(systemCSSVars, { "data-ui5-system-css-vars": "" });
29
8
  };
30
9
 
31
10
  export default insertSystemCSSVars;
@@ -18,7 +18,7 @@ import { isSlot, getSlotName, getSlottedElementsList } from "./util/SlotsHelper.
18
18
  import arraysAreEqual from "./util/arraysAreEqual.js";
19
19
  import getClassCopy from "./util/getClassCopy.js";
20
20
  import { markAsRtlAware } from "./locale/RTLAwareRegistry.js";
21
- import isLegacyBrowser from "./isLegacyBrowser.js";
21
+ import preloadLinks from "./theming/preloadLinks.js";
22
22
 
23
23
  let autoId = 0;
24
24
 
@@ -101,6 +101,9 @@ class UI5Element extends HTMLElement {
101
101
  */
102
102
  async connectedCallback() {
103
103
  this.setAttribute(this.constructor.getMetadata().getPureTag(), "");
104
+ if (this.constructor.getMetadata().supportsF6FastNavigation()) {
105
+ this.setAttribute("data-sap-ui-fastnavgroup", "true");
106
+ }
104
107
 
105
108
  const slotsAreManaged = this.constructor.getMetadata().slotsAreManaged();
106
109
 
@@ -251,7 +254,8 @@ class UI5Element extends HTMLElement {
251
254
 
252
255
  // Listen for any invalidation on the child if invalidateOnChildChange is true or an object (ignore when false or not set)
253
256
  if (child.isUI5Element && slotData.invalidateOnChildChange) {
254
- child.attachInvalidate(this._getChildChangeListener(slotName));
257
+ const method = (child.attachInvalidate || child._attachChange).bind(child);
258
+ method(this._getChildChangeListener(slotName));
255
259
  }
256
260
 
257
261
  // Listen for the slotchange event if the child is a slot itself
@@ -311,7 +315,8 @@ class UI5Element extends HTMLElement {
311
315
 
312
316
  children.forEach(child => {
313
317
  if (child && child.isUI5Element) {
314
- child.detachInvalidate(this._getChildChangeListener(slotName));
318
+ const method = (child.detachInvalidate || child._detachChange).bind(child);
319
+ method(this._getChildChangeListener(slotName));
315
320
  }
316
321
 
317
322
  if (isSlot(child)) {
@@ -607,25 +612,27 @@ class UI5Element extends HTMLElement {
607
612
 
608
613
  /**
609
614
  * Returns the DOM Element inside the Shadow Root that corresponds to the opening tag in the UI5 Web Component's template
615
+ * *Note:* For logical (abstract) elements (items, options, etc...), returns the part of the parent's DOM that represents this option
610
616
  * Use this method instead of "this.shadowRoot" to read the Shadow DOM, if ever necessary
617
+ *
611
618
  * @public
612
619
  */
613
620
  getDomRef() {
621
+ // If a component set _getRealDomRef to its children, use the return value of this function
622
+ if (typeof this._getRealDomRef === "function") {
623
+ return this._getRealDomRef();
624
+ }
625
+
614
626
  if (!this.shadowRoot || this.shadowRoot.children.length === 0) {
615
627
  return;
616
628
  }
617
629
 
618
- this._assertShadowRootStructure();
619
-
620
- return this.shadowRoot.children.length === 1
621
- ? this.shadowRoot.children[0] : this.shadowRoot.children[1];
622
- }
623
-
624
- _assertShadowRootStructure() {
625
- const expectedChildrenCount = document.adoptedStyleSheets || isLegacyBrowser() ? 1 : 2;
626
- if (this.shadowRoot.children.length !== expectedChildrenCount) {
630
+ const children = [...this.shadowRoot.children].filter(child => !["link", "style"].includes(child.localName));
631
+ if (children.length !== 1) {
627
632
  console.warn(`The shadow DOM for ${this.constructor.getMetadata().getTag()} does not have a top level element, the getDomRef() method might not work as expected`); // eslint-disable-line
628
633
  }
634
+
635
+ return children[0];
629
636
  }
630
637
 
631
638
  /**
@@ -651,17 +658,6 @@ class UI5Element extends HTMLElement {
651
658
  return this.getFocusDomRef();
652
659
  }
653
660
 
654
- /**
655
- * Use this method in order to get a reference to an element in the shadow root of the web component or the static area item of the component
656
- * @public
657
- * @method
658
- * @param {String} refName Defines the name of the stable DOM ref
659
- */
660
- getStableDomRef(refName) {
661
- const staticAreaResult = this.staticAreaItem && this.staticAreaItem.getStableDomRef(refName);
662
- return staticAreaResult || this.getDomRef().querySelector(`[data-ui5-stable=${refName}]`);
663
- }
664
-
665
661
  /**
666
662
  * Set the focus to the element, returned by "getFocusDomRef()" (marked by "data-sap-focus-ref")
667
663
  * @public
@@ -988,6 +984,7 @@ class UI5Element extends HTMLElement {
988
984
  this._generateAccessors();
989
985
  registerTag(tag);
990
986
  window.customElements.define(tag, this);
987
+ preloadLinks(this);
991
988
 
992
989
  if (altTag && !customElements.get(altTag)) {
993
990
  registerTag(altTag);
@@ -126,7 +126,7 @@ class UI5ElementMetadata {
126
126
  */
127
127
  hasAttribute(propName) {
128
128
  const propData = this.getProperties()[propName];
129
- return propData.type !== Object && !propData.noAttribute;
129
+ return propData.type !== Object && !propData.noAttribute && !propData.multiple;
130
130
  }
131
131
 
132
132
  /**
@@ -188,6 +188,14 @@ class UI5ElementMetadata {
188
188
  return !!this.metadata.managedSlots;
189
189
  }
190
190
 
191
+ /**
192
+ * Determines whether this control supports F6 fast navigation
193
+ * @public
194
+ */
195
+ supportsF6FastNavigation() {
196
+ return !!this.metadata.fastNavigation;
197
+ }
198
+
191
199
  /**
192
200
  * Returns an object with key-value pairs of properties and their metadata definitions
193
201
  * @public
@@ -212,6 +220,14 @@ class UI5ElementMetadata {
212
220
  return !!this.metadata.languageAware;
213
221
  }
214
222
 
223
+ /**
224
+ * Determines whether this UI5 Element has any theme dependant carachteristics.
225
+ * @returns {boolean}
226
+ */
227
+ isThemeAware() {
228
+ return !!this.metadata.themeAware;
229
+ }
230
+
215
231
  /**
216
232
  * Matches a changed entity (property/slot) with the given name against the "invalidateOnChildChange" configuration
217
233
  * and determines whether this should cause and invalidation
@@ -1,11 +1,12 @@
1
1
  import getSharedResource from "../getSharedResource.js";
2
+ import IconCollectionsAlias from "../assets-meta/IconCollectionsAlias.js";
3
+ import { isTheme } from "../config/Theme.js";
2
4
 
3
5
  const loaders = new Map();
4
6
  const registry = getSharedResource("SVGIcons.registry", new Map());
5
7
  const iconCollectionPromises = getSharedResource("SVGIcons.promises", new Map());
6
8
 
7
9
  const ICON_NOT_FOUND = "ICON_NOT_FOUND";
8
- const DEFAULT_COLLECTION = "SAP-icons";
9
10
 
10
11
  /**
11
12
  * @deprecated
@@ -47,7 +48,7 @@ const _fillRegistry = bundleData => {
47
48
  // set
48
49
  const registerIcon = (name, { pathData, ltr, accData, collection, packageName } = {}) => { // eslint-disable-line
49
50
  if (!collection) {
50
- collection = DEFAULT_COLLECTION;
51
+ collection = _getDefaultCollection();
51
52
  }
52
53
 
53
54
  const key = `${collection}/${name}`;
@@ -67,18 +68,16 @@ const _parseName = name => {
67
68
 
68
69
  let collection;
69
70
  [name, collection] = name.split("/").reverse();
70
- collection = collection || DEFAULT_COLLECTION;
71
- // hardcoded alias in case icon explorer is used, resolve `SAP-icons-TNT` to `tnt`
72
- // aliases can be made a feature in the future if more collections need it or more aliases are needed.
73
- if (collection === "SAP-icons-TNT") {
74
- collection = "tnt";
75
- }
76
- // hardcoded alias in case icon explorer is used, resolve `BusinessSuiteInAppSymbols` to `business-suite`
77
- // aliases can be made a feature in the future if more collections need it or more aliases are needed.
78
- if (collection === "BusinessSuiteInAppSymbols") {
79
- collection = "business-suite";
80
- name = name.replace("icon-", "");
81
- }
71
+ collection = collection || _getDefaultCollection();
72
+
73
+ // Normalize collection name.
74
+ // - resolve `SAP-icons-TNT` to `tnt`.
75
+ // - resolve `BusinessSuiteInAppSymbols` to `business-suite`.
76
+ // - resolve `horizon` to `SAP-icons-v5`,
77
+ // Note: aliases can be made as a feature, if more collections need it or more aliases are needed.
78
+ collection = _normalizeCollection(collection);
79
+ name = name.replace("icon-", "");
80
+
82
81
  const registryKey = `${collection}/${name}`;
83
82
  return { name, collection, registryKey };
84
83
  };
@@ -118,6 +117,18 @@ const _getRegisteredNames = async () => {
118
117
  return Array.from(registry.keys());
119
118
  };
120
119
 
120
+ const _getDefaultCollection = () => {
121
+ return isTheme("sap_horizon") ? "SAP-icons-v5" : "SAP-icons";
122
+ };
123
+
124
+ const _normalizeCollection = collectionName => {
125
+ if (IconCollectionsAlias[collectionName]) {
126
+ return IconCollectionsAlias[collectionName];
127
+ }
128
+
129
+ return collectionName;
130
+ };
131
+
121
132
  export {
122
133
  registerIconBundle,
123
134
  registerIconLoader,
@@ -3,8 +3,8 @@ import getSharedResource from "../getSharedResource.js";
3
3
  const registry = getSharedResource("SVGIllustration.registry", new Map());
4
4
  const ILLUSTRATION_NOT_FOUND = "ILLUSTRATION_NOT_FOUND";
5
5
 
6
- const registerIllustration = (name, { dialogSvg, sceneSvg, spotSvg, title, subtitle } = {}) => { // eslint-disable-line
7
- registry.set(name, {
6
+ const registerIllustration = (name, { dialogSvg, sceneSvg, spotSvg, set, title, subtitle } = {}) => { // eslint-disable-line
7
+ registry.set(`${set}/${name}`, {
8
8
  dialogSvg,
9
9
  sceneSvg,
10
10
  spotSvg,
@@ -14,7 +14,14 @@ const registerIllustration = (name, { dialogSvg, sceneSvg, spotSvg, title, subti
14
14
  };
15
15
 
16
16
  const getIllustrationDataSync = nameProp => {
17
- return registry.get(nameProp) || ILLUSTRATION_NOT_FOUND;
17
+ let set = "fiori";
18
+
19
+ if (nameProp.startsWith("Tnt")) {
20
+ set = "tnt";
21
+ nameProp = nameProp.replace(/^Tnt/, "");
22
+ }
23
+
24
+ return registry.get(`${set}/${nameProp}`) || ILLUSTRATION_NOT_FOUND;
18
25
  };
19
26
 
20
27
  export {