@khanacademy/wonder-blocks-layout 1.4.13 → 1.4.15
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/CHANGELOG.md +13 -0
- package/dist/index.js +294 -0
- package/dist/index.js.flow +2 -0
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @khanacademy/wonder-blocks-layout
|
|
2
2
|
|
|
3
|
+
## 1.4.15
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [496119f2]
|
|
8
|
+
- @khanacademy/wonder-blocks-core@4.6.2
|
|
9
|
+
|
|
10
|
+
## 1.4.14
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- @khanacademy/wonder-blocks-core@4.6.1
|
|
15
|
+
|
|
3
16
|
## 1.4.13
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var _extends = require('@babel/runtime/helpers/extends');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var Spacing = require('@khanacademy/wonder-blocks-spacing');
|
|
8
|
+
var aphrodite = require('aphrodite');
|
|
9
|
+
var wonderBlocksCore = require('@khanacademy/wonder-blocks-core');
|
|
10
|
+
|
|
11
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
12
|
+
|
|
13
|
+
function _interopNamespace(e) {
|
|
14
|
+
if (e && e.__esModule) return e;
|
|
15
|
+
var n = Object.create(null);
|
|
16
|
+
if (e) {
|
|
17
|
+
Object.keys(e).forEach(function (k) {
|
|
18
|
+
if (k !== 'default') {
|
|
19
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
20
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
get: function () { return e[k]; }
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
n["default"] = e;
|
|
28
|
+
return Object.freeze(n);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends);
|
|
32
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
33
|
+
var Spacing__default = /*#__PURE__*/_interopDefaultLegacy(Spacing);
|
|
34
|
+
|
|
35
|
+
const VALID_MEDIA_SIZES = ["small", "medium", "large"];
|
|
36
|
+
const mediaDefaultSpecLargeMarginWidth = Spacing__default["default"].large_24;
|
|
37
|
+
const MEDIA_DEFAULT_SPEC = {
|
|
38
|
+
small: {
|
|
39
|
+
query: "(max-width: 767px)",
|
|
40
|
+
totalColumns: 4,
|
|
41
|
+
gutterWidth: Spacing__default["default"].medium_16,
|
|
42
|
+
marginWidth: Spacing__default["default"].medium_16
|
|
43
|
+
},
|
|
44
|
+
medium: {
|
|
45
|
+
query: "(min-width: 768px) and (max-width: 1023px)",
|
|
46
|
+
totalColumns: 8,
|
|
47
|
+
gutterWidth: Spacing__default["default"].xLarge_32,
|
|
48
|
+
marginWidth: Spacing__default["default"].large_24
|
|
49
|
+
},
|
|
50
|
+
large: {
|
|
51
|
+
query: "(min-width: 1024px)",
|
|
52
|
+
totalColumns: 12,
|
|
53
|
+
gutterWidth: Spacing__default["default"].xLarge_32,
|
|
54
|
+
marginWidth: mediaDefaultSpecLargeMarginWidth,
|
|
55
|
+
maxWidth: 1120 + mediaDefaultSpecLargeMarginWidth * 2
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const MEDIA_INTERNAL_SPEC = {
|
|
59
|
+
large: {
|
|
60
|
+
query: "(min-width: 1px)",
|
|
61
|
+
totalColumns: 12,
|
|
62
|
+
gutterWidth: Spacing__default["default"].xLarge_32,
|
|
63
|
+
marginWidth: Spacing__default["default"].medium_16
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const MEDIA_MODAL_SPEC = {
|
|
67
|
+
small: {
|
|
68
|
+
query: "(max-width: 767px)",
|
|
69
|
+
totalColumns: 4,
|
|
70
|
+
gutterWidth: Spacing__default["default"].medium_16,
|
|
71
|
+
marginWidth: Spacing__default["default"].medium_16
|
|
72
|
+
},
|
|
73
|
+
large: {
|
|
74
|
+
query: "(min-width: 768px)",
|
|
75
|
+
totalColumns: 12,
|
|
76
|
+
gutterWidth: Spacing__default["default"].xLarge_32,
|
|
77
|
+
marginWidth: Spacing__default["default"].xxLarge_48
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const defaultContext = {
|
|
82
|
+
ssrSize: "large",
|
|
83
|
+
mediaSpec: MEDIA_DEFAULT_SPEC
|
|
84
|
+
};
|
|
85
|
+
var MediaLayoutContext = React__namespace.createContext(defaultContext);
|
|
86
|
+
|
|
87
|
+
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));
|
|
88
|
+
const mediaQueryLists = {};
|
|
89
|
+
const DEFAULT_SIZE = "large";
|
|
90
|
+
|
|
91
|
+
class MediaLayoutInternal extends React__namespace.Component {
|
|
92
|
+
constructor(props) {
|
|
93
|
+
super(props);
|
|
94
|
+
this.state = {
|
|
95
|
+
size: undefined
|
|
96
|
+
};
|
|
97
|
+
this.cleanupThunks = [];
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
componentDidMount() {
|
|
101
|
+
const entries = Object.entries(this.props.mediaSpec);
|
|
102
|
+
|
|
103
|
+
for (const [size, spec] of entries) {
|
|
104
|
+
const mql = mediaQueryLists[spec.query];
|
|
105
|
+
|
|
106
|
+
if (!mql) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const listener = e => {
|
|
111
|
+
if (e.matches) {
|
|
112
|
+
this.setState({
|
|
113
|
+
size
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
mql.addListener(listener);
|
|
119
|
+
this.cleanupThunks.push(() => mql.removeListener(listener));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
componentWillUnmount() {
|
|
124
|
+
this.cleanupThunks.forEach(cleaup => cleaup());
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
getCurrentSize(spec) {
|
|
128
|
+
if (this.state.size) {
|
|
129
|
+
return this.state.size;
|
|
130
|
+
} else {
|
|
131
|
+
const entries = Object.entries(this.props.mediaSpec);
|
|
132
|
+
|
|
133
|
+
for (const [size, _spec] of entries) {
|
|
134
|
+
const mql = mediaQueryLists[_spec.query];
|
|
135
|
+
|
|
136
|
+
if (mql.matches) {
|
|
137
|
+
return size;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return DEFAULT_SIZE;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
isServerSide() {
|
|
146
|
+
return typeof window === "undefined" || !window.matchMedia;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
getMockStyleSheet(mediaSize) {
|
|
150
|
+
const {
|
|
151
|
+
styleSheets
|
|
152
|
+
} = this.props;
|
|
153
|
+
const mockStyleSheet = {};
|
|
154
|
+
|
|
155
|
+
if (!styleSheets) {
|
|
156
|
+
return mockStyleSheet;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
for (const styleSize of Object.keys(styleSheets)) {
|
|
160
|
+
const styleSheet = styleSheets[styleSize];
|
|
161
|
+
|
|
162
|
+
if (!styleSheet) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
for (const name of Object.keys(styleSheet)) {
|
|
167
|
+
if (Object.prototype.hasOwnProperty.call(mockStyleSheet, name)) {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
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]]];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return mockStyleSheet;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
render() {
|
|
179
|
+
const {
|
|
180
|
+
children,
|
|
181
|
+
mediaSpec,
|
|
182
|
+
ssrSize,
|
|
183
|
+
overrideSize
|
|
184
|
+
} = this.props;
|
|
185
|
+
|
|
186
|
+
if (!this.isServerSide()) {
|
|
187
|
+
for (const query of queries.filter(query => !mediaQueryLists[query])) {
|
|
188
|
+
mediaQueryLists[query] = window.matchMedia(query);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const mediaSize = overrideSize || this.isServerSide() && ssrSize || this.getCurrentSize(mediaSpec);
|
|
193
|
+
const styles = this.getMockStyleSheet(mediaSize);
|
|
194
|
+
return children({
|
|
195
|
+
mediaSize,
|
|
196
|
+
mediaSpec,
|
|
197
|
+
styles
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
class MediaLayout extends React__namespace.Component {
|
|
204
|
+
render() {
|
|
205
|
+
return React__namespace.createElement(MediaLayoutContext.Consumer, null, ({
|
|
206
|
+
overrideSize,
|
|
207
|
+
ssrSize,
|
|
208
|
+
mediaSpec
|
|
209
|
+
}) => React__namespace.createElement(MediaLayoutInternal, _extends__default["default"]({}, this.props, {
|
|
210
|
+
overrideSize: overrideSize,
|
|
211
|
+
ssrSize: ssrSize,
|
|
212
|
+
mediaSpec: mediaSpec
|
|
213
|
+
})));
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
class Spring extends React__namespace.Component {
|
|
219
|
+
render() {
|
|
220
|
+
const {
|
|
221
|
+
style
|
|
222
|
+
} = this.props;
|
|
223
|
+
return React__namespace.createElement(wonderBlocksCore.View, {
|
|
224
|
+
"aria-hidden": "true",
|
|
225
|
+
style: [styles.grow, style]
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
}
|
|
230
|
+
const styles = aphrodite.StyleSheet.create({
|
|
231
|
+
grow: {
|
|
232
|
+
flexGrow: 1
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
class Strut extends React__namespace.Component {
|
|
237
|
+
render() {
|
|
238
|
+
const {
|
|
239
|
+
size,
|
|
240
|
+
style
|
|
241
|
+
} = this.props;
|
|
242
|
+
return React__namespace.createElement(wonderBlocksCore.View, {
|
|
243
|
+
"aria-hidden": "true",
|
|
244
|
+
style: [strutStyle(size), style]
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const strutStyle = size => {
|
|
251
|
+
return {
|
|
252
|
+
width: size,
|
|
253
|
+
MsFlexBasis: size,
|
|
254
|
+
MsFlexPreferredSize: size,
|
|
255
|
+
WebkitFlexBasis: size,
|
|
256
|
+
flexBasis: size,
|
|
257
|
+
flexShrink: 0
|
|
258
|
+
};
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
const queryMatchesSize = (mediaQuery, mediaSize) => {
|
|
262
|
+
switch (mediaQuery) {
|
|
263
|
+
case "all":
|
|
264
|
+
return true;
|
|
265
|
+
|
|
266
|
+
case "small":
|
|
267
|
+
return mediaSize === "small";
|
|
268
|
+
|
|
269
|
+
case "mdOrSmaller":
|
|
270
|
+
return mediaSize === "medium" || mediaSize === "small";
|
|
271
|
+
|
|
272
|
+
case "medium":
|
|
273
|
+
return mediaSize === "medium";
|
|
274
|
+
|
|
275
|
+
case "mdOrLarger":
|
|
276
|
+
return mediaSize === "medium" || mediaSize === "large";
|
|
277
|
+
|
|
278
|
+
case "large":
|
|
279
|
+
return mediaSize === "large";
|
|
280
|
+
|
|
281
|
+
default:
|
|
282
|
+
throw new Error(`Unsupported mediaSize: ${mediaSize}`);
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
exports.MEDIA_DEFAULT_SPEC = MEDIA_DEFAULT_SPEC;
|
|
287
|
+
exports.MEDIA_INTERNAL_SPEC = MEDIA_INTERNAL_SPEC;
|
|
288
|
+
exports.MEDIA_MODAL_SPEC = MEDIA_MODAL_SPEC;
|
|
289
|
+
exports.MediaLayout = MediaLayout;
|
|
290
|
+
exports.MediaLayoutContext = MediaLayoutContext;
|
|
291
|
+
exports.Spring = Spring;
|
|
292
|
+
exports.Strut = Strut;
|
|
293
|
+
exports.VALID_MEDIA_SIZES = VALID_MEDIA_SIZES;
|
|
294
|
+
exports.queryMatchesSize = queryMatchesSize;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@khanacademy/wonder-blocks-layout",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.15",
|
|
4
4
|
"design": "v1",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
16
|
"@babel/runtime": "^7.18.6",
|
|
17
|
-
"@khanacademy/wonder-blocks-core": "^4.6.
|
|
17
|
+
"@khanacademy/wonder-blocks-core": "^4.6.2",
|
|
18
18
|
"@khanacademy/wonder-blocks-spacing": "^3.0.5"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"wb-dev-build-settings": "^0.
|
|
21
|
+
"wb-dev-build-settings": "^0.7.0"
|
|
22
22
|
},
|
|
23
23
|
"peerDependencies": {
|
|
24
24
|
"aphrodite": "^1.2.5",
|