1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 |
|
7 | 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; };
|
8 |
|
9 | exports.default = resolveMediaQueries;
|
10 | var _windowMatchMedia = void 0;
|
11 | function _getWindowMatchMedia(ExecutionEnvironment) {
|
12 | if (_windowMatchMedia === undefined) {
|
13 | _windowMatchMedia = !!ExecutionEnvironment.canUseDOM && !!window && !!window.matchMedia && function (mediaQueryString) {
|
14 | return window.matchMedia(mediaQueryString);
|
15 | } || null;
|
16 | }
|
17 | return _windowMatchMedia;
|
18 | }
|
19 |
|
20 | function _filterObject(obj, predicate) {
|
21 | return Object.keys(obj).filter(function (key) {
|
22 | return predicate(obj[key], key);
|
23 | }).reduce(function (result, key) {
|
24 | result[key] = obj[key];
|
25 | return result;
|
26 | }, {});
|
27 | }
|
28 |
|
29 | function _removeMediaQueries(style) {
|
30 | return Object.keys(style).reduce(function (styleWithoutMedia, key) {
|
31 | if (key.indexOf('@media') !== 0) {
|
32 | styleWithoutMedia[key] = style[key];
|
33 | }
|
34 | return styleWithoutMedia;
|
35 | }, {});
|
36 | }
|
37 |
|
38 | function _topLevelRulesToCSS(_ref) {
|
39 | var addCSS = _ref.addCSS,
|
40 | appendImportantToEachValue = _ref.appendImportantToEachValue,
|
41 | cssRuleSetToString = _ref.cssRuleSetToString,
|
42 | hash = _ref.hash,
|
43 | isNestedStyle = _ref.isNestedStyle,
|
44 | style = _ref.style,
|
45 | userAgent = _ref.userAgent;
|
46 |
|
47 | var className = '';
|
48 | Object.keys(style).filter(function (name) {
|
49 | return name.indexOf('@media') === 0;
|
50 | }).map(function (query) {
|
51 | var topLevelRules = appendImportantToEachValue(_filterObject(style[query], function (value) {
|
52 | return !isNestedStyle(value);
|
53 | }));
|
54 |
|
55 | if (!Object.keys(topLevelRules).length) {
|
56 | return;
|
57 | }
|
58 |
|
59 | var ruleCSS = cssRuleSetToString('', topLevelRules, userAgent);
|
60 |
|
61 |
|
62 | var mediaQueryClassName = 'rmq-' + hash(query + ruleCSS);
|
63 | var css = query + '{ .' + mediaQueryClassName + ruleCSS + '}';
|
64 |
|
65 | addCSS(css);
|
66 |
|
67 | className += (className ? ' ' : '') + mediaQueryClassName;
|
68 | });
|
69 | return className;
|
70 | }
|
71 |
|
72 | function _subscribeToMediaQuery(_ref2) {
|
73 | var listener = _ref2.listener,
|
74 | listenersByQuery = _ref2.listenersByQuery,
|
75 | matchMedia = _ref2.matchMedia,
|
76 | mediaQueryListsByQuery = _ref2.mediaQueryListsByQuery,
|
77 | query = _ref2.query;
|
78 |
|
79 | query = query.replace('@media ', '');
|
80 |
|
81 | var mql = mediaQueryListsByQuery[query];
|
82 | if (!mql && matchMedia) {
|
83 | mediaQueryListsByQuery[query] = mql = matchMedia(query);
|
84 | }
|
85 |
|
86 | if (!listenersByQuery || !listenersByQuery[query]) {
|
87 | mql.addListener(listener);
|
88 |
|
89 | listenersByQuery[query] = {
|
90 | remove: function remove() {
|
91 | mql.removeListener(listener);
|
92 | }
|
93 | };
|
94 | }
|
95 | return mql;
|
96 | }
|
97 |
|
98 | function resolveMediaQueries(_ref3) {
|
99 | var ExecutionEnvironment = _ref3.ExecutionEnvironment,
|
100 | addCSS = _ref3.addCSS,
|
101 | appendImportantToEachValue = _ref3.appendImportantToEachValue,
|
102 | config = _ref3.config,
|
103 | cssRuleSetToString = _ref3.cssRuleSetToString,
|
104 | getComponentField = _ref3.getComponentField,
|
105 | getGlobalState = _ref3.getGlobalState,
|
106 | hash = _ref3.hash,
|
107 | isNestedStyle = _ref3.isNestedStyle,
|
108 | mergeStyles = _ref3.mergeStyles,
|
109 | props = _ref3.props,
|
110 | setState = _ref3.setState,
|
111 | style = _ref3.style;
|
112 |
|
113 |
|
114 | var newStyle = _removeMediaQueries(style);
|
115 | var mediaQueryClassNames = _topLevelRulesToCSS({
|
116 | addCSS: addCSS,
|
117 | appendImportantToEachValue: appendImportantToEachValue,
|
118 | cssRuleSetToString: cssRuleSetToString,
|
119 | hash: hash,
|
120 | isNestedStyle: isNestedStyle,
|
121 | style: style,
|
122 | userAgent: config.userAgent
|
123 | });
|
124 |
|
125 | var newProps = mediaQueryClassNames ? {
|
126 | className: mediaQueryClassNames + (props.className ? ' ' + props.className : '')
|
127 | } : null;
|
128 |
|
129 | var matchMedia = config.matchMedia || _getWindowMatchMedia(ExecutionEnvironment);
|
130 |
|
131 | if (!matchMedia) {
|
132 | return {
|
133 | props: newProps,
|
134 | style: newStyle
|
135 | };
|
136 | }
|
137 |
|
138 | var listenersByQuery = _extends({}, getComponentField('_radiumMediaQueryListenersByQuery'));
|
139 | var mediaQueryListsByQuery = getGlobalState('mediaQueryListsByQuery') || {};
|
140 |
|
141 | Object.keys(style).filter(function (name) {
|
142 | return name.indexOf('@media') === 0;
|
143 | }).map(function (query) {
|
144 | var nestedRules = _filterObject(style[query], isNestedStyle);
|
145 |
|
146 | if (!Object.keys(nestedRules).length) {
|
147 | return;
|
148 | }
|
149 |
|
150 | var mql = _subscribeToMediaQuery({
|
151 | listener: function listener() {
|
152 | return setState(query, mql.matches, '_all');
|
153 | },
|
154 | listenersByQuery: listenersByQuery,
|
155 | matchMedia: matchMedia,
|
156 | mediaQueryListsByQuery: mediaQueryListsByQuery,
|
157 | query: query
|
158 | });
|
159 |
|
160 |
|
161 | if (mql.matches) {
|
162 | newStyle = mergeStyles([newStyle, nestedRules]);
|
163 | }
|
164 | });
|
165 |
|
166 | return {
|
167 | componentFields: {
|
168 | _radiumMediaQueryListenersByQuery: listenersByQuery
|
169 | },
|
170 | globalState: { mediaQueryListsByQuery: mediaQueryListsByQuery },
|
171 | props: newProps,
|
172 | style: newStyle
|
173 | };
|
174 | }
|
175 | module.exports = exports['default']; |
\ | No newline at end of file |