UNPKG

@shopify/polaris

Version:

Shopify’s admin product component library

88 lines (77 loc) 3.21 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var React = require('react'); var DefaultThemeColors = require('@shopify/polaris-tokens/dist-modern/theme/base.json'); var context = require('../../utilities/theme/context.js'); var utils = require('../../utilities/theme/utils.js'); var tokens = require('../../utilities/theme/tokens.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var DefaultThemeColors__default = /*#__PURE__*/_interopDefaultLegacy(DefaultThemeColors); function ThemeProvider({ theme: themeConfig = {}, alwaysRenderCustomProperties = false, children }) { const parentContext = React.useContext(context.ThemeContext); const isParentThemeProvider = parentContext === undefined; const parentColorScheme = parentContext && parentContext.colorScheme && parentContext.colorScheme; const parentColors = parentContext && parentContext.colors && parentContext.colors; const [customProperties, theme] = React.useMemo(() => { const { colors, colorScheme, ...rest } = themeConfig; const processedThemeConfig = { ...rest, ...{ colorScheme: getColorScheme(colorScheme, parentColorScheme) }, colors: { ...(isParentThemeProvider && DefaultThemeColors__default['default']), ...(parentColors != null && parentColors), ...colors } }; const customProperties = utils.buildCustomProperties(processedThemeConfig, tokens.Tokens); const theme = utils.buildThemeContext(processedThemeConfig, customProperties); return [customProperties, theme]; }, [isParentThemeProvider, parentColorScheme, parentColors, themeConfig]); // We want these values to be empty string instead of `undefined` when not set. // Otherwise, setting a style property to `undefined` does not remove it from the DOM. const backgroundColor = customProperties['--p-background'] || ''; const color = customProperties['--p-text'] || ''; React.useEffect(() => { if (isParentThemeProvider) { document.body.style.backgroundColor = backgroundColor; document.body.style.color = color; } }, [backgroundColor, color, isParentThemeProvider]); let style; if (isParentThemeProvider) { style = customProperties; } else if (alwaysRenderCustomProperties || !isParentThemeProvider && parentContext.cssCustomProperties !== utils.toString(customProperties)) { style = { ...customProperties, ...{ color } }; } else { style = { color }; } return /*#__PURE__*/React__default['default'].createElement(context.ThemeContext.Provider, { value: theme }, /*#__PURE__*/React__default['default'].createElement("div", { style: style }, children)); } function getColorScheme(colorScheme, parentColorScheme) { if (colorScheme == null) { return parentColorScheme || 'light'; } else if (colorScheme === 'inverse') { return parentColorScheme === 'dark' || parentColorScheme === undefined ? 'light' : 'dark'; } else { return colorScheme; } } exports.ThemeProvider = ThemeProvider;