kitchensink
Version:
Dispatch's awesome components and style guide
176 lines (147 loc) • 5.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.default = resolveMediaQueries;
var _windowMatchMedia = void 0;
function _getWindowMatchMedia(ExecutionEnvironment) {
if (_windowMatchMedia === undefined) {
_windowMatchMedia = !!ExecutionEnvironment.canUseDOM && !!window && !!window.matchMedia && function (mediaQueryString) {
return window.matchMedia(mediaQueryString);
} || null;
}
return _windowMatchMedia;
}
function _filterObject(obj, predicate) {
return Object.keys(obj).filter(function (key) {
return predicate(obj[key], key);
}).reduce(function (result, key) {
result[key] = obj[key];
return result;
}, {});
}
function _removeMediaQueries(style) {
return Object.keys(style).reduce(function (styleWithoutMedia, key) {
if (key.indexOf('@media') !== 0) {
styleWithoutMedia[key] = style[key];
}
return styleWithoutMedia;
}, {});
}
function _topLevelRulesToCSS(_ref) {
var addCSS = _ref.addCSS;
var appendImportantToEachValue = _ref.appendImportantToEachValue;
var cssRuleSetToString = _ref.cssRuleSetToString;
var hash = _ref.hash;
var isNestedStyle = _ref.isNestedStyle;
var style = _ref.style;
var userAgent = _ref.userAgent;
var className = '';
Object.keys(style).filter(function (name) {
return name.indexOf('@media') === 0;
}).map(function (query) {
var topLevelRules = appendImportantToEachValue(_filterObject(style[query], function (value) {
return !isNestedStyle(value);
}));
if (!Object.keys(topLevelRules).length) {
return;
}
var ruleCSS = cssRuleSetToString('', topLevelRules, userAgent);
// CSS classes cannot start with a number
var mediaQueryClassName = 'rmq-' + hash(query + ruleCSS);
var css = query + '{ .' + mediaQueryClassName + ruleCSS + '}';
addCSS(css);
className += (className ? ' ' : '') + mediaQueryClassName;
});
return className;
}
function _subscribeToMediaQuery(_ref2) {
var listener = _ref2.listener;
var listenersByQuery = _ref2.listenersByQuery;
var matchMedia = _ref2.matchMedia;
var mediaQueryListsByQuery = _ref2.mediaQueryListsByQuery;
var query = _ref2.query;
query = query.replace('@media ', '');
var mql = mediaQueryListsByQuery[query];
if (!mql && matchMedia) {
mediaQueryListsByQuery[query] = mql = matchMedia(query);
}
if (!listenersByQuery || !listenersByQuery[query]) {
mql.addListener(listener);
listenersByQuery[query] = {
remove: function remove() {
mql.removeListener(listener);
}
};
}
return mql;
}
function resolveMediaQueries(_ref3) {
var ExecutionEnvironment = _ref3.ExecutionEnvironment;
var addCSS = _ref3.addCSS;
var appendImportantToEachValue = _ref3.appendImportantToEachValue;
var config = _ref3.config;
var cssRuleSetToString = _ref3.cssRuleSetToString;
var getComponentField = _ref3.getComponentField;
var getGlobalState = _ref3.getGlobalState;
var hash = _ref3.hash;
var isNestedStyle = _ref3.isNestedStyle;
var mergeStyles = _ref3.mergeStyles;
var props = _ref3.props;
var setState = _ref3.setState;
var style = _ref3.style;
// eslint-disable-line no-shadow
var newStyle = _removeMediaQueries(style);
var mediaQueryClassNames = _topLevelRulesToCSS({
addCSS: addCSS,
appendImportantToEachValue: appendImportantToEachValue,
cssRuleSetToString: cssRuleSetToString,
hash: hash,
isNestedStyle: isNestedStyle,
style: style,
userAgent: config.userAgent
});
var newProps = mediaQueryClassNames ? {
className: mediaQueryClassNames + (props.className ? ' ' + props.className : '')
} : null;
var matchMedia = config.matchMedia || _getWindowMatchMedia(ExecutionEnvironment);
if (!matchMedia) {
return {
props: newProps,
style: newStyle
};
}
var listenersByQuery = _extends({}, getComponentField('_radiumMediaQueryListenersByQuery'));
var mediaQueryListsByQuery = getGlobalState('mediaQueryListsByQuery') || {};
Object.keys(style).filter(function (name) {
return name.indexOf('@media') === 0;
}).map(function (query) {
var nestedRules = _filterObject(style[query], isNestedStyle);
if (!Object.keys(nestedRules).length) {
return;
}
var mql = _subscribeToMediaQuery({
listener: function listener() {
return setState(query, mql.matches, '_all');
},
listenersByQuery: listenersByQuery,
matchMedia: matchMedia,
mediaQueryListsByQuery: mediaQueryListsByQuery,
query: query
});
// Apply media query states
if (mql.matches) {
newStyle = mergeStyles([newStyle, nestedRules]);
}
});
return {
componentFields: {
_radiumMediaQueryListenersByQuery: listenersByQuery
},
globalState: { mediaQueryListsByQuery: mediaQueryListsByQuery },
props: newProps,
style: newStyle
};
}
module.exports = exports['default'];