@ui5/webcomponents-base 0.0.0-c6d8872f3 → 0.0.0-cf069fb29
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 +5 -0
- package/CHANGELOG.md +293 -0
- package/README.md +26 -2
- package/bundle.esm.js +17 -7
- package/dist/AssetRegistry.js +8 -6
- package/dist/Boot.js +61 -0
- package/dist/CSP.js +59 -0
- package/dist/CustomElementsRegistry.js +95 -0
- package/dist/CustomElementsScope.js +108 -0
- package/dist/DOMObserver.js +65 -0
- package/dist/Device.js +69 -776
- package/dist/EventProvider.js +38 -26
- package/dist/FeaturesRegistry.js +4 -1
- package/dist/FontFace.js +19 -62
- package/dist/InitialConfiguration.js +45 -9
- package/dist/Keys.js +112 -2
- package/dist/ManagedStyles.js +83 -0
- package/dist/MediaRange.js +109 -0
- package/dist/PropertiesFileFormat.js +95 -0
- package/dist/Render.js +175 -0
- package/dist/RenderQueue.js +41 -17
- package/dist/RenderScheduler.js +24 -145
- package/dist/Runtimes.js +107 -0
- package/dist/StaticArea.js +1 -39
- package/dist/StaticAreaItem.js +61 -50
- package/dist/SystemCSSVars.js +10 -0
- package/dist/Theming.js +2 -5
- package/dist/UI5Element.js +448 -297
- package/dist/UI5ElementMetadata.js +173 -19
- package/dist/asset-registries/Icons.js +129 -14
- package/dist/asset-registries/Illustrations.js +30 -0
- package/dist/asset-registries/LocaleData.js +100 -68
- package/dist/asset-registries/Themes.js +35 -32
- package/dist/asset-registries/i18n.js +76 -29
- package/dist/assets-meta/IconCollectionsAlias.js +18 -0
- package/dist/config/AnimationMode.js +11 -1
- package/dist/config/Language.js +58 -2
- 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/delegate/ItemNavigation.js +244 -171
- package/dist/delegate/ResizeHandler.js +78 -38
- package/dist/delegate/ScrollEnablement.js +101 -19
- package/dist/features/F6Navigation.js +106 -0
- package/dist/features/OpenUI5Support.js +56 -7
- package/dist/generated/AssetParameters.js +13 -0
- 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/getSharedResource.js +30 -0
- package/dist/i18nBundle.js +59 -8
- package/dist/isLegacyBrowser.js +3 -0
- package/dist/locale/RTLAwareRegistry.js +14 -0
- package/dist/locale/applyDirection.js +17 -0
- package/dist/locale/directionChange.js +32 -0
- package/dist/locale/getEffectiveDir.js +28 -0
- package/dist/locale/getLocale.js +12 -2
- package/dist/locale/languageChange.js +22 -0
- package/dist/locale/nextFallbackLocale.js +6 -4
- package/dist/locale/normalizeLocale.js +7 -1
- package/dist/renderer/LitRenderer.js +26 -7
- package/dist/renderer/directives/style-map.js +72 -0
- package/dist/renderer/executeTemplate.js +17 -0
- package/dist/resources/bundle.esm.js +20 -106
- package/dist/resources/bundle.esm.js.map +1 -1
- package/dist/sap/base/Log.js +241 -0
- package/dist/sap/base/assert.js +8 -0
- package/dist/sap/base/security/URLListValidator.js +148 -0
- package/dist/sap/base/security/encodeCSS.js +14 -0
- package/dist/sap/base/security/encodeXML.js +23 -0
- package/dist/sap/base/security/sanitizeHTML.js +16 -0
- package/dist/sap/base/strings/toHex.js +8 -0
- package/dist/sap/base/util/now.js +7 -0
- package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
- package/dist/test-resources/assets/Themes.js +10 -6
- package/dist/test-resources/elements/Parent.js +6 -2
- package/dist/test-resources/elements/WithStaticArea.js +77 -0
- package/dist/test-resources/pages/AllTestElements.html +5 -3
- package/dist/test-resources/pages/Configuration.html +0 -2
- package/dist/test-resources/pages/ConfigurationScript.html +1 -3
- package/dist/test-resources/pages/assets/messagebundle_de.properties +1 -0
- package/dist/test-resources/pages/assets/messagebundle_en.properties +1 -0
- package/dist/test-resources/pages/assets/messagebundle_es.properties +1 -0
- package/dist/test-resources/pages/assets/messagebundle_fr.properties +1 -0
- package/dist/test-resources/pages/i18n.html +33 -0
- package/dist/test-resources/specs/ConfigurationChange.spec.js +11 -9
- package/dist/test-resources/specs/ConfigurationScript.spec.js +25 -23
- package/dist/test-resources/specs/ConfigurationURL.spec.js +65 -17
- package/dist/test-resources/specs/CustomTheme.spec.js +9 -7
- package/dist/test-resources/specs/EventProvider.spec.js +63 -0
- package/dist/test-resources/specs/StaticArea.spec.js +78 -0
- package/dist/test-resources/specs/Theming.spec.js +12 -10
- package/dist/test-resources/specs/UI5ElementInvalidation.js +54 -70
- package/dist/test-resources/specs/UI5ElementLifecycle.js +19 -14
- package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +25 -51
- package/dist/test-resources/specs/UI5ElementMetadataExt.js +9 -7
- package/dist/test-resources/specs/UI5ElementPropertyValidation.js +7 -5
- package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +37 -35
- package/dist/test-resources/specs/UI5ElementShadowDOM.js +10 -8
- package/dist/test-resources/specs/UI5ElementSlots.js +10 -8
- package/dist/theming/CustomStyle.js +47 -6
- package/dist/theming/ThemeLoaded.js +22 -0
- package/dist/theming/applyTheme.js +69 -9
- package/dist/theming/getConstructableStyle.js +15 -10
- package/dist/theming/getEffectiveLinksHrefs.js +20 -0
- package/dist/theming/getEffectiveStyle.js +23 -8
- package/dist/theming/getStylesString.js +15 -0
- package/dist/theming/getThemeDesignerTheme.js +87 -0
- package/dist/theming/preloadLinks.js +23 -0
- package/dist/types/CSSColor.js +9 -0
- package/dist/types/CalendarType.js +1 -1
- package/dist/types/DataType.js +13 -1
- package/dist/types/Float.js +14 -0
- package/dist/types/Integer.js +4 -0
- package/dist/types/InvisibleMessageMode.js +30 -0
- package/dist/types/ItemNavigationBehavior.js +2 -7
- package/dist/types/NavigationMode.js +1 -0
- package/dist/types/PopupState.js +1 -1
- package/dist/types/ValueState.js +1 -1
- package/dist/updateShadowRoot.js +30 -0
- package/dist/util/AriaLabelHelper.js +41 -0
- package/dist/util/Caret.js +45 -0
- package/dist/util/ColorConversion.js +370 -0
- package/dist/util/FocusableElements.js +30 -11
- package/dist/util/HTMLSanitizer.js +7 -0
- package/dist/util/InvisibleMessage.js +58 -0
- package/dist/util/PopupUtils.js +93 -0
- package/dist/util/SlotsHelper.js +43 -0
- package/dist/util/TabbableElements.js +5 -1
- package/dist/util/arraysAreEqual.js +15 -0
- package/dist/util/clamp.js +12 -0
- package/dist/util/createLinkInHead.js +19 -0
- package/dist/util/debounce.js +17 -0
- package/dist/util/detectNavigatorLanguage.js +3 -1
- package/dist/util/escapeRegex.js +10 -0
- package/dist/util/findNodeOwner.js +35 -0
- package/dist/util/generateHighlightedMarkup.js +42 -0
- package/dist/util/getActiveElement.js +11 -0
- package/dist/util/getClassCopy.js +10 -0
- package/dist/util/getEffectiveContentDensity.js +5 -0
- package/dist/util/getFileExtension.js +21 -0
- package/dist/util/getSingletonElementInstance.js +13 -0
- package/dist/util/isElementInView.js +15 -0
- package/dist/util/isNodeHidden.js +1 -5
- package/dist/util/isNodeTabbable.js +4 -4
- package/dist/util/isValidPropertyName.js +11 -2
- package/dist/util/setToArray.js +10 -0
- package/hash.txt +1 -0
- package/index.js +1 -1
- package/lib/generate-asset-parameters/index.js +21 -0
- package/lib/generate-styles/index.js +18 -0
- package/lib/generate-version-info/index.js +27 -0
- package/package-scripts.js +43 -17
- package/package.json +19 -12
- package/src/AssetRegistry.js +8 -6
- package/src/Boot.js +61 -0
- package/src/CSP.js +59 -0
- package/src/CustomElementsRegistry.js +95 -0
- package/src/CustomElementsScope.js +108 -0
- package/src/DOMObserver.js +65 -0
- package/src/Device.js +69 -776
- package/src/EventProvider.js +38 -26
- package/src/FeaturesRegistry.js +4 -1
- package/src/FontFace.js +19 -62
- package/src/InitialConfiguration.js +45 -9
- package/src/Keys.js +112 -2
- package/src/ManagedStyles.js +83 -0
- package/src/MediaRange.js +109 -0
- package/src/PropertiesFileFormat.js +95 -0
- package/src/Render.js +175 -0
- package/src/RenderQueue.js +41 -17
- package/src/RenderScheduler.js +24 -145
- package/src/Runtimes.js +107 -0
- package/src/StaticArea.js +1 -39
- package/src/StaticAreaItem.js +61 -50
- package/src/SystemCSSVars.js +10 -0
- package/src/Theming.js +2 -5
- package/src/UI5Element.js +448 -297
- package/src/UI5ElementMetadata.js +173 -19
- package/src/asset-registries/Icons.js +129 -14
- package/src/asset-registries/Illustrations.js +30 -0
- package/src/asset-registries/LocaleData.js +100 -68
- package/src/asset-registries/Themes.js +35 -32
- package/src/asset-registries/i18n.js +76 -29
- package/src/assets-meta/IconCollectionsAlias.js +18 -0
- package/src/config/AnimationMode.js +11 -1
- package/src/config/Language.js +58 -2
- 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/delegate/ItemNavigation.js +244 -171
- package/src/delegate/ResizeHandler.js +78 -38
- package/src/delegate/ScrollEnablement.js +101 -19
- package/src/features/F6Navigation.js +106 -0
- package/src/features/OpenUI5Support.js +56 -7
- package/src/getSharedResource.js +30 -0
- package/src/i18nBundle.js +59 -8
- package/src/isLegacyBrowser.js +3 -0
- package/src/locale/RTLAwareRegistry.js +14 -0
- package/src/locale/applyDirection.js +17 -0
- package/src/locale/directionChange.js +32 -0
- package/src/locale/getEffectiveDir.js +28 -0
- package/src/locale/getLocale.js +12 -2
- package/src/locale/languageChange.js +22 -0
- package/src/locale/nextFallbackLocale.js +6 -4
- package/src/locale/normalizeLocale.js +7 -1
- package/src/renderer/LitRenderer.js +26 -7
- package/src/renderer/directives/style-map.js +72 -0
- package/src/renderer/executeTemplate.js +17 -0
- package/src/theming/CustomStyle.js +47 -6
- package/src/theming/ThemeLoaded.js +22 -0
- package/src/theming/applyTheme.js +69 -9
- package/src/theming/getConstructableStyle.js +15 -10
- package/src/theming/getEffectiveLinksHrefs.js +20 -0
- package/src/theming/getEffectiveStyle.js +23 -8
- package/src/theming/getStylesString.js +15 -0
- package/src/theming/getThemeDesignerTheme.js +87 -0
- package/src/theming/preloadLinks.js +23 -0
- package/src/types/CSSColor.js +9 -0
- package/src/types/CalendarType.js +1 -1
- package/src/types/DataType.js +13 -1
- package/src/types/Float.js +14 -0
- package/src/types/Integer.js +4 -0
- package/src/types/InvisibleMessageMode.js +30 -0
- package/src/types/ItemNavigationBehavior.js +2 -7
- package/src/types/NavigationMode.js +1 -0
- package/src/types/PopupState.js +1 -1
- package/src/types/ValueState.js +1 -1
- package/src/updateShadowRoot.js +30 -0
- package/src/util/AriaLabelHelper.js +41 -0
- package/src/util/Caret.js +45 -0
- package/src/util/ColorConversion.js +370 -0
- package/src/util/FocusableElements.js +30 -11
- package/src/util/HTMLSanitizer.js +7 -0
- package/src/util/InvisibleMessage.js +58 -0
- package/src/util/PopupUtils.js +93 -0
- package/src/util/SlotsHelper.js +43 -0
- package/src/util/TabbableElements.js +5 -1
- package/src/util/arraysAreEqual.js +15 -0
- package/src/util/clamp.js +12 -0
- package/src/util/createLinkInHead.js +19 -0
- package/src/util/debounce.js +17 -0
- package/src/util/detectNavigatorLanguage.js +3 -1
- package/src/util/escapeRegex.js +10 -0
- package/src/util/findNodeOwner.js +35 -0
- package/src/util/generateHighlightedMarkup.js +42 -0
- package/src/util/getActiveElement.js +11 -0
- package/src/util/getClassCopy.js +10 -0
- package/src/util/getEffectiveContentDensity.js +5 -0
- package/src/util/getFileExtension.js +21 -0
- package/src/util/getSingletonElementInstance.js +13 -0
- package/src/util/isElementInView.js +15 -0
- package/src/util/isNodeHidden.js +1 -5
- package/src/util/isNodeTabbable.js +4 -4
- package/src/util/isValidPropertyName.js +11 -2
- package/src/util/setToArray.js +10 -0
- package/used-modules.txt +10 -0
- package/bundle.es5.js +0 -28
- package/dist/SVGIconRegistry.js +0 -60
- package/dist/boot.js +0 -32
- package/dist/compatibility/DOMObserver.js +0 -62
- package/dist/compatibility/patchNodeValue.js +0 -24
- package/dist/compatibility/whenPolyfillLoaded.js +0 -26
- package/dist/delegate/CustomResize.js +0 -78
- package/dist/delegate/NativeResize.js +0 -44
- package/dist/features/browsersupport/Edge.js +0 -6
- package/dist/features/browsersupport/IE11.js +0 -41
- package/dist/renderer/ifDefined.js +0 -21
- package/dist/resources/bundle.es5.js +0 -212
- package/dist/resources/bundle.es5.js.map +0 -1
- package/dist/test-resources/dev-helpers/ExternalThemePresent.js +0 -3
- package/dist/theming/CSSVarsPonyfill.js +0 -25
- package/dist/theming/ExternalThemePresent.js +0 -12
- package/dist/theming/adaptCSSForIE.js +0 -90
- package/dist/theming/createComponentStyleTag.js +0 -32
- package/dist/theming/createThemePropertiesStyleTag.js +0 -27
- package/dist/thirdparty/Array.from.js +0 -16
- package/dist/thirdparty/Array.prototype.fill.js +0 -44
- package/dist/thirdparty/Array.prototype.find.js +0 -46
- package/dist/thirdparty/Array.prototype.includes.js +0 -51
- package/dist/thirdparty/Element.prototype.closest.js +0 -11
- package/dist/thirdparty/Element.prototype.matches.js +0 -6
- package/dist/thirdparty/Map.prototype.keys.js +0 -9
- package/dist/thirdparty/Number.isInteger.js +0 -5
- package/dist/thirdparty/Number.isNaN.js +0 -1
- package/dist/thirdparty/Number.parseInt.js +0 -1
- package/dist/thirdparty/Object.assign.js +0 -31
- package/dist/thirdparty/Object.entries.js +0 -11
- package/dist/thirdparty/Symbol.js +0 -2
- package/dist/thirdparty/WeakSet.js +0 -27
- package/dist/thirdparty/es6-string-methods.js +0 -182
- package/dist/thirdparty/events-polyfills.js +0 -89
- package/dist/thirdparty/fetch.js +0 -1
- package/dist/thirdparty/template.js +0 -600
- package/dist/webcomponentsjs/LICENSE.md +0 -19
- package/dist/webcomponentsjs/README.md +0 -229
- package/dist/webcomponentsjs/bundles/webcomponents-ce.js +0 -63
- package/dist/webcomponentsjs/bundles/webcomponents-ce.js.map +0 -1
- package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +0 -297
- package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +0 -1
- package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js +0 -208
- package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +0 -1
- package/dist/webcomponentsjs/bundles/webcomponents-sd.js +0 -166
- package/dist/webcomponentsjs/bundles/webcomponents-sd.js.map +0 -1
- package/dist/webcomponentsjs/custom-elements-es5-adapter.js +0 -15
- package/dist/webcomponentsjs/package.json +0 -46
- package/dist/webcomponentsjs/src/entrypoints/custom-elements-es5-adapter-index.js +0 -16
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-bundle-index.js +0 -53
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-ce-index.js +0 -17
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-index.js +0 -19
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-pf-index.js +0 -28
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-index.js +0 -18
- package/dist/webcomponentsjs/webcomponents-bundle.js +0 -298
- package/dist/webcomponentsjs/webcomponents-bundle.js.map +0 -1
- package/dist/webcomponentsjs/webcomponents-loader.js +0 -185
- package/src/SVGIconRegistry.js +0 -60
- package/src/boot.js +0 -32
- package/src/compatibility/DOMObserver.js +0 -62
- package/src/compatibility/patchNodeValue.js +0 -24
- package/src/compatibility/whenPolyfillLoaded.js +0 -26
- package/src/delegate/CustomResize.js +0 -78
- package/src/delegate/NativeResize.js +0 -44
- package/src/features/browsersupport/Edge.js +0 -6
- package/src/features/browsersupport/IE11.js +0 -41
- package/src/renderer/ifDefined.js +0 -21
- package/src/theming/CSSVarsPonyfill.js +0 -25
- package/src/theming/ExternalThemePresent.js +0 -12
- package/src/theming/adaptCSSForIE.js +0 -90
- package/src/theming/createComponentStyleTag.js +0 -32
- package/src/theming/createThemePropertiesStyleTag.js +0 -27
- package/src/thirdparty/Array.from.js +0 -16
- package/src/thirdparty/Array.prototype.fill.js +0 -44
- package/src/thirdparty/Array.prototype.find.js +0 -46
- package/src/thirdparty/Array.prototype.includes.js +0 -51
- package/src/thirdparty/Element.prototype.closest.js +0 -11
- package/src/thirdparty/Element.prototype.matches.js +0 -6
- package/src/thirdparty/Map.prototype.keys.js +0 -9
- package/src/thirdparty/Number.isInteger.js +0 -5
- package/src/thirdparty/Number.isNaN.js +0 -1
- package/src/thirdparty/Number.parseInt.js +0 -1
- package/src/thirdparty/Object.assign.js +0 -31
- package/src/thirdparty/Object.entries.js +0 -11
- package/src/thirdparty/Symbol.js +0 -2
- package/src/thirdparty/WeakSet.js +0 -27
- package/src/thirdparty/es6-string-methods.js +0 -182
- package/src/thirdparty/events-polyfills.js +0 -89
- package/src/thirdparty/fetch.js +0 -1
- package/src/thirdparty/template.js +0 -600
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import EventProvider from "../EventProvider.js";
|
|
2
|
+
|
|
3
|
+
const eventProvider = new EventProvider();
|
|
4
|
+
const LANG_CHANGE = "languageChange";
|
|
5
|
+
|
|
6
|
+
const attachLanguageChange = listener => {
|
|
7
|
+
eventProvider.attachEvent(LANG_CHANGE, listener);
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const detachLanguageChange = listener => {
|
|
11
|
+
eventProvider.detachEvent(LANG_CHANGE, listener);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const fireLanguageChange = lang => {
|
|
15
|
+
return eventProvider.fireEventAsync(LANG_CHANGE, lang);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export {
|
|
19
|
+
attachLanguageChange,
|
|
20
|
+
detachLanguageChange,
|
|
21
|
+
fireLanguageChange,
|
|
22
|
+
};
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
+
import { DEFAULT_LOCALE } from "../generated/AssetParameters.js";
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Calculates the next fallback locale for the given locale.
|
|
3
5
|
*
|
|
4
6
|
* @param {string} locale Locale string in Java format (underscores) or null
|
|
5
|
-
* @returns {string
|
|
7
|
+
* @returns {string} Next fallback Locale or "en" if no fallbacks found.
|
|
6
8
|
*/
|
|
7
9
|
const nextFallbackLocale = locale => {
|
|
8
10
|
if (!locale) {
|
|
9
|
-
return
|
|
11
|
+
return DEFAULT_LOCALE;
|
|
10
12
|
}
|
|
11
13
|
|
|
12
14
|
if (locale === "zh_HK") {
|
|
@@ -19,8 +21,8 @@ const nextFallbackLocale = locale => {
|
|
|
19
21
|
return locale.slice(0, p);
|
|
20
22
|
}
|
|
21
23
|
|
|
22
|
-
// for any language but
|
|
23
|
-
return locale !==
|
|
24
|
+
// for any language but the default, fallback to the default first before falling back to the 'raw' language (empty string)
|
|
25
|
+
return locale !== DEFAULT_LOCALE ? DEFAULT_LOCALE : "";
|
|
24
26
|
};
|
|
25
27
|
|
|
26
28
|
export default nextFallbackLocale;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { DEFAULT_LOCALE } from "../generated/AssetParameters.js";
|
|
2
|
+
|
|
1
3
|
const localeRegEX = /^((?:[A-Z]{2,3}(?:-[A-Z]{3}){0,3})|[A-Z]{4}|[A-Z]{5,8})(?:-([A-Z]{4}))?(?:-([A-Z]{2}|[0-9]{3}))?((?:-[0-9A-Z]{5,8}|-[0-9][0-9A-Z]{3})*)((?:-[0-9A-WYZ](?:-[0-9A-Z]{2,8})+)*)(?:-(X(?:-[0-9A-Z]{1,8})+))?$/i;
|
|
2
4
|
const SAPSupportabilityLocales = /(?:^|-)(saptrc|sappsd)(?:-|$)/i;
|
|
3
5
|
|
|
@@ -12,11 +14,15 @@ const M_ISO639_NEW_TO_OLD = {
|
|
|
12
14
|
/**
|
|
13
15
|
* Normalizes the given locale in BCP-47 syntax.
|
|
14
16
|
* @param {string} locale locale to normalize
|
|
15
|
-
* @returns {string} Normalized locale
|
|
17
|
+
* @returns {string} Normalized locale, "undefined" if the locale can't be normalized or the default locale, if no locale provided.
|
|
16
18
|
*/
|
|
17
19
|
const normalizeLocale = locale => {
|
|
18
20
|
let m;
|
|
19
21
|
|
|
22
|
+
if (!locale) {
|
|
23
|
+
return DEFAULT_LOCALE;
|
|
24
|
+
}
|
|
25
|
+
|
|
20
26
|
if (typeof locale === "string" && (m = localeRegEX.exec(locale.replace(/_/g, "-")))) {/* eslint-disable-line */
|
|
21
27
|
let language = m[1].toLowerCase();
|
|
22
28
|
let region = m[3] ? m[3].toUpperCase() : undefined;
|
|
@@ -1,15 +1,34 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { render } from "lit-html";
|
|
2
|
+
import {
|
|
3
|
+
html,
|
|
4
|
+
svg,
|
|
5
|
+
unsafeStatic,
|
|
6
|
+
} from "lit-html/static.js";
|
|
2
7
|
|
|
3
|
-
const litRender = (templateResult, domNode,
|
|
4
|
-
if (
|
|
5
|
-
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}`;
|
|
6
13
|
}
|
|
7
|
-
render(templateResult, domNode, {
|
|
14
|
+
render(templateResult, domNode, { host });
|
|
8
15
|
};
|
|
9
16
|
|
|
10
|
-
|
|
17
|
+
const scopeTag = (tag, tags, suffix) => {
|
|
18
|
+
const resultTag = suffix && (tags || []).includes(tag) ? `${tag}-${suffix}` : tag;
|
|
19
|
+
return unsafeStatic(resultTag);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export {
|
|
23
|
+
html,
|
|
24
|
+
svg,
|
|
25
|
+
unsafeStatic,
|
|
26
|
+
};
|
|
27
|
+
export { scopeTag };
|
|
11
28
|
export { repeat } from "lit-html/directives/repeat.js";
|
|
12
29
|
export { classMap } from "lit-html/directives/class-map.js";
|
|
13
|
-
export { styleMap } from "
|
|
30
|
+
export { styleMap } from "./directives/style-map.js";
|
|
31
|
+
export { ifDefined } from "lit-html/directives/if-defined.js";
|
|
32
|
+
export { unsafeHTML } from "lit-html/directives/unsafe-html.js";
|
|
14
33
|
|
|
15
34
|
export default litRender;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2018 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* This is the original style-map.js directive from lit-html 2 with the only difference that "render" is not called even for the first rendering (update is used instead)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { noChange } from 'lit-html';
|
|
12
|
+
import { directive, Directive, PartType, } from 'lit-html/directive.js';
|
|
13
|
+
class StyleMapDirective extends Directive {
|
|
14
|
+
constructor(partInfo) {
|
|
15
|
+
var _a;
|
|
16
|
+
super(partInfo);
|
|
17
|
+
if (partInfo.type !== PartType.ATTRIBUTE ||
|
|
18
|
+
partInfo.name !== 'style' ||
|
|
19
|
+
((_a = partInfo.strings) === null || _a === void 0 ? void 0 : _a.length) > 2) {
|
|
20
|
+
throw new Error('The `styleMap` directive must be used in the `style` attribute ' +
|
|
21
|
+
'and must be the only part in the attribute.');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
render(styleInfo) {
|
|
25
|
+
return "";
|
|
26
|
+
}
|
|
27
|
+
update(part, [styleInfo]) {
|
|
28
|
+
const { style } = part.element;
|
|
29
|
+
if (this._previousStyleProperties === undefined) {
|
|
30
|
+
this._previousStyleProperties = new Set();
|
|
31
|
+
for (const name in styleInfo) {
|
|
32
|
+
this._previousStyleProperties.add(name);
|
|
33
|
+
}
|
|
34
|
+
// return this.render(styleInfo);
|
|
35
|
+
}
|
|
36
|
+
// Remove old properties that no longer exist in styleInfo
|
|
37
|
+
// We use forEach() instead of for-of so that re don't require down-level
|
|
38
|
+
// iteration.
|
|
39
|
+
this._previousStyleProperties.forEach((name) => {
|
|
40
|
+
// If the name isn't in styleInfo or it's null/undefined
|
|
41
|
+
if (styleInfo[name] == null) {
|
|
42
|
+
this._previousStyleProperties.delete(name);
|
|
43
|
+
if (name.includes('-')) {
|
|
44
|
+
style.removeProperty(name);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Note reset using empty string (vs null) as IE11 does not always
|
|
48
|
+
// reset via null (https://developer.mozilla.org/en-US/docs/Web/API/ElementCSSInlineStyle/style#setting_styles)
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
50
|
+
style[name] = '';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// Add or update properties
|
|
55
|
+
for (const name in styleInfo) {
|
|
56
|
+
const value = styleInfo[name];
|
|
57
|
+
if (value != null) {
|
|
58
|
+
this._previousStyleProperties.add(name);
|
|
59
|
+
if (name.includes('-')) {
|
|
60
|
+
style.setProperty(name, value);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
64
|
+
style[name] = value;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return noChange;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export const styleMap = directive(StyleMapDirective);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getCustomElementsScopingSuffix, shouldScopeCustomElement } from "../CustomElementsScope.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Runs a component's template with the component's current state, while also scoping HTML
|
|
5
|
+
*
|
|
6
|
+
* @param template - the template to execute
|
|
7
|
+
* @param component - the component
|
|
8
|
+
* @public
|
|
9
|
+
* @returns {*}
|
|
10
|
+
*/
|
|
11
|
+
const executeTemplate = (template, component) => {
|
|
12
|
+
const tagsToScope = component.constructor.getUniqueDependencies().map(dep => dep.getMetadata().getPureTag()).filter(shouldScopeCustomElement);
|
|
13
|
+
const scope = getCustomElementsScopingSuffix();
|
|
14
|
+
return template(component, tagsToScope, scope);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default executeTemplate;
|
|
@@ -1,19 +1,60 @@
|
|
|
1
|
-
|
|
1
|
+
import { reRenderAllUI5Elements } from "../Render.js";
|
|
2
|
+
import getSharedResource from "../getSharedResource.js";
|
|
3
|
+
import EventProvider from "../EventProvider.js";
|
|
2
4
|
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
const eventProvider = getSharedResource("CustomStyle.eventProvider", new EventProvider());
|
|
6
|
+
const CUSTOM_CSS_CHANGE = "CustomCSSChange";
|
|
7
|
+
|
|
8
|
+
const attachCustomCSSChange = listener => {
|
|
9
|
+
eventProvider.attachEvent(CUSTOM_CSS_CHANGE, listener);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const detachCustomCSSChange = listener => {
|
|
13
|
+
eventProvider.detachEvent(CUSTOM_CSS_CHANGE, listener);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const fireCustomCSSChange = tag => {
|
|
17
|
+
return eventProvider.fireEvent(CUSTOM_CSS_CHANGE, tag);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const customCSSFor = getSharedResource("CustomStyle.customCSSFor", {});
|
|
21
|
+
|
|
22
|
+
// Listen to the eventProvider, in case other copies of this CustomStyle module fire this
|
|
23
|
+
// event, and this copy would therefore need to reRender the ui5 webcomponents; but
|
|
24
|
+
// don't reRender if it was this copy that fired the event to begin with.
|
|
25
|
+
let skipRerender;
|
|
26
|
+
attachCustomCSSChange(tag => {
|
|
27
|
+
if (!skipRerender) {
|
|
28
|
+
reRenderAllUI5Elements({ tag });
|
|
6
29
|
}
|
|
30
|
+
});
|
|
7
31
|
|
|
32
|
+
const addCustomCSS = (tag, css) => {
|
|
8
33
|
if (!customCSSFor[tag]) {
|
|
9
34
|
customCSSFor[tag] = [];
|
|
10
35
|
}
|
|
11
|
-
|
|
12
36
|
customCSSFor[tag].push(css);
|
|
37
|
+
|
|
38
|
+
skipRerender = true;
|
|
39
|
+
try {
|
|
40
|
+
// The event is fired and the attached event listeners are all called synchronously
|
|
41
|
+
// The skipRerender flag will be used to avoid calling reRenderAllUI5Elements twice when it is this copy
|
|
42
|
+
// of CustomStyle.js which is firing the `CustomCSSChange` event.
|
|
43
|
+
fireCustomCSSChange(tag);
|
|
44
|
+
} finally {
|
|
45
|
+
skipRerender = false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return reRenderAllUI5Elements({ tag });
|
|
13
49
|
};
|
|
14
50
|
|
|
15
51
|
const getCustomCSS = tag => {
|
|
16
52
|
return customCSSFor[tag] ? customCSSFor[tag].join("") : "";
|
|
17
53
|
};
|
|
18
54
|
|
|
19
|
-
export {
|
|
55
|
+
export {
|
|
56
|
+
addCustomCSS,
|
|
57
|
+
getCustomCSS,
|
|
58
|
+
attachCustomCSSChange,
|
|
59
|
+
detachCustomCSSChange,
|
|
60
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import EventProvider from "../EventProvider.js";
|
|
2
|
+
|
|
3
|
+
const eventProvider = new EventProvider();
|
|
4
|
+
const THEME_LOADED = "themeLoaded";
|
|
5
|
+
|
|
6
|
+
const attachThemeLoaded = listener => {
|
|
7
|
+
eventProvider.attachEvent(THEME_LOADED, listener);
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const detachThemeLoaded = listener => {
|
|
11
|
+
eventProvider.detachEvent(THEME_LOADED, listener);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const fireThemeLoaded = theme => {
|
|
15
|
+
return eventProvider.fireEvent(THEME_LOADED, theme);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export {
|
|
19
|
+
attachThemeLoaded,
|
|
20
|
+
detachThemeLoaded,
|
|
21
|
+
fireThemeLoaded,
|
|
22
|
+
};
|
|
@@ -1,19 +1,79 @@
|
|
|
1
|
-
import { getThemeProperties, getRegisteredPackages } from "../asset-registries/Themes.js";
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
1
|
+
import { getThemeProperties, getRegisteredPackages, isThemeRegistered } from "../asset-registries/Themes.js";
|
|
2
|
+
import { removeStyle, createOrUpdateStyle } from "../ManagedStyles.js";
|
|
3
|
+
import getThemeDesignerTheme from "./getThemeDesignerTheme.js";
|
|
4
|
+
import { fireThemeLoaded } from "./ThemeLoaded.js";
|
|
5
|
+
import { getFeature } from "../FeaturesRegistry.js";
|
|
4
6
|
|
|
5
|
-
const
|
|
6
|
-
let cssText = "";
|
|
7
|
+
const BASE_THEME_PACKAGE = "@ui5/webcomponents-theming";
|
|
7
8
|
|
|
9
|
+
const isThemeBaseRegistered = () => {
|
|
8
10
|
const registeredPackages = getRegisteredPackages();
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
return registeredPackages.has(BASE_THEME_PACKAGE);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const loadThemeBase = async theme => {
|
|
15
|
+
if (!isThemeBaseRegistered()) {
|
|
16
|
+
return;
|
|
11
17
|
}
|
|
12
18
|
|
|
19
|
+
const cssData = await getThemeProperties(BASE_THEME_PACKAGE, theme);
|
|
20
|
+
if (cssData) {
|
|
21
|
+
createOrUpdateStyle(cssData, "data-ui5-theme-properties", BASE_THEME_PACKAGE);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const deleteThemeBase = () => {
|
|
26
|
+
removeStyle("data-ui5-theme-properties", BASE_THEME_PACKAGE);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const loadComponentPackages = async theme => {
|
|
30
|
+
const registeredPackages = getRegisteredPackages();
|
|
13
31
|
registeredPackages.forEach(async packageName => {
|
|
14
|
-
|
|
15
|
-
|
|
32
|
+
if (packageName === BASE_THEME_PACKAGE) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const cssData = await getThemeProperties(packageName, theme);
|
|
37
|
+
if (cssData) {
|
|
38
|
+
createOrUpdateStyle(cssData, "data-ui5-theme-properties", packageName);
|
|
39
|
+
}
|
|
16
40
|
});
|
|
17
41
|
};
|
|
18
42
|
|
|
43
|
+
const detectExternalTheme = () => {
|
|
44
|
+
// If theme designer theme is detected, use this
|
|
45
|
+
const extTheme = getThemeDesignerTheme();
|
|
46
|
+
if (extTheme) {
|
|
47
|
+
return extTheme;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// If OpenUI5Support is enabled, try to find out if it loaded variables
|
|
51
|
+
const OpenUI5Support = getFeature("OpenUI5Support");
|
|
52
|
+
if (OpenUI5Support) {
|
|
53
|
+
const varsLoaded = OpenUI5Support.cssVariablesLoaded();
|
|
54
|
+
if (varsLoaded) {
|
|
55
|
+
return {
|
|
56
|
+
themeName: OpenUI5Support.getConfigurationSettingsObject().theme, // just themeName, baseThemeName is only relevant for custom themes
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const applyTheme = async theme => {
|
|
63
|
+
const extTheme = detectExternalTheme();
|
|
64
|
+
|
|
65
|
+
// Only load theme_base properties if there is no externally loaded theme, or there is, but it is not being loaded
|
|
66
|
+
if (!extTheme || theme !== extTheme.themeName) {
|
|
67
|
+
await loadThemeBase(theme);
|
|
68
|
+
} else {
|
|
69
|
+
deleteThemeBase();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Always load component packages properties. For non-registered themes, try with the base theme, if any
|
|
73
|
+
const packagesTheme = isThemeRegistered(theme) ? theme : extTheme && extTheme.baseThemeName;
|
|
74
|
+
await loadComponentPackages(packagesTheme);
|
|
75
|
+
|
|
76
|
+
fireThemeLoaded(theme);
|
|
77
|
+
};
|
|
78
|
+
|
|
19
79
|
export default applyTheme;
|
|
@@ -1,25 +1,30 @@
|
|
|
1
1
|
import getEffectiveStyle from "./getEffectiveStyle.js";
|
|
2
|
+
import { attachCustomCSSChange } from "./CustomStyle.js";
|
|
2
3
|
|
|
3
4
|
const constructableStyleMap = new Map();
|
|
4
5
|
|
|
6
|
+
attachCustomCSSChange(tag => {
|
|
7
|
+
constructableStyleMap.delete(`${tag}_normal`); // there is custom CSS only for the component itself, not for its static area part
|
|
8
|
+
});
|
|
9
|
+
|
|
5
10
|
/**
|
|
6
11
|
* Returns (and caches) a constructable style sheet for a web component class
|
|
7
12
|
* Note: Chrome
|
|
8
13
|
* @param ElementClass
|
|
9
14
|
* @returns {*}
|
|
10
15
|
*/
|
|
11
|
-
const getConstructableStyle = ElementClass => {
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
if (constructableStyleMap.has(tagName)) {
|
|
15
|
-
return constructableStyleMap.get(tagName);
|
|
16
|
-
}
|
|
16
|
+
const getConstructableStyle = (ElementClass, forStaticArea = false) => {
|
|
17
|
+
const tag = ElementClass.getMetadata().getTag();
|
|
18
|
+
const key = `${tag}_${forStaticArea ? "static" : "normal"}`;
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
if (!constructableStyleMap.has(key)) {
|
|
21
|
+
const styleContent = getEffectiveStyle(ElementClass, forStaticArea);
|
|
22
|
+
const style = new CSSStyleSheet();
|
|
23
|
+
style.replaceSync(styleContent);
|
|
24
|
+
constructableStyleMap.set(key, [style]);
|
|
25
|
+
}
|
|
20
26
|
|
|
21
|
-
constructableStyleMap.
|
|
22
|
-
return style;
|
|
27
|
+
return constructableStyleMap.get(key);
|
|
23
28
|
};
|
|
24
29
|
|
|
25
30
|
export default getConstructableStyle;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { getUrl } from "../CSP.js";
|
|
2
|
+
|
|
3
|
+
const flatten = arr => {
|
|
4
|
+
return arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []);
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
const getEffectiveLinksHrefs = (ElementClass, forStaticArea = false) => {
|
|
8
|
+
let stylesData = ElementClass[forStaticArea ? "staticAreaStyles" : "styles"];
|
|
9
|
+
if (!stylesData) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
if (!Array.isArray(stylesData)) {
|
|
14
|
+
stylesData = [stylesData];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return flatten(stylesData).filter(data => !!data).map(data => getUrl(data.packageName, data.fileName));
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export default getEffectiveLinksHrefs;
|
|
@@ -1,15 +1,30 @@
|
|
|
1
|
-
import { getCustomCSS } from "./CustomStyle.js";
|
|
1
|
+
import { getCustomCSS, attachCustomCSSChange } from "./CustomStyle.js";
|
|
2
|
+
import getStylesString from "./getStylesString.js";
|
|
2
3
|
|
|
3
|
-
const
|
|
4
|
+
const effectiveStyleMap = new Map();
|
|
5
|
+
|
|
6
|
+
attachCustomCSSChange(tag => {
|
|
7
|
+
effectiveStyleMap.delete(`${tag}_normal`); // there is custom CSS only for the component itself, not for its static area part
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
const getEffectiveStyle = (ElementClass, forStaticArea = false) => {
|
|
4
11
|
const tag = ElementClass.getMetadata().getTag();
|
|
5
|
-
const
|
|
6
|
-
|
|
12
|
+
const key = `${tag}_${forStaticArea ? "static" : "normal"}`;
|
|
13
|
+
|
|
14
|
+
if (!effectiveStyleMap.has(key)) {
|
|
15
|
+
let effectiveStyle;
|
|
7
16
|
|
|
8
|
-
|
|
9
|
-
|
|
17
|
+
if (forStaticArea) {
|
|
18
|
+
effectiveStyle = getStylesString(ElementClass.staticAreaStyles);
|
|
19
|
+
} else {
|
|
20
|
+
const customStyle = getCustomCSS(tag) || "";
|
|
21
|
+
const builtInStyles = getStylesString(ElementClass.styles);
|
|
22
|
+
effectiveStyle = `${builtInStyles} ${customStyle}`;
|
|
23
|
+
}
|
|
24
|
+
effectiveStyleMap.set(key, effectiveStyle);
|
|
10
25
|
}
|
|
11
|
-
return `${componentStyles} ${customStyle}`;
|
|
12
|
-
};
|
|
13
26
|
|
|
27
|
+
return effectiveStyleMap.get(key);
|
|
28
|
+
};
|
|
14
29
|
|
|
15
30
|
export default getEffectiveStyle;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const getStylesString = styles => {
|
|
2
|
+
if (Array.isArray(styles)) {
|
|
3
|
+
return flatten(styles.filter(style => !!style)).map(style => {
|
|
4
|
+
return typeof style === "string" ? style : style.content;
|
|
5
|
+
}).join(" ");
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
return typeof styles === "string" ? styles : styles.content;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const flatten = arr => {
|
|
12
|
+
return arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default getStylesString;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const warnings = new Set();
|
|
2
|
+
|
|
3
|
+
const getThemeMetadata = () => {
|
|
4
|
+
// Check if the class was already applied, most commonly to the link/style tag with the CSS Variables
|
|
5
|
+
let el = document.querySelector(".sapThemeMetaData-Base-baseLib") || document.querySelector(".sapThemeMetaData-UI5-sap-ui-core");
|
|
6
|
+
if (el) {
|
|
7
|
+
return getComputedStyle(el).backgroundImage;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
el = document.createElement("span");
|
|
11
|
+
el.style.display = "none";
|
|
12
|
+
|
|
13
|
+
// Try with sapThemeMetaData-Base-baseLib first
|
|
14
|
+
el.classList.add("sapThemeMetaData-Base-baseLib");
|
|
15
|
+
document.body.appendChild(el);
|
|
16
|
+
let metadata = getComputedStyle(el).backgroundImage;
|
|
17
|
+
|
|
18
|
+
// Try with sapThemeMetaData-UI5-sap-ui-core only if the previous selector was not found
|
|
19
|
+
if (metadata === "none") {
|
|
20
|
+
el.classList.add("sapThemeMetaData-UI5-sap-ui-core");
|
|
21
|
+
metadata = getComputedStyle(el).backgroundImage;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
document.body.removeChild(el);
|
|
25
|
+
|
|
26
|
+
return metadata;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const parseThemeMetadata = metadataString => {
|
|
30
|
+
const params = /\(["']?data:text\/plain;utf-8,(.*?)['"]?\)$/i.exec(metadataString);
|
|
31
|
+
if (params && params.length >= 2) {
|
|
32
|
+
let paramsString = params[1];
|
|
33
|
+
paramsString = paramsString.replace(/\\"/g, `"`);
|
|
34
|
+
if (paramsString.charAt(0) !== "{" && paramsString.charAt(paramsString.length - 1) !== "}") {
|
|
35
|
+
try {
|
|
36
|
+
paramsString = decodeURIComponent(paramsString);
|
|
37
|
+
} catch (ex) {
|
|
38
|
+
if (!warnings.has("decode")) {
|
|
39
|
+
console.warn("Malformed theme metadata string, unable to decodeURIComponent"); // eslint-disable-line
|
|
40
|
+
warnings.add("decode");
|
|
41
|
+
}
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
return JSON.parse(paramsString);
|
|
47
|
+
} catch (ex) {
|
|
48
|
+
if (!warnings.has("parse")) {
|
|
49
|
+
console.warn("Malformed theme metadata string, unable to parse JSON"); // eslint-disable-line
|
|
50
|
+
warnings.add("parse");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const processThemeMetadata = metadata => {
|
|
57
|
+
let themeName;
|
|
58
|
+
let baseThemeName;
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
themeName = metadata.Path.match(/\.([^.]+)\.css_variables$/)[1];
|
|
62
|
+
baseThemeName = metadata.Extends[0];
|
|
63
|
+
} catch (ex) {
|
|
64
|
+
if (!warnings.has("object")) {
|
|
65
|
+
console.warn("Malformed theme metadata Object", metadata); // eslint-disable-line
|
|
66
|
+
warnings.add("object");
|
|
67
|
+
}
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
themeName,
|
|
73
|
+
baseThemeName,
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const getThemeDesignerTheme = () => {
|
|
78
|
+
const metadataString = getThemeMetadata();
|
|
79
|
+
if (!metadataString || metadataString === "none") {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const metadata = parseThemeMetadata(metadataString);
|
|
84
|
+
return processThemeMetadata(metadata);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export default getThemeDesignerTheme;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import getEffectiveLinksHrefs from "./getEffectiveLinksHrefs.js";
|
|
2
|
+
import createLinkInHead from "../util/createLinkInHead.js";
|
|
3
|
+
import { shouldUseLinks, shouldPreloadLinks } from "../CSP.js";
|
|
4
|
+
|
|
5
|
+
const preloaded = new Set();
|
|
6
|
+
|
|
7
|
+
const preloadLinks = ElementClass => {
|
|
8
|
+
if (!shouldUseLinks() || !shouldPreloadLinks()) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const linksHrefs = getEffectiveLinksHrefs(ElementClass, false) || [];
|
|
13
|
+
const staticAreaLinksHrefs = getEffectiveLinksHrefs(ElementClass, true) || [];
|
|
14
|
+
|
|
15
|
+
[...linksHrefs, ...staticAreaLinksHrefs].forEach(href => {
|
|
16
|
+
if (!preloaded.has(href)) {
|
|
17
|
+
createLinkInHead(href, { rel: "preload", as: "style" });
|
|
18
|
+
preloaded.add(href);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export default preloadLinks;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import DataType from "./DataType.js";
|
|
2
|
+
|
|
3
|
+
class CSSColor extends DataType {
|
|
4
|
+
static isValid(value) {
|
|
5
|
+
return /^(#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})|rgb\(\s*((1?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))|([0-9]?[0-9](\.[0-9]+)?|100(\.0+)?)%)\s*(,\s*((1?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))|([0-9]?[0-9](\.[0-9]+)?|100(\.0+)?)%)\s*){2}\)|rgba\((\s*((1?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))|([0-9]?[0-9](\.[0-9]+)?|100(\.0+)?)%)\s*,){3}\s*(0(\.[0-9]+)?|1(\.0+)?)\s*\)|hsl\(\s*([0-2]?[0-9]?[0-9]|3([0-5][0-9]|60))\s*(,\s*(([0-9]?[0-9](\.[0-9]+)?|100(\.0+)?)%)\s*){2}\)|hsla\(\s*([0-2]?[0-9]?[0-9]|3([0-5][0-9]|60))\s*,(\s*(([0-9]?[0-9](\.[0-9]+)?|100(\.0+)?)%)\s*,){2}\s*(0(\.[0-9]+)?|1(\.0+)?)\s*\)|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgrey|darkgreen|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|grey|green|greenyellow|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgrey|lightgreen|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silverskyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|transparent|inherit|)$/.test(value ); // eslint-disable-line
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export default CSSColor;
|
package/src/types/DataType.js
CHANGED
|
@@ -11,7 +11,19 @@ class DataType {
|
|
|
11
11
|
static isValid(value) {
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
static
|
|
14
|
+
static attributeToProperty(attributeValue) {
|
|
15
|
+
return attributeValue;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
static propertyToAttribute(propertyValue) {
|
|
19
|
+
return `${propertyValue}`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
static valuesAreEqual(value1, value2) {
|
|
23
|
+
return value1 === value2;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
static generateTypeAccessors(types) {
|
|
15
27
|
Object.keys(types).forEach(type => {
|
|
16
28
|
Object.defineProperty(this, type, {
|
|
17
29
|
get() {
|