@ui5/webcomponents-base 0.0.0-fb61e9889 → 0.0.0-fd6264051
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.
- package/.eslintignore +3 -1
- package/CHANGELOG.md +125 -0
- package/README.md +2 -3
- package/bundle.esm.js +1 -2
- package/dist/Boot.js +34 -18
- package/dist/CSP.js +59 -0
- package/dist/CustomElementsRegistry.js +60 -4
- package/dist/Device.js +15 -1
- package/dist/FeaturesRegistry.js +4 -1
- package/dist/FontFace.js +7 -95
- package/dist/InitialConfiguration.js +11 -0
- package/dist/Keys.js +32 -0
- package/dist/ManagedStyles.js +83 -0
- package/dist/Render.js +3 -1
- package/dist/Runtimes.js +107 -0
- package/dist/StaticAreaItem.js +3 -9
- package/dist/SystemCSSVars.js +4 -25
- package/dist/UI5Element.js +20 -23
- package/dist/UI5ElementMetadata.js +16 -0
- package/dist/asset-registries/Icons.js +25 -14
- package/dist/assets-meta/IconCollectionsAlias.js +18 -0
- package/dist/config/Theme.js +25 -0
- package/dist/css/FontFace.css +45 -0
- package/dist/css/OverrideFontFace.css +32 -0
- package/dist/css/SystemCSSVars.css +17 -0
- package/dist/features/F6Navigation.js +106 -0
- package/dist/generated/AssetParameters.js +1 -1
- package/dist/generated/VersionInfo.js +10 -0
- package/dist/generated/css/FontFace.css.js +5 -0
- package/dist/generated/css/OverrideFontFace.css.js +5 -0
- package/dist/generated/css/SystemCSSVars.css.js +5 -0
- package/dist/i18nBundle.js +32 -2
- package/dist/renderer/LitRenderer.js +6 -4
- package/dist/renderer/directives/style-map.js +72 -0
- package/dist/resources/bundle.esm.js +8 -8
- package/dist/resources/bundle.esm.js.map +1 -1
- package/dist/sap/base/security/encodeCSS.js +14 -0
- package/dist/sap/base/security/encodeXML.js +23 -0
- package/dist/sap/base/strings/toHex.js +8 -0
- package/dist/test-resources/pages/i18n.html +1 -3
- package/dist/test-resources/specs/CustomTheme.spec.js +2 -2
- package/dist/test-resources/specs/Theming.spec.js +4 -4
- package/dist/theming/CustomStyle.js +23 -3
- package/dist/theming/applyTheme.js +11 -10
- package/dist/theming/getEffectiveLinksHrefs.js +20 -0
- package/dist/theming/getStylesString.js +4 -2
- package/dist/theming/getThemeDesignerTheme.js +25 -5
- package/dist/theming/preloadLinks.js +23 -0
- package/dist/updateShadowRoot.js +8 -4
- package/dist/util/FocusableElements.js +8 -6
- package/dist/util/InvisibleMessage.js +11 -9
- package/dist/util/TabbableElements.js +4 -0
- package/dist/util/createLinkInHead.js +19 -0
- package/dist/util/escapeRegex.js +10 -0
- package/dist/util/generateHighlightedMarkup.js +42 -0
- package/dist/util/isNodeHidden.js +1 -1
- package/hash.txt +1 -1
- package/lib/generate-styles/index.js +18 -0
- package/lib/generate-version-info/index.js +27 -0
- package/package-scripts.js +8 -3
- package/package.json +5 -4
- package/src/Boot.js +34 -18
- package/src/CSP.js +59 -0
- package/src/CustomElementsRegistry.js +60 -4
- package/src/Device.js +15 -1
- package/src/FeaturesRegistry.js +4 -1
- package/src/FontFace.js +7 -95
- package/src/InitialConfiguration.js +11 -0
- package/src/Keys.js +32 -0
- package/src/ManagedStyles.js +83 -0
- package/src/Render.js +3 -1
- package/src/Runtimes.js +107 -0
- package/src/StaticAreaItem.js +3 -9
- package/src/SystemCSSVars.js +4 -25
- package/src/UI5Element.js +20 -23
- package/src/UI5ElementMetadata.js +16 -0
- package/src/asset-registries/Icons.js +25 -14
- package/src/assets-meta/IconCollectionsAlias.js +18 -0
- package/src/config/Theme.js +25 -0
- package/src/css/FontFace.css +45 -0
- package/src/css/OverrideFontFace.css +32 -0
- package/src/css/SystemCSSVars.css +17 -0
- package/src/features/F6Navigation.js +106 -0
- package/src/i18nBundle.js +32 -2
- package/src/renderer/LitRenderer.js +6 -4
- package/src/renderer/directives/style-map.js +72 -0
- package/src/theming/CustomStyle.js +23 -3
- package/src/theming/applyTheme.js +11 -10
- package/src/theming/getEffectiveLinksHrefs.js +20 -0
- package/src/theming/getStylesString.js +4 -2
- package/src/theming/getThemeDesignerTheme.js +25 -5
- package/src/theming/preloadLinks.js +23 -0
- package/src/updateShadowRoot.js +8 -4
- package/src/util/FocusableElements.js +8 -6
- package/src/util/InvisibleMessage.js +11 -9
- package/src/util/TabbableElements.js +4 -0
- package/src/util/createLinkInHead.js +19 -0
- package/src/util/escapeRegex.js +10 -0
- package/src/util/generateHighlightedMarkup.js +42 -0
- package/src/util/isNodeHidden.js +1 -1
- package/used-modules.txt +4 -1
- package/dist/theming/createThemePropertiesStyleTag.js +0 -20
- package/dist/util/encodeCSS.js +0 -24
- package/src/theming/createThemePropertiesStyleTag.js +0 -20
- package/src/util/encodeCSS.js +0 -24
package/src/Boot.js
CHANGED
|
@@ -1,40 +1,56 @@
|
|
|
1
|
-
import EventProvider from "./EventProvider.js";
|
|
2
1
|
import whenDOMReady from "./util/whenDOMReady.js";
|
|
3
2
|
import insertFontFace from "./FontFace.js";
|
|
4
3
|
import insertSystemCSSVars from "./SystemCSSVars.js";
|
|
5
4
|
import { getTheme } from "./config/Theme.js";
|
|
6
5
|
import applyTheme from "./theming/applyTheme.js";
|
|
6
|
+
import { registerCurrentRuntime } from "./Runtimes.js";
|
|
7
7
|
import { getFeature } from "./FeaturesRegistry.js";
|
|
8
8
|
|
|
9
|
-
let
|
|
10
|
-
const eventProvider = new EventProvider();
|
|
9
|
+
let bootPromise;
|
|
11
10
|
|
|
12
11
|
/**
|
|
13
12
|
* Attach a callback that will be executed on boot
|
|
14
13
|
* @public
|
|
15
14
|
* @param listener
|
|
16
15
|
*/
|
|
17
|
-
const attachBoot = listener => {
|
|
18
|
-
|
|
16
|
+
const attachBoot = async listener => {
|
|
17
|
+
await boot();
|
|
18
|
+
listener();
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
const boot = async () => {
|
|
22
|
-
if (
|
|
23
|
-
return;
|
|
22
|
+
if (bootPromise) {
|
|
23
|
+
return bootPromise;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
/* eslint-disable no-alert, no-async-promise-executor */
|
|
27
|
+
/*
|
|
28
|
+
Note(since we disable eslint rule):
|
|
29
|
+
If an async executor function throws an error, the error will be lost and won't cause the newly-constructed Promise to reject.
|
|
30
|
+
This could make it difficult to debug and handle some errors.
|
|
31
|
+
*/
|
|
32
|
+
bootPromise = new Promise(async resolve => {
|
|
33
|
+
registerCurrentRuntime();
|
|
34
|
+
|
|
35
|
+
const OpenUI5Support = getFeature("OpenUI5Support");
|
|
36
|
+
const F6Navigation = getFeature("F6Navigation");
|
|
37
|
+
if (OpenUI5Support) {
|
|
38
|
+
await OpenUI5Support.init();
|
|
39
|
+
} else if (F6Navigation) {
|
|
40
|
+
F6Navigation.init();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
await whenDOMReady();
|
|
44
|
+
await applyTheme(getTheme());
|
|
45
|
+
OpenUI5Support && OpenUI5Support.attachListeners();
|
|
46
|
+
insertFontFace();
|
|
47
|
+
insertSystemCSSVars();
|
|
48
|
+
|
|
49
|
+
resolve();
|
|
50
|
+
});
|
|
51
|
+
/* eslint-enable no-alert, no-async-promise-executor */
|
|
30
52
|
|
|
31
|
-
|
|
32
|
-
await applyTheme(getTheme());
|
|
33
|
-
OpenUI5Support && OpenUI5Support.attachListeners();
|
|
34
|
-
insertFontFace();
|
|
35
|
-
insertSystemCSSVars();
|
|
36
|
-
await eventProvider.fireEventAsync("boot");
|
|
37
|
-
booted = true;
|
|
53
|
+
return bootPromise;
|
|
38
54
|
};
|
|
39
55
|
|
|
40
56
|
export {
|
package/src/CSP.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const roots = new Map();
|
|
2
|
+
let useLinks = false;
|
|
3
|
+
let preloadLinks = true;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Use this function to provide the path to the directory where the css resources for the given package will be served from
|
|
7
|
+
*
|
|
8
|
+
* @public
|
|
9
|
+
* @param packageName name of the package that is being configured
|
|
10
|
+
* @param root path, accessible by the server that will serve the css resources
|
|
11
|
+
*/
|
|
12
|
+
const setPackageCSSRoot = (packageName, root) => {
|
|
13
|
+
roots.set(packageName, root);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const getUrl = (packageName, path) => {
|
|
17
|
+
return `${roots.get(packageName)}${path}`;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Call this function to enable or disable the usage of <link> tags instead of <style> tags to achieve CSP compliance
|
|
22
|
+
* Example: "setUseLinks(true)" will unconditionally use <link> tags for all browsers;
|
|
23
|
+
* Example: "setUseLinks(!document.adoptedStyleSheets) will only enable the usage of <link> tags for browsers that do not support constructable stylesheets.
|
|
24
|
+
*
|
|
25
|
+
* @public
|
|
26
|
+
* @param use whether links will be used
|
|
27
|
+
*/
|
|
28
|
+
const setUseLinks = use => {
|
|
29
|
+
useLinks = use;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Call this function to enable or disable the preloading of <link> tags.
|
|
34
|
+
* Note: only taken into account when <link> tags are being used.
|
|
35
|
+
* Note: links are being preloaded by default, so call "setPreloadLinks(false)" to opt out of this.
|
|
36
|
+
*
|
|
37
|
+
* @public
|
|
38
|
+
* @param preload
|
|
39
|
+
*/
|
|
40
|
+
const setPreloadLinks = preload => {
|
|
41
|
+
preloadLinks = preload;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const shouldUseLinks = () => {
|
|
45
|
+
return useLinks;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const shouldPreloadLinks = () => {
|
|
49
|
+
return preloadLinks;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
setPackageCSSRoot,
|
|
54
|
+
getUrl,
|
|
55
|
+
setUseLinks,
|
|
56
|
+
setPreloadLinks,
|
|
57
|
+
shouldUseLinks,
|
|
58
|
+
shouldPreloadLinks,
|
|
59
|
+
};
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
import setToArray from "./util/setToArray.js";
|
|
2
|
+
import getSharedResource from "./getSharedResource.js";
|
|
3
|
+
import { getCurrentRuntimeIndex, compareRuntimes, getAllRuntimes } from "./Runtimes.js";
|
|
4
|
+
|
|
5
|
+
const Tags = getSharedResource("Tags", new Map());
|
|
2
6
|
|
|
3
7
|
const Definitions = new Set();
|
|
4
|
-
|
|
8
|
+
let Failures = {};
|
|
5
9
|
let failureTimeout;
|
|
6
10
|
|
|
11
|
+
const UNKNOWN_RUNTIME = "unknown";
|
|
12
|
+
|
|
7
13
|
const registerTag = tag => {
|
|
8
14
|
Definitions.add(tag);
|
|
15
|
+
Tags.set(tag, getCurrentRuntimeIndex());
|
|
9
16
|
};
|
|
10
17
|
|
|
11
18
|
const isTagRegistered = tag => {
|
|
@@ -17,18 +24,67 @@ const getAllRegisteredTags = () => {
|
|
|
17
24
|
};
|
|
18
25
|
|
|
19
26
|
const recordTagRegistrationFailure = tag => {
|
|
20
|
-
|
|
27
|
+
let tagRegRuntimeIndex = Tags.get(tag);
|
|
28
|
+
if (tagRegRuntimeIndex === undefined) {
|
|
29
|
+
tagRegRuntimeIndex = UNKNOWN_RUNTIME; // If the tag is taken, but not registered in Tags, then a version before 1.1.0 defined it => use the "unknown" key
|
|
30
|
+
}
|
|
31
|
+
Failures[tagRegRuntimeIndex] = Failures[tagRegRuntimeIndex] || new Set();
|
|
32
|
+
Failures[tagRegRuntimeIndex].add(tag);
|
|
33
|
+
|
|
21
34
|
if (!failureTimeout) {
|
|
22
35
|
failureTimeout = setTimeout(() => {
|
|
23
36
|
displayFailedRegistrations();
|
|
37
|
+
Failures = {};
|
|
24
38
|
failureTimeout = undefined;
|
|
25
39
|
}, 1000);
|
|
26
40
|
}
|
|
27
41
|
};
|
|
28
42
|
|
|
29
43
|
const displayFailedRegistrations = () => {
|
|
30
|
-
|
|
31
|
-
|
|
44
|
+
const allRuntimes = getAllRuntimes();
|
|
45
|
+
const currentRuntimeIndex = getCurrentRuntimeIndex();
|
|
46
|
+
const currentRuntime = allRuntimes[currentRuntimeIndex];
|
|
47
|
+
|
|
48
|
+
let message = `Multiple UI5 Web Components instances detected.`;
|
|
49
|
+
|
|
50
|
+
if (allRuntimes.length > 1) {
|
|
51
|
+
message = `${message}\nLoading order (versions before 1.1.0 not listed): ${allRuntimes.map(runtime => `\n${runtime.description}`).join("")}`;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
Object.keys(Failures).forEach(otherRuntimeIndex => {
|
|
55
|
+
let comparison;
|
|
56
|
+
let otherRuntime;
|
|
57
|
+
|
|
58
|
+
if (otherRuntimeIndex === UNKNOWN_RUNTIME) { // version < 1.1.0 defined the tag
|
|
59
|
+
comparison = 1; // the current runtime is considered newer
|
|
60
|
+
otherRuntime = {
|
|
61
|
+
description: `Older unknown runtime`,
|
|
62
|
+
};
|
|
63
|
+
} else {
|
|
64
|
+
comparison = compareRuntimes(currentRuntimeIndex, otherRuntimeIndex);
|
|
65
|
+
otherRuntime = allRuntimes[otherRuntimeIndex];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let compareWord;
|
|
69
|
+
if (comparison > 0) {
|
|
70
|
+
compareWord = "an older";
|
|
71
|
+
} else if (comparison < 0) {
|
|
72
|
+
compareWord = "a newer";
|
|
73
|
+
} else {
|
|
74
|
+
compareWord = "the same";
|
|
75
|
+
}
|
|
76
|
+
message = `${message}\n\n"${currentRuntime.description}" failed to define ${Failures[otherRuntimeIndex].size} tag(s) as they were defined by a runtime of ${compareWord} version "${otherRuntime.description}": ${setToArray(Failures[otherRuntimeIndex]).sort().join(", ")}.`;
|
|
77
|
+
|
|
78
|
+
if (comparison > 0) {
|
|
79
|
+
message = `${message}\nWARNING! If your code uses features of the above web components, unavailable in ${otherRuntime.description}, it might not work as expected!`;
|
|
80
|
+
} else {
|
|
81
|
+
message = `${message}\nSince the above web components were defined by the same or newer version runtime, they should be compatible with your code.`;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
message = `${message}\n\nTo prevent other runtimes from defining tags that you use, consider using scoping or have third-party libraries use scoping: https://github.com/SAP/ui5-webcomponents/blob/master/docs/2-advanced/03-scoping.md.`;
|
|
86
|
+
|
|
87
|
+
console.warn(message); // eslint-disable-line
|
|
32
88
|
};
|
|
33
89
|
|
|
34
90
|
export {
|
package/src/Device.js
CHANGED
|
@@ -5,9 +5,13 @@ const chrome = !ie && /(Chrome|CriOS)/.test(ua);
|
|
|
5
5
|
const safari = !ie && !chrome && /(Version|PhantomJS)\/(\d+\.\d+).*Safari/.test(ua);
|
|
6
6
|
const webkit = !ie && /webkit/.test(ua);
|
|
7
7
|
const windows = navigator.platform.indexOf("Win") !== -1;
|
|
8
|
+
const iOS = navigator.platform.match(/iPhone|iPad|iPod/) || (navigator.userAgent.match(/Mac/) && "ontouchend" in document);
|
|
8
9
|
const android = !windows && /Android/.test(ua);
|
|
9
10
|
const androidPhone = android && /(?=android)(?=.*mobile)/i.test(ua);
|
|
10
|
-
const ipad = /ipad/i.test(ua);
|
|
11
|
+
const ipad = /ipad/i.test(ua) || (/Macintosh/i.test(ua) && "ontouchend" in document);
|
|
12
|
+
// With iOS 13 the string 'iPad' was removed from the user agent string through a browser setting, which is applied on all sites by default:
|
|
13
|
+
// "Request Desktop Website -> All websites" (for more infos see: https://forums.developer.apple.com/thread/119186).
|
|
14
|
+
// Therefore the OS is detected as MACINTOSH instead of iOS and the device is a tablet if the Device.support.touch is true.
|
|
11
15
|
|
|
12
16
|
let windowsVersion;
|
|
13
17
|
let webkitVersion;
|
|
@@ -91,6 +95,14 @@ const isDesktop = () => {
|
|
|
91
95
|
return (!isTablet() && !isPhone()) || isWindows8OrAbove();
|
|
92
96
|
};
|
|
93
97
|
|
|
98
|
+
const isCombi = () => {
|
|
99
|
+
return isTablet() && isDesktop();
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const isIOS = () => {
|
|
103
|
+
return iOS;
|
|
104
|
+
};
|
|
105
|
+
|
|
94
106
|
export {
|
|
95
107
|
supportsTouch,
|
|
96
108
|
isIE,
|
|
@@ -99,4 +111,6 @@ export {
|
|
|
99
111
|
isPhone,
|
|
100
112
|
isTablet,
|
|
101
113
|
isDesktop,
|
|
114
|
+
isCombi,
|
|
115
|
+
isIOS,
|
|
102
116
|
};
|
package/src/FeaturesRegistry.js
CHANGED
package/src/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
|
-
|
|
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 (!
|
|
108
|
-
|
|
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 (!
|
|
114
|
-
|
|
25
|
+
if (!hasStyle("data-ui5-font-face-override")) {
|
|
26
|
+
createStyle(overrideFontFaceCSS, "data-ui5-font-face-override");
|
|
115
27
|
}
|
|
116
28
|
};
|
|
117
29
|
|
|
@@ -106,6 +106,14 @@ const parseURLParameters = () => {
|
|
|
106
106
|
});
|
|
107
107
|
};
|
|
108
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
|
+
|
|
109
117
|
const applyURLParam = (key, value, paramType) => {
|
|
110
118
|
const lowerCaseValue = value.toLowerCase();
|
|
111
119
|
const param = key.split(`${paramType}-`)[1];
|
|
@@ -113,6 +121,9 @@ const applyURLParam = (key, value, paramType) => {
|
|
|
113
121
|
if (booleanMapping.has(value)) {
|
|
114
122
|
value = booleanMapping.get(lowerCaseValue);
|
|
115
123
|
}
|
|
124
|
+
|
|
125
|
+
value = normalizeParamValue(param, value);
|
|
126
|
+
|
|
116
127
|
initialConfig[param] = value;
|
|
117
128
|
};
|
|
118
129
|
|
package/src/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);
|
|
@@ -145,8 +153,12 @@ const isEnd = event => (event.key ? event.key === "End" : event.keyCode === KeyC
|
|
|
145
153
|
|
|
146
154
|
const isHomeCtrl = event => (event.key ? event.key === "Home" : event.keyCode === KeyCodes.HOME) && checkModifierKeys(event, true, false, false);
|
|
147
155
|
|
|
156
|
+
const isHomeShift = event => (event.key ? event.key === "Home" : event.keyCode === KeyCodes.HOME) && checkModifierKeys(event, false, false, true);
|
|
157
|
+
|
|
148
158
|
const isEndCtrl = event => (event.key ? event.key === "End" : event.keyCode === KeyCodes.END) && checkModifierKeys(event, true, false, false);
|
|
149
159
|
|
|
160
|
+
const isEndShift = event => (event.key ? event.key === "End" : event.keyCode === KeyCodes.END) && checkModifierKeys(event, false, false, true);
|
|
161
|
+
|
|
150
162
|
const isEscape = event => (event.key ? event.key === "Escape" || event.key === "Esc" : event.keyCode === KeyCodes.ESCAPE) && !hasModifierKeys(event);
|
|
151
163
|
|
|
152
164
|
const isTabNext = event => (event.key ? event.key === "Tab" : event.keyCode === KeyCodes.TAB) && !hasModifierKeys(event);
|
|
@@ -191,12 +203,22 @@ const isF4 = event => {
|
|
|
191
203
|
|
|
192
204
|
const isF4Shift = event => (event.key ? event.key === "F4" : event.keyCode === KeyCodes.F4) && checkModifierKeys(event, false, false, true);
|
|
193
205
|
|
|
206
|
+
const isF6Next = event => ((event.key ? event.key === "F6" : event.keyCode === KeyCodes.F6) && checkModifierKeys(event, false, false, false))
|
|
207
|
+
|| ((event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, true, true, false));
|
|
208
|
+
|
|
209
|
+
const isF6Previous = event => ((event.key ? event.key === "F6" : event.keyCode === KeyCodes.F6) && checkModifierKeys(event, false, false, true))
|
|
210
|
+
|| ((event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_Up) && checkModifierKeys(event, true, true, false));
|
|
211
|
+
|
|
194
212
|
const isF7 = event => (event.key ? event.key === "F7" : event.keyCode === KeyCodes.F7) && !hasModifierKeys(event);
|
|
195
213
|
|
|
196
214
|
const isShowByArrows = event => {
|
|
197
215
|
return ((event.key === "ArrowDown" || event.key === "Down") || (event.key === "ArrowUp" || event.key === "Up")) && checkModifierKeys(event, /* Ctrl */ false, /* Alt */ true, /* Shift */ false);
|
|
198
216
|
};
|
|
199
217
|
|
|
218
|
+
const isShift = event => event.key === "Shift" || event.keyCode === KeyCodes.SHIFT;
|
|
219
|
+
|
|
220
|
+
const isCtrlA = event => ((event.key === "A" || event.key === "a") || event.which === KeyCodes.A) && checkModifierKeys(event, true, false, false);
|
|
221
|
+
|
|
200
222
|
const hasModifierKeys = event => event.shiftKey || event.altKey || getCtrlKey(event);
|
|
201
223
|
|
|
202
224
|
const getCtrlKey = event => !!(event.metaKey || event.ctrlKey); // double negation doesn't have effect on boolean but ensures null and undefined are equivalent to false.
|
|
@@ -218,8 +240,12 @@ export {
|
|
|
218
240
|
isDownCtrl,
|
|
219
241
|
isUpShift,
|
|
220
242
|
isDownShift,
|
|
243
|
+
isUpAlt,
|
|
244
|
+
isDownAlt,
|
|
221
245
|
isLeftShift,
|
|
222
246
|
isRightShift,
|
|
247
|
+
isLeftShiftCtrl,
|
|
248
|
+
isRightShiftCtrl,
|
|
223
249
|
isUpShiftCtrl,
|
|
224
250
|
isDownShiftCtrl,
|
|
225
251
|
isHome,
|
|
@@ -228,6 +254,8 @@ export {
|
|
|
228
254
|
isMinus,
|
|
229
255
|
isHomeCtrl,
|
|
230
256
|
isEndCtrl,
|
|
257
|
+
isHomeShift,
|
|
258
|
+
isEndShift,
|
|
231
259
|
isEscape,
|
|
232
260
|
isTabNext,
|
|
233
261
|
isTabPrevious,
|
|
@@ -236,6 +264,8 @@ export {
|
|
|
236
264
|
isShow,
|
|
237
265
|
isF4,
|
|
238
266
|
isF4Shift,
|
|
267
|
+
isF6Previous,
|
|
268
|
+
isF6Next,
|
|
239
269
|
isF7,
|
|
240
270
|
isPageUp,
|
|
241
271
|
isPageDown,
|
|
@@ -245,4 +275,6 @@ export {
|
|
|
245
275
|
isPageDownAlt,
|
|
246
276
|
isPageUpShiftCtrl,
|
|
247
277
|
isPageDownShiftCtrl,
|
|
278
|
+
isShift,
|
|
279
|
+
isCtrlA,
|
|
248
280
|
};
|
|
@@ -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/src/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
|
-
|
|
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
|
});
|