@ui5/webcomponents-base 0.0.0-db2be6526 → 0.0.0-dc3ccac50
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/dist/CSP.js +59 -0
- package/dist/FontFace.js +2 -102
- package/dist/ManagedStyles.js +52 -5
- package/dist/Render.js +3 -1
- package/dist/StaticAreaItem.js +0 -9
- package/dist/SystemCSSVars.js +1 -20
- package/dist/UI5Element.js +13 -21
- package/dist/UI5ElementMetadata.js +8 -0
- package/dist/asset-registries/Icons.js +25 -14
- package/dist/assets-meta/IconCollectionsAlias.js +18 -0
- package/dist/config/Theme.js +14 -0
- package/dist/css/FontFace.css +45 -0
- package/dist/css/OverrideFontFace.css +32 -0
- package/dist/css/SystemCSSVars.css +17 -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/renderer/LitRenderer.js +5 -3
- package/dist/resources/bundle.esm.js +8 -8
- package/dist/resources/bundle.esm.js.map +1 -1
- package/dist/theming/applyTheme.js +4 -7
- package/dist/theming/getEffectiveLinksHrefs.js +20 -0
- package/dist/theming/getStylesString.js +4 -2
- package/dist/theming/preloadLinks.js +23 -0
- package/dist/updateShadowRoot.js +8 -4
- package/dist/util/createLinkInHead.js +19 -0
- package/hash.txt +1 -1
- package/lib/generate-styles/index.js +18 -0
- package/package-scripts.js +6 -3
- package/package.json +4 -3
- package/src/CSP.js +59 -0
- package/src/FontFace.js +2 -102
- package/src/ManagedStyles.js +52 -5
- package/src/Render.js +3 -1
- package/src/StaticAreaItem.js +0 -9
- package/src/SystemCSSVars.js +1 -20
- package/src/UI5Element.js +13 -21
- package/src/UI5ElementMetadata.js +8 -0
- package/src/asset-registries/Icons.js +25 -14
- package/src/assets-meta/IconCollectionsAlias.js +18 -0
- package/src/config/Theme.js +14 -0
- package/src/css/FontFace.css +45 -0
- package/src/css/OverrideFontFace.css +32 -0
- package/src/css/SystemCSSVars.css +17 -0
- package/src/renderer/LitRenderer.js +5 -3
- package/src/theming/applyTheme.js +4 -7
- package/src/theming/getEffectiveLinksHrefs.js +20 -0
- package/src/theming/getStylesString.js +4 -2
- package/src/theming/preloadLinks.js +23 -0
- package/src/updateShadowRoot.js +8 -4
- package/src/util/createLinkInHead.js +19 -0
- package/dist/theming/createThemePropertiesStyleTag.js +0 -16
- package/src/theming/createThemePropertiesStyleTag.js +0 -16
package/dist/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
|
+
};
|
package/dist/FontFace.js
CHANGED
|
@@ -1,107 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CSS font face used for the texts provided by SAP.
|
|
3
|
-
*/
|
|
4
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 font72BlackWoff = `https://openui5nightly.hana.ondemand.com/resources/sap/ui/core/themes/sap_horizon/fonts/72-Black.woff?ui5-webcomponents`;
|
|
21
|
-
const font72BlackWoff2 = `https://openui5nightly.hana.ondemand.com/resources/sap/ui/core/themes/sap_horizon/fonts/72-Black.woff2?ui5-webcomponents`;
|
|
22
|
-
|
|
23
|
-
const fontFaceCSS = `
|
|
24
|
-
@font-face {
|
|
25
|
-
font-family: "72";
|
|
26
|
-
font-style: normal;
|
|
27
|
-
font-weight: 400;
|
|
28
|
-
src: local("72"),
|
|
29
|
-
url(${font72RegularWoff2}) format("woff2"),
|
|
30
|
-
url(${font72RegularWoff}) format("woff");
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
@font-face {
|
|
34
|
-
font-family: "72full";
|
|
35
|
-
font-style: normal;
|
|
36
|
-
font-weight: 400;
|
|
37
|
-
src: local('72-full'),
|
|
38
|
-
url(${font72RegularFullWoff2}) format("woff2"),
|
|
39
|
-
url(${font72RegularFullWoff}) format("woff");
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
@font-face {
|
|
44
|
-
font-family: "72";
|
|
45
|
-
font-style: normal;
|
|
46
|
-
font-weight: 700;
|
|
47
|
-
src: local('72-Bold'),
|
|
48
|
-
url(${font72BoldWoff2}) format("woff2"),
|
|
49
|
-
url(${font72BoldWoff}) format("woff");
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
@font-face {
|
|
53
|
-
font-family: "72full";
|
|
54
|
-
font-style: normal;
|
|
55
|
-
font-weight: 700;
|
|
56
|
-
src: local('72-Bold-full'),
|
|
57
|
-
url(${font72BoldFullWoff2}) format("woff2"),
|
|
58
|
-
url(${font72BoldFullWoff}) format("woff");
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
@font-face {
|
|
62
|
-
font-family: "72Black";
|
|
63
|
-
font-style: bold;
|
|
64
|
-
font-weight: 900;
|
|
65
|
-
src: local('72Black'),
|
|
66
|
-
url(${font72BlackWoff2}) format("woff2"),
|
|
67
|
-
url(${font72BlackWoff}) format("woff");
|
|
68
|
-
}
|
|
69
|
-
`;
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Some diacritics are supported by the 72 font:
|
|
73
|
-
* * Grave
|
|
74
|
-
* * Acute
|
|
75
|
-
* * Circumflex
|
|
76
|
-
* * Tilde
|
|
77
|
-
*
|
|
78
|
-
* However, the following diacritics and the combination of multiple diacritics (including the supported ones) are not supported:
|
|
79
|
-
* * Breve
|
|
80
|
-
* * Horn
|
|
81
|
-
* * Dot below
|
|
82
|
-
* * Hook above
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
* Override for the characters that aren't covered by the '72' font to other system fonts
|
|
86
|
-
*
|
|
87
|
-
* U+0102-0103: A and a with Breve
|
|
88
|
-
* U+01A0-01A1: O and o with Horn
|
|
89
|
-
* U+01AF-01B0: U and u with Horn
|
|
90
|
-
* U+1EA0-1EB7: A and a with diacritics that are not supported by the font and combination of multiple diacritics
|
|
91
|
-
* U+1EB8-1EC7: E and e with diacritics that are not supported by the font and combination of multiple diacritics
|
|
92
|
-
* U+1EC8-1ECB: I and i with diacritics that are not supported by the font and combination of multiple diacritics
|
|
93
|
-
* U+1ECC-1EE3: O and o with diacritics that are not supported by the font and combination of multiple diacritics
|
|
94
|
-
* U+1EE4-1EF1: U and u with diacritics that are not supported by the font and combination of multiple diacritics
|
|
95
|
-
* U+1EF4-1EF7: Y and y with diacritics that are not supported by the font and combination of multiple diacritics
|
|
96
|
-
*
|
|
97
|
-
*/
|
|
98
|
-
const overrideFontFaceCSS = `
|
|
99
|
-
@font-face {
|
|
100
|
-
font-family: '72override';
|
|
101
|
-
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;
|
|
102
|
-
src: local('Arial'), local('Helvetica'), local('sans-serif');
|
|
103
|
-
}
|
|
104
|
-
`;
|
|
3
|
+
import fontFaceCSS from "./generated/css/FontFace.css.js";
|
|
4
|
+
import overrideFontFaceCSS from "./generated/css/OverrideFontFace.css.js";
|
|
105
5
|
|
|
106
6
|
const insertFontFace = () => {
|
|
107
7
|
const OpenUI5Support = getFeature("OpenUI5Support");
|
package/dist/ManagedStyles.js
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import createStyleInHead from "./util/createStyleInHead.js";
|
|
2
|
+
import createLinkInHead from "./util/createLinkInHead.js";
|
|
3
|
+
import { shouldUseLinks, getUrl } from "./CSP.js";
|
|
2
4
|
|
|
3
5
|
const getStyleId = (name, value) => {
|
|
4
6
|
return value ? `${name}|${value}` : name;
|
|
5
7
|
};
|
|
6
8
|
|
|
7
|
-
const createStyle = (
|
|
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) {
|
|
9
18
|
const stylesheet = new CSSStyleSheet();
|
|
10
19
|
stylesheet.replaceSync(content);
|
|
11
20
|
stylesheet._ui5StyleId = getStyleId(name, value); // set an id so that we can find the style later
|
|
@@ -17,8 +26,12 @@ const createStyle = (content, name, value = "") => {
|
|
|
17
26
|
}
|
|
18
27
|
};
|
|
19
28
|
|
|
20
|
-
const updateStyle = (
|
|
21
|
-
|
|
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) {
|
|
22
35
|
document.adoptedStyleSheets.find(sh => sh._ui5StyleId === getStyleId(name, value)).replaceSync(content || "");
|
|
23
36
|
} else {
|
|
24
37
|
document.querySelector(`head>style[${name}="${value}"]`).textContent = content || "";
|
|
@@ -26,6 +39,10 @@ const updateStyle = (content, name, value = "") => {
|
|
|
26
39
|
};
|
|
27
40
|
|
|
28
41
|
const hasStyle = (name, value = "") => {
|
|
42
|
+
if (shouldUseLinks()) {
|
|
43
|
+
return !!document.querySelector(`head>link[${name}="${value}"]`);
|
|
44
|
+
}
|
|
45
|
+
|
|
29
46
|
if (document.adoptedStyleSheets) {
|
|
30
47
|
return !!document.adoptedStyleSheets.find(sh => sh._ui5StyleId === getStyleId(name, value));
|
|
31
48
|
}
|
|
@@ -33,4 +50,34 @@ const hasStyle = (name, value = "") => {
|
|
|
33
50
|
return !!document.querySelector(`head>style[${name}="${value}"]`);
|
|
34
51
|
};
|
|
35
52
|
|
|
36
|
-
|
|
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
|
-
|
|
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
|
});
|
package/dist/StaticAreaItem.js
CHANGED
|
@@ -76,15 +76,6 @@ class StaticAreaItem extends HTMLElement {
|
|
|
76
76
|
return this.shadowRoot;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
/**
|
|
80
|
-
* @protected
|
|
81
|
-
* @param refName
|
|
82
|
-
* @returns {Element}
|
|
83
|
-
*/
|
|
84
|
-
getStableDomRef(refName) {
|
|
85
|
-
return this.shadowRoot.querySelector(`[data-ui5-stable=${refName}]`);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
79
|
static getTag() {
|
|
89
80
|
const pureTag = "ui5-static-area-item";
|
|
90
81
|
const suffix = getEffectiveScopingSuffixForTag(pureTag);
|
package/dist/SystemCSSVars.js
CHANGED
|
@@ -1,24 +1,5 @@
|
|
|
1
1
|
import { hasStyle, createStyle } from "./ManagedStyles.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
|
-
`;
|
|
2
|
+
import systemCSSVars from "./generated/css/SystemCSSVars.css.js";
|
|
22
3
|
|
|
23
4
|
const insertSystemCSSVars = () => {
|
|
24
5
|
if (!hasStyle("data-ui5-system-css-vars")) {
|
package/dist/UI5Element.js
CHANGED
|
@@ -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
|
|
21
|
+
import preloadLinks from "./theming/preloadLinks.js";
|
|
22
22
|
|
|
23
23
|
let autoId = 0;
|
|
24
24
|
|
|
@@ -607,25 +607,27 @@ class UI5Element extends HTMLElement {
|
|
|
607
607
|
|
|
608
608
|
/**
|
|
609
609
|
* Returns the DOM Element inside the Shadow Root that corresponds to the opening tag in the UI5 Web Component's template
|
|
610
|
+
* *Note:* For logical (abstract) elements (items, options, etc...), returns the part of the parent's DOM that represents this option
|
|
610
611
|
* Use this method instead of "this.shadowRoot" to read the Shadow DOM, if ever necessary
|
|
612
|
+
*
|
|
611
613
|
* @public
|
|
612
614
|
*/
|
|
613
615
|
getDomRef() {
|
|
616
|
+
// If a component set _getRealDomRef to its children, use the return value of this function
|
|
617
|
+
if (typeof this._getRealDomRef === "function") {
|
|
618
|
+
return this._getRealDomRef();
|
|
619
|
+
}
|
|
620
|
+
|
|
614
621
|
if (!this.shadowRoot || this.shadowRoot.children.length === 0) {
|
|
615
622
|
return;
|
|
616
623
|
}
|
|
617
624
|
|
|
618
|
-
this.
|
|
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) {
|
|
625
|
+
const children = [...this.shadowRoot.children].filter(child => !["link", "style"].includes(child.localName));
|
|
626
|
+
if (children.length !== 1) {
|
|
627
627
|
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
628
|
}
|
|
629
|
+
|
|
630
|
+
return children[0];
|
|
629
631
|
}
|
|
630
632
|
|
|
631
633
|
/**
|
|
@@ -651,17 +653,6 @@ class UI5Element extends HTMLElement {
|
|
|
651
653
|
return this.getFocusDomRef();
|
|
652
654
|
}
|
|
653
655
|
|
|
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
656
|
/**
|
|
666
657
|
* Set the focus to the element, returned by "getFocusDomRef()" (marked by "data-sap-focus-ref")
|
|
667
658
|
* @public
|
|
@@ -988,6 +979,7 @@ class UI5Element extends HTMLElement {
|
|
|
988
979
|
this._generateAccessors();
|
|
989
980
|
registerTag(tag);
|
|
990
981
|
window.customElements.define(tag, this);
|
|
982
|
+
preloadLinks(this);
|
|
991
983
|
|
|
992
984
|
if (altTag && !customElements.get(altTag)) {
|
|
993
985
|
registerTag(altTag);
|
|
@@ -212,6 +212,14 @@ class UI5ElementMetadata {
|
|
|
212
212
|
return !!this.metadata.languageAware;
|
|
213
213
|
}
|
|
214
214
|
|
|
215
|
+
/**
|
|
216
|
+
* Determines whether this UI5 Element has any theme dependant carachteristics.
|
|
217
|
+
* @returns {boolean}
|
|
218
|
+
*/
|
|
219
|
+
isThemeAware() {
|
|
220
|
+
return !!this.metadata.themeAware;
|
|
221
|
+
}
|
|
222
|
+
|
|
215
223
|
/**
|
|
216
224
|
* Matches a changed entity (property/slot) with the given name against the "invalidateOnChildChange" configuration
|
|
217
225
|
* 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 =
|
|
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 ||
|
|
71
|
-
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
//
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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,
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supported icon collection names and aliases.
|
|
3
|
+
*
|
|
4
|
+
* Users might specify a collection, using both the key and the value in the following key-value pairs,
|
|
5
|
+
* e.g the following pairs are completely exchangeable:
|
|
6
|
+
* "SAP-icons-TNT/actor" and "tnt/actor", "BusinessSuiteInAppSymbols/3d" and "business-suite/3d",
|
|
7
|
+
* "SAP-icons-v5/accept" and "horizon/accept".
|
|
8
|
+
*
|
|
9
|
+
* Note: technically, in the code we maintain the collections under the "value" name - "tnt", "business-suite",
|
|
10
|
+
* SAP-icons-v5" and "SAP-icons"(which does not have an alias).
|
|
11
|
+
*/
|
|
12
|
+
const IconCollectionsAlias = {
|
|
13
|
+
"SAP-icons-TNT": "tnt",
|
|
14
|
+
"BusinessSuiteInAppSymbols": "business-suite",
|
|
15
|
+
"horizon": "SAP-icons-v5",
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export default IconCollectionsAlias;
|
package/dist/config/Theme.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getTheme as getConfiguredTheme } from "../InitialConfiguration.js";
|
|
2
|
+
import { reRenderAllUI5Elements } from "../Render.js";
|
|
2
3
|
import applyTheme from "../theming/applyTheme.js";
|
|
3
4
|
|
|
4
5
|
let theme;
|
|
@@ -20,9 +21,22 @@ const setTheme = async newTheme => {
|
|
|
20
21
|
|
|
21
22
|
// Update CSS Custom Properties
|
|
22
23
|
await applyTheme(theme);
|
|
24
|
+
await reRenderAllUI5Elements({ themeAware: true });
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Returns if the given theme name is the one currently applied.
|
|
29
|
+
* @private
|
|
30
|
+
* @param {String}
|
|
31
|
+
* @returns {boolean}
|
|
32
|
+
*/
|
|
33
|
+
const isTheme = _theme => {
|
|
34
|
+
const currentTheme = getTheme();
|
|
35
|
+
return currentTheme === _theme || currentTheme === `${_theme}_exp`;
|
|
23
36
|
};
|
|
24
37
|
|
|
25
38
|
export {
|
|
26
39
|
getTheme,
|
|
27
40
|
setTheme,
|
|
41
|
+
isTheme,
|
|
28
42
|
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
@font-face {
|
|
2
|
+
font-family: "72";
|
|
3
|
+
font-style: normal;
|
|
4
|
+
font-weight: 400;
|
|
5
|
+
src: local("72"),
|
|
6
|
+
url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular.woff?ui5-webcomponents) format("woff2"),
|
|
7
|
+
url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular.woff2?ui5-webcomponents) format("woff");
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
@font-face {
|
|
11
|
+
font-family: "72full";
|
|
12
|
+
font-style: normal;
|
|
13
|
+
font-weight: 400;
|
|
14
|
+
src: local('72-full'),
|
|
15
|
+
url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular-full.woff?ui5-webcomponents) format("woff2"),
|
|
16
|
+
url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular-full.woff2?ui5-webcomponents) format("woff");
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@font-face {
|
|
21
|
+
font-family: "72";
|
|
22
|
+
font-style: normal;
|
|
23
|
+
font-weight: 700;
|
|
24
|
+
src: local('72-Bold'),
|
|
25
|
+
url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold.woff?ui5-webcomponents) format("woff2"),
|
|
26
|
+
url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold.woff2?ui5-webcomponents) format("woff");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@font-face {
|
|
30
|
+
font-family: "72full";
|
|
31
|
+
font-style: normal;
|
|
32
|
+
font-weight: 700;
|
|
33
|
+
src: local('72-Bold-full'),
|
|
34
|
+
url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold-full.woff?ui5-webcomponents) format("woff2"),
|
|
35
|
+
url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold-full.woff2?ui5-webcomponents) format("woff");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@font-face {
|
|
39
|
+
font-family: "72Black";
|
|
40
|
+
font-style: bold;
|
|
41
|
+
font-weight: 900;
|
|
42
|
+
src: local('72Black'),
|
|
43
|
+
url(https://openui5nightly.hana.ondemand.com/resources/sap/ui/core/themes/sap_horizon/fonts/72-Black.woff?ui5-webcomponents) format("woff2"),
|
|
44
|
+
url(https://openui5nightly.hana.ondemand.com/resources/sap/ui/core/themes/sap_horizon/fonts/72-Black.woff2?ui5-webcomponents) format("woff");
|
|
45
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Some diacritics are supported by the 72 font:
|
|
3
|
+
* * Grave
|
|
4
|
+
* * Acute
|
|
5
|
+
* * Circumflex
|
|
6
|
+
* * Tilde
|
|
7
|
+
*
|
|
8
|
+
* However, the following diacritics and the combination of multiple diacritics (including the supported ones) are not supported:
|
|
9
|
+
* * Breve
|
|
10
|
+
* * Horn
|
|
11
|
+
* * Dot below
|
|
12
|
+
* * Hook above
|
|
13
|
+
*
|
|
14
|
+
*
|
|
15
|
+
* Override for the characters that aren't covered by the '72' font to other system fonts
|
|
16
|
+
*
|
|
17
|
+
* U+0102-0103: A and a with Breve
|
|
18
|
+
* U+01A0-01A1: O and o with Horn
|
|
19
|
+
* U+01AF-01B0: U and u with Horn
|
|
20
|
+
* U+1EA0-1EB7: A and a with diacritics that are not supported by the font and combination of multiple diacritics
|
|
21
|
+
* U+1EB8-1EC7: E and e with diacritics that are not supported by the font and combination of multiple diacritics
|
|
22
|
+
* U+1EC8-1ECB: I and i with diacritics that are not supported by the font and combination of multiple diacritics
|
|
23
|
+
* U+1ECC-1EE3: O and o with diacritics that are not supported by the font and combination of multiple diacritics
|
|
24
|
+
* U+1EE4-1EF1: U and u with diacritics that are not supported by the font and combination of multiple diacritics
|
|
25
|
+
* U+1EF4-1EF7: Y and y with diacritics that are not supported by the font and combination of multiple diacritics
|
|
26
|
+
*
|
|
27
|
+
*/
|
|
28
|
+
@font-face {
|
|
29
|
+
font-family: '72override';
|
|
30
|
+
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;
|
|
31
|
+
src: local('Arial'), local('Helvetica'), local('sans-serif');
|
|
32
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--_ui5_content_density:cozy;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
[data-ui5-compact-size],
|
|
6
|
+
.ui5-content-density-compact,
|
|
7
|
+
.sapUiSizeCompact {
|
|
8
|
+
--_ui5_content_density:compact;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
[dir="rtl"] {
|
|
12
|
+
--_ui5_dir:rtl;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
[dir="ltr"] {
|
|
16
|
+
--_ui5_dir:ltr;
|
|
17
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
packageName: "@ui5/webcomponents-base",
|
|
3
|
+
fileName: "FontFace.css",
|
|
4
|
+
content: `@font-face{font-family:"72";font-style:normal;font-weight:400;src:local("72"),url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular.woff?ui5-webcomponents) format("woff2"),url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular.woff2?ui5-webcomponents) format("woff")}@font-face{font-family:"72full";font-style:normal;font-weight:400;src:local('72-full'),url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular-full.woff?ui5-webcomponents) format("woff2"),url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Regular-full.woff2?ui5-webcomponents) format("woff")}@font-face{font-family:"72";font-style:normal;font-weight:700;src:local('72-Bold'),url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold.woff?ui5-webcomponents) format("woff2"),url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold.woff2?ui5-webcomponents) format("woff")}@font-face{font-family:"72full";font-style:normal;font-weight:700;src:local('72-Bold-full'),url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold-full.woff?ui5-webcomponents) format("woff2"),url(https://ui5.sap.com/sdk/resources/sap/ui/core/themes/sap_fiori_3/fonts/72-Bold-full.woff2?ui5-webcomponents) format("woff")}@font-face{font-family:"72Black";font-style:bold;font-weight:900;src:local('72Black'),url(https://openui5nightly.hana.ondemand.com/resources/sap/ui/core/themes/sap_horizon/fonts/72-Black.woff?ui5-webcomponents) format("woff2"),url(https://openui5nightly.hana.ondemand.com/resources/sap/ui/core/themes/sap_horizon/fonts/72-Black.woff2?ui5-webcomponents) format("woff")}`
|
|
5
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
packageName: "@ui5/webcomponents-base",
|
|
3
|
+
fileName: "OverrideFontFace.css",
|
|
4
|
+
content: `@font-face{font-family:'72override';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;src:local('Arial'),local('Helvetica'),local('sans-serif')}`
|
|
5
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
packageName: "@ui5/webcomponents-base",
|
|
3
|
+
fileName: "SystemCSSVars.css",
|
|
4
|
+
content: `:root{--_ui5_content_density:cozy}.sapUiSizeCompact,.ui5-content-density-compact,[data-ui5-compact-size]{--_ui5_content_density:compact}[dir=rtl]{--_ui5_dir:rtl}[dir=ltr]{--_ui5_dir:ltr}`
|
|
5
|
+
};
|
|
@@ -5,9 +5,11 @@ import {
|
|
|
5
5
|
unsafeStatic,
|
|
6
6
|
} from "lit-html/static.js";
|
|
7
7
|
|
|
8
|
-
const litRender = (templateResult, domNode,
|
|
9
|
-
if (
|
|
10
|
-
templateResult = html`<style>${
|
|
8
|
+
const litRender = (templateResult, domNode, styleStrOrHrefsArr, { host } = {}) => {
|
|
9
|
+
if (typeof styleStrOrHrefsArr === "string") {
|
|
10
|
+
templateResult = html`<style>${styleStrOrHrefsArr}</style>${templateResult}`;
|
|
11
|
+
} else if (Array.isArray(styleStrOrHrefsArr) && styleStrOrHrefsArr.length) {
|
|
12
|
+
templateResult = html`${styleStrOrHrefsArr.map(href => html`<link type="text/css" rel="stylesheet" href="${href}">`)}${templateResult}`;
|
|
11
13
|
}
|
|
12
14
|
render(templateResult, domNode, { host });
|
|
13
15
|
};
|