GoScrobble/web/node_modules/@material-ui/system/es/style.js

63 lines
1.4 KiB
JavaScript
Raw Normal View History

2022-04-25 02:47:15 +00:00
import responsivePropType from './responsivePropType';
import { handleBreakpoints } from './breakpoints';
function getPath(obj, path) {
if (!path || typeof path !== 'string') {
return null;
}
return path.split('.').reduce((acc, item) => acc && acc[item] ? acc[item] : null, obj);
}
function style(options) {
const {
prop,
cssProperty = options.prop,
themeKey,
transform
} = options;
const fn = props => {
if (props[prop] == null) {
return null;
}
const propValue = props[prop];
const theme = props.theme;
const themeMapping = getPath(theme, themeKey) || {};
const styleFromPropValue = propValueFinal => {
let value;
if (typeof themeMapping === 'function') {
value = themeMapping(propValueFinal);
} else if (Array.isArray(themeMapping)) {
value = themeMapping[propValueFinal] || propValueFinal;
} else {
value = getPath(themeMapping, propValueFinal) || propValueFinal;
if (transform) {
value = transform(value);
}
}
if (cssProperty === false) {
return value;
}
return {
[cssProperty]: value
};
};
return handleBreakpoints(props, propValue, styleFromPropValue);
};
fn.propTypes = process.env.NODE_ENV !== 'production' ? {
[prop]: responsivePropType
} : {};
fn.filterProps = [prop];
return fn;
}
export default style;