"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = createStyled; exports.shouldForwardProp = shouldForwardProp; exports.systemDefaultTheme = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _styledEngine = _interopRequireDefault(require("@mui/styled-engine")); var _utils = require("@mui/utils"); var _createTheme = _interopRequireDefault(require("./createTheme")); var _propsToClassKey = _interopRequireDefault(require("./propsToClassKey")); var _styleFunctionSx = _interopRequireDefault(require("./styleFunctionSx")); const _excluded = ["name", "slot", "skipVariantsResolver", "skipSx", "overridesResolver"], _excluded2 = ["theme"], _excluded3 = ["theme"]; function isEmpty(obj) { return Object.keys(obj).length === 0; } const getStyleOverrides = (name, theme) => { if (theme.components && theme.components[name] && theme.components[name].styleOverrides) { return theme.components[name].styleOverrides; } return null; }; const getVariantStyles = (name, theme) => { let variants = []; if (theme && theme.components && theme.components[name] && theme.components[name].variants) { variants = theme.components[name].variants; } const variantsStyles = {}; variants.forEach(definition => { const key = (0, _propsToClassKey.default)(definition.props); variantsStyles[key] = definition.style; }); return variantsStyles; }; const variantsResolver = (props, styles, theme, name) => { var _theme$components, _theme$components$nam; const { ownerState = {} } = props; const variantsStyles = []; const themeVariants = theme == null ? void 0 : (_theme$components = theme.components) == null ? void 0 : (_theme$components$nam = _theme$components[name]) == null ? void 0 : _theme$components$nam.variants; if (themeVariants) { themeVariants.forEach(themeVariant => { let isMatch = true; Object.keys(themeVariant.props).forEach(key => { if (ownerState[key] !== themeVariant.props[key] && props[key] !== themeVariant.props[key]) { isMatch = false; } }); if (isMatch) { variantsStyles.push(styles[(0, _propsToClassKey.default)(themeVariant.props)]); } }); } return variantsStyles; }; // Update /system/styled/#api in case if this changes function shouldForwardProp(prop) { return prop !== 'ownerState' && prop !== 'theme' && prop !== 'sx' && prop !== 'as'; } const systemDefaultTheme = (0, _createTheme.default)(); exports.systemDefaultTheme = systemDefaultTheme; const lowercaseFirstLetter = string => { return string.charAt(0).toLowerCase() + string.slice(1); }; function createStyled(input = {}) { const { defaultTheme = systemDefaultTheme, rootShouldForwardProp = shouldForwardProp, slotShouldForwardProp = shouldForwardProp, styleFunctionSx = _styleFunctionSx.default } = input; return (tag, inputOptions = {}) => { const { name: componentName, slot: componentSlot, skipVariantsResolver: inputSkipVariantsResolver, skipSx: inputSkipSx, overridesResolver } = inputOptions, options = (0, _objectWithoutPropertiesLoose2.default)(inputOptions, _excluded); // if skipVariantsResolver option is defined, take the value, otherwise, true for root and false for other slots. const skipVariantsResolver = inputSkipVariantsResolver !== undefined ? inputSkipVariantsResolver : componentSlot && componentSlot !== 'Root' || false; const skipSx = inputSkipSx || false; let label; if (process.env.NODE_ENV !== 'production') { if (componentName) { label = `${componentName}-${lowercaseFirstLetter(componentSlot || 'Root')}`; } } let shouldForwardPropOption = shouldForwardProp; if (componentSlot === 'Root') { shouldForwardPropOption = rootShouldForwardProp; } else if (componentSlot) { // any other slot specified shouldForwardPropOption = slotShouldForwardProp; } const defaultStyledResolver = (0, _styledEngine.default)(tag, (0, _extends2.default)({ shouldForwardProp: shouldForwardPropOption, label }, options)); const muiStyledResolver = (styleArg, ...expressions) => { const expressionsWithDefaultTheme = expressions ? expressions.map(stylesArg => { // On the server Emotion doesn't use React.forwardRef for creating components, so the created // component stays as a function. This condition makes sure that we do not interpolate functions // which are basically components used as a selectors. // eslint-disable-next-line no-underscore-dangle return typeof stylesArg === 'function' && stylesArg.__emotion_real !== stylesArg ? _ref => { let { theme: themeInput } = _ref, other = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded2); return stylesArg((0, _extends2.default)({ theme: isEmpty(themeInput) ? defaultTheme : themeInput }, other)); } : stylesArg; }) : []; let transformedStyleArg = styleArg; if (componentName && overridesResolver) { expressionsWithDefaultTheme.push(props => { const theme = isEmpty(props.theme) ? defaultTheme : props.theme; const styleOverrides = getStyleOverrides(componentName, theme); if (styleOverrides) { const resolvedStyleOverrides = {}; Object.entries(styleOverrides).forEach(([slotKey, slotStyle]) => { resolvedStyleOverrides[slotKey] = typeof slotStyle === 'function' ? slotStyle((0, _extends2.default)({}, props, { theme })) : slotStyle; }); return overridesResolver(props, resolvedStyleOverrides); } return null; }); } if (componentName && !skipVariantsResolver) { expressionsWithDefaultTheme.push(props => { const theme = isEmpty(props.theme) ? defaultTheme : props.theme; return variantsResolver(props, getVariantStyles(componentName, theme), theme, componentName); }); } if (!skipSx) { expressionsWithDefaultTheme.push(props => { const theme = isEmpty(props.theme) ? defaultTheme : props.theme; return styleFunctionSx((0, _extends2.default)({}, props, { theme })); }); } const numOfCustomFnsApplied = expressionsWithDefaultTheme.length - expressions.length; if (Array.isArray(styleArg) && numOfCustomFnsApplied > 0) { const placeholders = new Array(numOfCustomFnsApplied).fill(''); // If the type is array, than we need to add placeholders in the template for the overrides, variants and the sx styles. transformedStyleArg = [...styleArg, ...placeholders]; transformedStyleArg.raw = [...styleArg.raw, ...placeholders]; } else if (typeof styleArg === 'function' && // On the server Emotion doesn't use React.forwardRef for creating components, so the created // component stays as a function. This condition makes sure that we do not interpolate functions // which are basically components used as a selectors. // eslint-disable-next-line no-underscore-dangle styleArg.__emotion_real !== styleArg) { // If the type is function, we need to define the default theme. transformedStyleArg = _ref2 => { let { theme: themeInput } = _ref2, other = (0, _objectWithoutPropertiesLoose2.default)(_ref2, _excluded3); return styleArg((0, _extends2.default)({ theme: isEmpty(themeInput) ? defaultTheme : themeInput }, other)); }; } const Component = defaultStyledResolver(transformedStyleArg, ...expressionsWithDefaultTheme); if (process.env.NODE_ENV !== 'production') { let displayName; if (componentName) { displayName = `${componentName}${componentSlot || ''}`; } if (displayName === undefined) { displayName = `Styled(${(0, _utils.getDisplayName)(tag)})`; } Component.displayName = displayName; } return Component; }; if (defaultStyledResolver.withConfig) { muiStyledResolver.withConfig = defaultStyledResolver.withConfig; } return muiStyledResolver; }; }