@khanacademy/wonder-blocks-layout 1.4.2 → 1.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/index.js +164 -528
- package/dist/index.js +264 -408
- package/package.json +7 -6
- package/src/components/media-layout.js +2 -3
- package/src/components/spring.stories.js +8 -12
- package/src/components/strut.stories.js +8 -12
- package/src/__tests__/index.test.js +0 -25
package/dist/es/index.js
CHANGED
|
@@ -1,277 +1,15 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _extends from '@babel/runtime/helpers/extends';
|
|
2
|
+
import { createContext, Component, createElement } from 'react';
|
|
2
3
|
import Spacing from '@khanacademy/wonder-blocks-spacing';
|
|
3
4
|
import { StyleSheet } from 'aphrodite';
|
|
4
5
|
import { View } from '@khanacademy/wonder-blocks-core';
|
|
5
6
|
|
|
6
|
-
function _classCallCheck(instance, Constructor) {
|
|
7
|
-
if (!(instance instanceof Constructor)) {
|
|
8
|
-
throw new TypeError("Cannot call a class as a function");
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function _defineProperties(target, props) {
|
|
13
|
-
for (var i = 0; i < props.length; i++) {
|
|
14
|
-
var descriptor = props[i];
|
|
15
|
-
descriptor.enumerable = descriptor.enumerable || false;
|
|
16
|
-
descriptor.configurable = true;
|
|
17
|
-
if ("value" in descriptor) descriptor.writable = true;
|
|
18
|
-
Object.defineProperty(target, descriptor.key, descriptor);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function _createClass(Constructor, protoProps, staticProps) {
|
|
23
|
-
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
24
|
-
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
25
|
-
return Constructor;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function _defineProperty(obj, key, value) {
|
|
29
|
-
if (key in obj) {
|
|
30
|
-
Object.defineProperty(obj, key, {
|
|
31
|
-
value: value,
|
|
32
|
-
enumerable: true,
|
|
33
|
-
configurable: true,
|
|
34
|
-
writable: true
|
|
35
|
-
});
|
|
36
|
-
} else {
|
|
37
|
-
obj[key] = value;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return obj;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function _extends() {
|
|
44
|
-
_extends = Object.assign || function (target) {
|
|
45
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
46
|
-
var source = arguments[i];
|
|
47
|
-
|
|
48
|
-
for (var key in source) {
|
|
49
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
50
|
-
target[key] = source[key];
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return target;
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
return _extends.apply(this, arguments);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function _inherits(subClass, superClass) {
|
|
62
|
-
if (typeof superClass !== "function" && superClass !== null) {
|
|
63
|
-
throw new TypeError("Super expression must either be null or a function");
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
67
|
-
constructor: {
|
|
68
|
-
value: subClass,
|
|
69
|
-
writable: true,
|
|
70
|
-
configurable: true
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
if (superClass) _setPrototypeOf(subClass, superClass);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function _getPrototypeOf(o) {
|
|
77
|
-
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
|
|
78
|
-
return o.__proto__ || Object.getPrototypeOf(o);
|
|
79
|
-
};
|
|
80
|
-
return _getPrototypeOf(o);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function _setPrototypeOf(o, p) {
|
|
84
|
-
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
|
|
85
|
-
o.__proto__ = p;
|
|
86
|
-
return o;
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
return _setPrototypeOf(o, p);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function _isNativeReflectConstruct() {
|
|
93
|
-
if (typeof Reflect === "undefined" || !Reflect.construct) return false;
|
|
94
|
-
if (Reflect.construct.sham) return false;
|
|
95
|
-
if (typeof Proxy === "function") return true;
|
|
96
|
-
|
|
97
|
-
try {
|
|
98
|
-
Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
|
|
99
|
-
return true;
|
|
100
|
-
} catch (e) {
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function _assertThisInitialized(self) {
|
|
106
|
-
if (self === void 0) {
|
|
107
|
-
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return self;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
function _possibleConstructorReturn(self, call) {
|
|
114
|
-
if (call && (typeof call === "object" || typeof call === "function")) {
|
|
115
|
-
return call;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return _assertThisInitialized(self);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function _createSuper(Derived) {
|
|
122
|
-
var hasNativeReflectConstruct = _isNativeReflectConstruct();
|
|
123
|
-
|
|
124
|
-
return function _createSuperInternal() {
|
|
125
|
-
var Super = _getPrototypeOf(Derived),
|
|
126
|
-
result;
|
|
127
|
-
|
|
128
|
-
if (hasNativeReflectConstruct) {
|
|
129
|
-
var NewTarget = _getPrototypeOf(this).constructor;
|
|
130
|
-
|
|
131
|
-
result = Reflect.construct(Super, arguments, NewTarget);
|
|
132
|
-
} else {
|
|
133
|
-
result = Super.apply(this, arguments);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return _possibleConstructorReturn(this, result);
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
function _slicedToArray(arr, i) {
|
|
141
|
-
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function _toConsumableArray(arr) {
|
|
145
|
-
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
function _arrayWithoutHoles(arr) {
|
|
149
|
-
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
function _arrayWithHoles(arr) {
|
|
153
|
-
if (Array.isArray(arr)) return arr;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
function _iterableToArray(iter) {
|
|
157
|
-
if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function _iterableToArrayLimit(arr, i) {
|
|
161
|
-
if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
|
|
162
|
-
var _arr = [];
|
|
163
|
-
var _n = true;
|
|
164
|
-
var _d = false;
|
|
165
|
-
var _e = undefined;
|
|
166
|
-
|
|
167
|
-
try {
|
|
168
|
-
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
|
|
169
|
-
_arr.push(_s.value);
|
|
170
|
-
|
|
171
|
-
if (i && _arr.length === i) break;
|
|
172
|
-
}
|
|
173
|
-
} catch (err) {
|
|
174
|
-
_d = true;
|
|
175
|
-
_e = err;
|
|
176
|
-
} finally {
|
|
177
|
-
try {
|
|
178
|
-
if (!_n && _i["return"] != null) _i["return"]();
|
|
179
|
-
} finally {
|
|
180
|
-
if (_d) throw _e;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
return _arr;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
function _unsupportedIterableToArray(o, minLen) {
|
|
188
|
-
if (!o) return;
|
|
189
|
-
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
|
190
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
191
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
192
|
-
if (n === "Map" || n === "Set") return Array.from(o);
|
|
193
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function _arrayLikeToArray(arr, len) {
|
|
197
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
198
|
-
|
|
199
|
-
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
|
200
|
-
|
|
201
|
-
return arr2;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
function _nonIterableSpread() {
|
|
205
|
-
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
function _nonIterableRest() {
|
|
209
|
-
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
function _createForOfIteratorHelper(o, allowArrayLike) {
|
|
213
|
-
var it;
|
|
214
|
-
|
|
215
|
-
if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
|
|
216
|
-
if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
|
|
217
|
-
if (it) o = it;
|
|
218
|
-
var i = 0;
|
|
219
|
-
|
|
220
|
-
var F = function () {};
|
|
221
|
-
|
|
222
|
-
return {
|
|
223
|
-
s: F,
|
|
224
|
-
n: function () {
|
|
225
|
-
if (i >= o.length) return {
|
|
226
|
-
done: true
|
|
227
|
-
};
|
|
228
|
-
return {
|
|
229
|
-
done: false,
|
|
230
|
-
value: o[i++]
|
|
231
|
-
};
|
|
232
|
-
},
|
|
233
|
-
e: function (e) {
|
|
234
|
-
throw e;
|
|
235
|
-
},
|
|
236
|
-
f: F
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
var normalCompletion = true,
|
|
244
|
-
didErr = false,
|
|
245
|
-
err;
|
|
246
|
-
return {
|
|
247
|
-
s: function () {
|
|
248
|
-
it = o[Symbol.iterator]();
|
|
249
|
-
},
|
|
250
|
-
n: function () {
|
|
251
|
-
var step = it.next();
|
|
252
|
-
normalCompletion = step.done;
|
|
253
|
-
return step;
|
|
254
|
-
},
|
|
255
|
-
e: function (e) {
|
|
256
|
-
didErr = true;
|
|
257
|
-
err = e;
|
|
258
|
-
},
|
|
259
|
-
f: function () {
|
|
260
|
-
try {
|
|
261
|
-
if (!normalCompletion && it.return != null) it.return();
|
|
262
|
-
} finally {
|
|
263
|
-
if (didErr) throw err;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
|
|
269
7
|
// All possible valid media sizes
|
|
270
|
-
|
|
271
|
-
|
|
8
|
+
const VALID_MEDIA_SIZES = ["small", "medium", "large"];
|
|
9
|
+
const mediaDefaultSpecLargeMarginWidth = Spacing.large_24; // The default spec for media layout, currently available in
|
|
272
10
|
// three different settings (roughly mobile, tablet, and desktop).
|
|
273
11
|
|
|
274
|
-
|
|
12
|
+
const MEDIA_DEFAULT_SPEC = {
|
|
275
13
|
small: {
|
|
276
14
|
query: "(max-width: 767px)",
|
|
277
15
|
totalColumns: 4,
|
|
@@ -293,7 +31,7 @@ var MEDIA_DEFAULT_SPEC = {
|
|
|
293
31
|
}
|
|
294
32
|
}; // Used for internal tools
|
|
295
33
|
|
|
296
|
-
|
|
34
|
+
const MEDIA_INTERNAL_SPEC = {
|
|
297
35
|
large: {
|
|
298
36
|
query: "(min-width: 1px)",
|
|
299
37
|
totalColumns: 12,
|
|
@@ -302,7 +40,7 @@ var MEDIA_INTERNAL_SPEC = {
|
|
|
302
40
|
}
|
|
303
41
|
}; // The default used for modals
|
|
304
42
|
|
|
305
|
-
|
|
43
|
+
const MEDIA_MODAL_SPEC = {
|
|
306
44
|
small: {
|
|
307
45
|
query: "(max-width: 767px)",
|
|
308
46
|
totalColumns: 4,
|
|
@@ -317,24 +55,18 @@ var MEDIA_MODAL_SPEC = {
|
|
|
317
55
|
}
|
|
318
56
|
};
|
|
319
57
|
|
|
320
|
-
|
|
58
|
+
const defaultContext = {
|
|
321
59
|
ssrSize: "large",
|
|
322
60
|
mediaSpec: MEDIA_DEFAULT_SPEC
|
|
323
61
|
};
|
|
324
|
-
var MediaLayoutContext = createContext(defaultContext);
|
|
62
|
+
var MediaLayoutContext = /*#__PURE__*/createContext(defaultContext);
|
|
325
63
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
})), _toConsumableArray(Object.values(MEDIA_INTERNAL_SPEC).map(function (spec) {
|
|
329
|
-
return spec.query;
|
|
330
|
-
})), _toConsumableArray(Object.values(MEDIA_MODAL_SPEC).map(function (spec) {
|
|
331
|
-
return spec.query;
|
|
332
|
-
})));
|
|
333
|
-
var mediaQueryLists = {}; // eslint-disable-next-line flowtype/require-exact-type
|
|
64
|
+
const queries = [].concat(Object.values(MEDIA_DEFAULT_SPEC).map(spec => spec.query), Object.values(MEDIA_INTERNAL_SPEC).map(spec => spec.query), Object.values(MEDIA_MODAL_SPEC).map(spec => spec.query));
|
|
65
|
+
const mediaQueryLists = {}; // eslint-disable-next-line flowtype/require-exact-type
|
|
334
66
|
|
|
335
67
|
// If for some reason we're not able to resolve the current media size we
|
|
336
68
|
// fall back to this state.
|
|
337
|
-
|
|
69
|
+
const DEFAULT_SIZE = "large";
|
|
338
70
|
|
|
339
71
|
/**
|
|
340
72
|
* `MediaLayout` is responsible for changing the rendering of contents at
|
|
@@ -342,268 +74,185 @@ var DEFAULT_SIZE = "large";
|
|
|
342
74
|
* to specify different breakpoint configurations. By default it uses
|
|
343
75
|
* `MEDIA_DEFAULT_SPEC`. See media-layout-context.js for additiional options.
|
|
344
76
|
*/
|
|
345
|
-
|
|
346
|
-
_inherits(MediaLayoutInternal, _React$Component);
|
|
347
|
-
|
|
348
|
-
var _super = _createSuper(MediaLayoutInternal);
|
|
349
|
-
|
|
77
|
+
class MediaLayoutInternal extends Component {
|
|
350
78
|
// A collection of thunks that's used to clean up event listeners
|
|
351
79
|
// when the component is unmounted.
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
_classCallCheck(this, MediaLayoutInternal);
|
|
356
|
-
|
|
357
|
-
_this = _super.call(this, props);
|
|
358
|
-
|
|
359
|
-
_defineProperty(_assertThisInitialized(_this), "cleanupThunks", void 0);
|
|
360
|
-
|
|
361
|
-
_this.state = {
|
|
80
|
+
constructor(props) {
|
|
81
|
+
super(props);
|
|
82
|
+
this.state = {
|
|
362
83
|
size: undefined
|
|
363
84
|
};
|
|
364
|
-
|
|
365
|
-
return _this;
|
|
85
|
+
this.cleanupThunks = [];
|
|
366
86
|
}
|
|
367
87
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
var _this2 = this;
|
|
88
|
+
componentDidMount() {
|
|
89
|
+
// TODO(WB-534): handle changes to mediaSpec prop
|
|
90
|
+
const entries = Object.entries(this.props.mediaSpec);
|
|
372
91
|
|
|
373
|
-
|
|
374
|
-
|
|
92
|
+
for (const [size, spec] of entries) {
|
|
93
|
+
const mql = mediaQueryLists[spec.query]; // during SSR there are no MediaQueryLists
|
|
375
94
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
spec = _entries$_i[1];
|
|
380
|
-
|
|
381
|
-
var mql = mediaQueryLists[spec.query]; // during SSR there are no MediaQueryLists
|
|
95
|
+
if (!mql) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
382
98
|
|
|
383
|
-
|
|
384
|
-
|
|
99
|
+
const listener = e => {
|
|
100
|
+
if (e.matches) {
|
|
101
|
+
this.setState({
|
|
102
|
+
size
|
|
103
|
+
});
|
|
385
104
|
}
|
|
105
|
+
};
|
|
386
106
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
};
|
|
107
|
+
mql.addListener(listener);
|
|
108
|
+
this.cleanupThunks.push(() => mql.removeListener(listener));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
394
111
|
|
|
395
|
-
|
|
112
|
+
componentWillUnmount() {
|
|
113
|
+
// Remove our listeners.
|
|
114
|
+
this.cleanupThunks.forEach(cleaup => cleaup());
|
|
115
|
+
}
|
|
396
116
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
117
|
+
getCurrentSize(spec) {
|
|
118
|
+
// If we have a state with the current size in it then we always want
|
|
119
|
+
// to use that. This will happen if the viewport changes sizes after
|
|
120
|
+
// we've already initialized.
|
|
121
|
+
if (this.state.size) {
|
|
122
|
+
return this.state.size;
|
|
123
|
+
} else {
|
|
124
|
+
const entries = Object.entries(this.props.mediaSpec);
|
|
401
125
|
|
|
402
|
-
for (
|
|
403
|
-
|
|
126
|
+
for (const [size, _spec] of entries) {
|
|
127
|
+
const mql = mediaQueryLists[_spec.query];
|
|
404
128
|
|
|
405
|
-
if (
|
|
406
|
-
|
|
407
|
-
}
|
|
408
|
-
}, {
|
|
409
|
-
key: "componentWillUnmount",
|
|
410
|
-
value: function componentWillUnmount() {
|
|
411
|
-
// Remove our listeners.
|
|
412
|
-
this.cleanupThunks.forEach(function (cleaup) {
|
|
413
|
-
return cleaup();
|
|
414
|
-
});
|
|
415
|
-
}
|
|
416
|
-
}, {
|
|
417
|
-
key: "getCurrentSize",
|
|
418
|
-
value: function getCurrentSize(spec) {
|
|
419
|
-
// If we have a state with the current size in it then we always want
|
|
420
|
-
// to use that. This will happen if the viewport changes sizes after
|
|
421
|
-
// we've already initialized.
|
|
422
|
-
if (this.state.size) {
|
|
423
|
-
return this.state.size;
|
|
424
|
-
} else {
|
|
425
|
-
var entries = Object.entries(this.props.mediaSpec);
|
|
426
|
-
|
|
427
|
-
for (var _i2 = 0, _entries2 = entries; _i2 < _entries2.length; _i2++) {
|
|
428
|
-
var _entries2$_i = _slicedToArray(_entries2[_i2], 2),
|
|
429
|
-
size = _entries2$_i[0],
|
|
430
|
-
_spec = _entries2$_i[1];
|
|
431
|
-
|
|
432
|
-
var mql = mediaQueryLists[_spec.query];
|
|
433
|
-
|
|
434
|
-
if (mql.matches) {
|
|
435
|
-
return size;
|
|
436
|
-
}
|
|
129
|
+
if (mql.matches) {
|
|
130
|
+
return size;
|
|
437
131
|
}
|
|
438
132
|
}
|
|
133
|
+
}
|
|
439
134
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
}, {
|
|
446
|
-
key: "isServerSide",
|
|
447
|
-
value: function isServerSide() {
|
|
448
|
-
return typeof window === "undefined" || !window.matchMedia;
|
|
449
|
-
} // Generate a mock Aphrodite StyleSheet based upon the current mediaSize
|
|
450
|
-
// We do this by looking at all of the stylesheets specified in the
|
|
451
|
-
// styleSheets prop and then all of the individual styles. We merge the
|
|
452
|
-
// styles together
|
|
453
|
-
// TODO(WB-533): move to util.js to make it easier to test
|
|
454
|
-
|
|
455
|
-
}, {
|
|
456
|
-
key: "getMockStyleSheet",
|
|
457
|
-
value: function getMockStyleSheet(mediaSize) {
|
|
458
|
-
var styleSheets = this.props.styleSheets;
|
|
459
|
-
var mockStyleSheet = {}; // If no stylesheets were specified then we just return an empty object
|
|
460
|
-
|
|
461
|
-
if (!styleSheets) {
|
|
462
|
-
return mockStyleSheet;
|
|
463
|
-
} // Go through all of the stylesheets that were specified
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
for (var _i3 = 0, _Object$keys = Object.keys(styleSheets); _i3 < _Object$keys.length; _i3++) {
|
|
467
|
-
var styleSize = _Object$keys[_i3];
|
|
468
|
-
var styleSheet = styleSheets[styleSize];
|
|
469
|
-
|
|
470
|
-
if (!styleSheet) {
|
|
471
|
-
continue;
|
|
472
|
-
} // And then through each key of each stylesheet
|
|
473
|
-
|
|
135
|
+
return DEFAULT_SIZE;
|
|
136
|
+
} // We assume that we're running on the server (or, at least, an unsupported
|
|
137
|
+
// environment) if there is no window object or matchMedia function
|
|
138
|
+
// available.
|
|
474
139
|
|
|
475
|
-
for (var _i4 = 0, _Object$keys2 = Object.keys(styleSheet); _i4 < _Object$keys2.length; _i4++) {
|
|
476
|
-
var name = _Object$keys2[_i4];
|
|
477
140
|
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
141
|
+
isServerSide() {
|
|
142
|
+
return typeof window === "undefined" || !window.matchMedia;
|
|
143
|
+
} // Generate a mock Aphrodite StyleSheet based upon the current mediaSize
|
|
144
|
+
// We do this by looking at all of the stylesheets specified in the
|
|
145
|
+
// styleSheets prop and then all of the individual styles. We merge the
|
|
146
|
+
// styles together
|
|
147
|
+
// TODO(WB-533): move to util.js to make it easier to test
|
|
485
148
|
|
|
486
149
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
150
|
+
getMockStyleSheet(mediaSize) {
|
|
151
|
+
const {
|
|
152
|
+
styleSheets
|
|
153
|
+
} = this.props;
|
|
154
|
+
const mockStyleSheet = {}; // If no stylesheets were specified then we just return an empty object
|
|
490
155
|
|
|
156
|
+
if (!styleSheets) {
|
|
491
157
|
return mockStyleSheet;
|
|
492
|
-
}
|
|
493
|
-
}, {
|
|
494
|
-
key: "render",
|
|
495
|
-
value: function render() {
|
|
496
|
-
var _this$props = this.props,
|
|
497
|
-
children = _this$props.children,
|
|
498
|
-
mediaSpec = _this$props.mediaSpec,
|
|
499
|
-
ssrSize = _this$props.ssrSize,
|
|
500
|
-
overrideSize = _this$props.overrideSize; // We need to create the MediaQueryLists during the first render in order
|
|
501
|
-
// to query whether any of them match.
|
|
502
|
-
|
|
503
|
-
if (!this.isServerSide()) {
|
|
504
|
-
var _iterator = _createForOfIteratorHelper(queries.filter(function (query) {
|
|
505
|
-
return !mediaQueryLists[query];
|
|
506
|
-
})),
|
|
507
|
-
_step;
|
|
508
|
-
|
|
509
|
-
try {
|
|
510
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
511
|
-
var query = _step.value;
|
|
512
|
-
mediaQueryLists[query] = window.matchMedia(query);
|
|
513
|
-
}
|
|
514
|
-
} catch (err) {
|
|
515
|
-
_iterator.e(err);
|
|
516
|
-
} finally {
|
|
517
|
-
_iterator.f();
|
|
518
|
-
}
|
|
519
|
-
} // We need to figure out what the current media size is
|
|
520
|
-
// If an override has been specified, we use that.
|
|
521
|
-
// If we're rendering on the server then we use the default
|
|
522
|
-
// SSR rendering size.
|
|
523
|
-
// Otherwise we attempt to get the current size based on
|
|
524
|
-
// the current MediaSpec.
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
var mediaSize = overrideSize || this.isServerSide() && ssrSize || this.getCurrentSize(mediaSpec); // Generate a mock stylesheet
|
|
528
|
-
|
|
529
|
-
var styles = this.getMockStyleSheet(mediaSize);
|
|
530
|
-
return children({
|
|
531
|
-
mediaSize: mediaSize,
|
|
532
|
-
mediaSpec: mediaSpec,
|
|
533
|
-
styles: styles
|
|
534
|
-
});
|
|
535
|
-
}
|
|
536
|
-
}]);
|
|
158
|
+
} // Go through all of the stylesheets that were specified
|
|
537
159
|
|
|
538
|
-
return MediaLayoutInternal;
|
|
539
|
-
}(Component); // gen-snapshot-tests.js only understands `export default class ...`
|
|
540
160
|
|
|
161
|
+
for (const styleSize of Object.keys(styleSheets)) {
|
|
162
|
+
const styleSheet = styleSheets[styleSize];
|
|
541
163
|
|
|
542
|
-
|
|
543
|
-
|
|
164
|
+
if (!styleSheet) {
|
|
165
|
+
continue;
|
|
166
|
+
} // And then through each key of each stylesheet
|
|
544
167
|
|
|
545
|
-
var _super2 = _createSuper(MediaLayout);
|
|
546
168
|
|
|
547
|
-
|
|
548
|
-
|
|
169
|
+
for (const name of Object.keys(styleSheet)) {
|
|
170
|
+
if ( // $FlowIgnore[method-unbinding]
|
|
171
|
+
Object.prototype.hasOwnProperty.call(mockStyleSheet, name)) {
|
|
172
|
+
continue;
|
|
173
|
+
} // We create an entry that combines the values from all of
|
|
174
|
+
// the stylesheets together in least-specific to most-specific
|
|
175
|
+
// priority (thus small/medium/large styles will always have
|
|
176
|
+
// precedence over "all" or mdOrSmaller/mdOrLarger/etc.).
|
|
549
177
|
|
|
550
|
-
return _super2.apply(this, arguments);
|
|
551
|
-
}
|
|
552
178
|
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
value: function render() {
|
|
556
|
-
var _this3 = this;
|
|
557
|
-
|
|
558
|
-
// We listen to the MediaLayoutContext to see what defaults we're
|
|
559
|
-
// being given (this can be overriden by wrapping this component in
|
|
560
|
-
// a MediaLayoutContext.Consumer).
|
|
561
|
-
return /*#__PURE__*/createElement(MediaLayoutContext.Consumer, null, function (_ref) {
|
|
562
|
-
var overrideSize = _ref.overrideSize,
|
|
563
|
-
ssrSize = _ref.ssrSize,
|
|
564
|
-
mediaSpec = _ref.mediaSpec;
|
|
565
|
-
return /*#__PURE__*/createElement(MediaLayoutInternal, _extends({}, _this3.props, {
|
|
566
|
-
overrideSize: overrideSize,
|
|
567
|
-
ssrSize: ssrSize,
|
|
568
|
-
mediaSpec: mediaSpec
|
|
569
|
-
}));
|
|
570
|
-
});
|
|
179
|
+
mockStyleSheet[name] = [styleSheets.all && styleSheets.all[name], mediaSize === "small" && [styleSheets.mdOrSmaller && styleSheets.mdOrSmaller[name], styleSheets.small && styleSheets.small[name]], mediaSize === "medium" && [styleSheets.mdOrSmaller && styleSheets.mdOrSmaller[name], styleSheets.mdOrLarger && styleSheets.mdOrLarger[name], styleSheets.medium && styleSheets.medium[name]], mediaSize === "large" && [styleSheets.mdOrLarger && styleSheets.mdOrLarger[name], styleSheets.large && styleSheets.large[name]]];
|
|
180
|
+
}
|
|
571
181
|
}
|
|
572
|
-
}]);
|
|
573
182
|
|
|
574
|
-
|
|
575
|
-
}
|
|
183
|
+
return mockStyleSheet;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
render() {
|
|
187
|
+
const {
|
|
188
|
+
children,
|
|
189
|
+
mediaSpec,
|
|
190
|
+
ssrSize,
|
|
191
|
+
overrideSize
|
|
192
|
+
} = this.props; // We need to create the MediaQueryLists during the first render in order
|
|
193
|
+
// to query whether any of them match.
|
|
194
|
+
|
|
195
|
+
if (!this.isServerSide()) {
|
|
196
|
+
for (const query of queries.filter(query => !mediaQueryLists[query])) {
|
|
197
|
+
mediaQueryLists[query] = window.matchMedia(query);
|
|
198
|
+
}
|
|
199
|
+
} // We need to figure out what the current media size is
|
|
200
|
+
// If an override has been specified, we use that.
|
|
201
|
+
// If we're rendering on the server then we use the default
|
|
202
|
+
// SSR rendering size.
|
|
203
|
+
// Otherwise we attempt to get the current size based on
|
|
204
|
+
// the current MediaSpec.
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
const mediaSize = overrideSize || this.isServerSide() && ssrSize || this.getCurrentSize(mediaSpec); // Generate a mock stylesheet
|
|
208
|
+
|
|
209
|
+
const styles = this.getMockStyleSheet(mediaSize);
|
|
210
|
+
return children({
|
|
211
|
+
mediaSize,
|
|
212
|
+
mediaSpec,
|
|
213
|
+
styles
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
} // gen-snapshot-tests.js only understands `export default class ...`
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
class MediaLayout extends Component {
|
|
221
|
+
render() {
|
|
222
|
+
// We listen to the MediaLayoutContext to see what defaults we're
|
|
223
|
+
// being given (this can be overriden by wrapping this component in
|
|
224
|
+
// a MediaLayoutContext.Consumer).
|
|
225
|
+
return /*#__PURE__*/createElement(MediaLayoutContext.Consumer, null, ({
|
|
226
|
+
overrideSize,
|
|
227
|
+
ssrSize,
|
|
228
|
+
mediaSpec
|
|
229
|
+
}) => /*#__PURE__*/createElement(MediaLayoutInternal, _extends({}, this.props, {
|
|
230
|
+
overrideSize: overrideSize,
|
|
231
|
+
ssrSize: ssrSize,
|
|
232
|
+
mediaSpec: mediaSpec
|
|
233
|
+
})));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
}
|
|
576
237
|
|
|
577
238
|
/**
|
|
578
239
|
* Expands to fill space between sibling components.
|
|
579
240
|
*
|
|
580
241
|
* Assumes parent is a View.
|
|
581
242
|
*/
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
243
|
+
class Spring extends Component {
|
|
244
|
+
render() {
|
|
245
|
+
const {
|
|
246
|
+
style
|
|
247
|
+
} = this.props;
|
|
248
|
+
return /*#__PURE__*/createElement(View, {
|
|
249
|
+
"aria-hidden": "true",
|
|
250
|
+
style: [styles.grow, style]
|
|
251
|
+
});
|
|
591
252
|
}
|
|
592
253
|
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
value: function render() {
|
|
596
|
-
var style = this.props.style;
|
|
597
|
-
return /*#__PURE__*/createElement(View, {
|
|
598
|
-
"aria-hidden": "true",
|
|
599
|
-
style: [styles.grow, style]
|
|
600
|
-
});
|
|
601
|
-
}
|
|
602
|
-
}]);
|
|
603
|
-
|
|
604
|
-
return Spring;
|
|
605
|
-
}(Component);
|
|
606
|
-
var styles = StyleSheet.create({
|
|
254
|
+
}
|
|
255
|
+
const styles = StyleSheet.create({
|
|
607
256
|
grow: {
|
|
608
257
|
flexGrow: 1
|
|
609
258
|
}
|
|
@@ -614,34 +263,21 @@ var styles = StyleSheet.create({
|
|
|
614
263
|
*
|
|
615
264
|
* Assumes parent is a View.
|
|
616
265
|
*/
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
266
|
+
class Strut extends Component {
|
|
267
|
+
render() {
|
|
268
|
+
const {
|
|
269
|
+
size,
|
|
270
|
+
style
|
|
271
|
+
} = this.props;
|
|
272
|
+
return /*#__PURE__*/createElement(View, {
|
|
273
|
+
"aria-hidden": "true",
|
|
274
|
+
style: [strutStyle(size), style]
|
|
275
|
+
});
|
|
626
276
|
}
|
|
627
277
|
|
|
628
|
-
|
|
629
|
-
key: "render",
|
|
630
|
-
value: function render() {
|
|
631
|
-
var _this$props = this.props,
|
|
632
|
-
size = _this$props.size,
|
|
633
|
-
style = _this$props.style;
|
|
634
|
-
return /*#__PURE__*/createElement(View, {
|
|
635
|
-
"aria-hidden": "true",
|
|
636
|
-
style: [strutStyle(size), style]
|
|
637
|
-
});
|
|
638
|
-
}
|
|
639
|
-
}]);
|
|
640
|
-
|
|
641
|
-
return Strut;
|
|
642
|
-
}(Component);
|
|
278
|
+
}
|
|
643
279
|
|
|
644
|
-
|
|
280
|
+
const strutStyle = size => {
|
|
645
281
|
return {
|
|
646
282
|
width: size,
|
|
647
283
|
MsFlexBasis: size,
|
|
@@ -662,7 +298,7 @@ var strutStyle = function strutStyle(size) {
|
|
|
662
298
|
* @param {MediaQuery} mediaQuery
|
|
663
299
|
* @param {MediaSize} mediaSize
|
|
664
300
|
*/
|
|
665
|
-
|
|
301
|
+
const queryMatchesSize = (mediaQuery, mediaSize) => {
|
|
666
302
|
switch (mediaQuery) {
|
|
667
303
|
case "all":
|
|
668
304
|
return true;
|
|
@@ -683,7 +319,7 @@ var queryMatchesSize = function queryMatchesSize(mediaQuery, mediaSize) {
|
|
|
683
319
|
return mediaSize === "large";
|
|
684
320
|
|
|
685
321
|
default:
|
|
686
|
-
throw new Error(
|
|
322
|
+
throw new Error(`Unsupported mediaSize: ${mediaSize}`);
|
|
687
323
|
}
|
|
688
324
|
};
|
|
689
325
|
|