UNPKG

8.77 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
6
7var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
8
9var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
10
11var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
12
13var _inherits2 = require('babel-runtime/helpers/inherits');
14
15var _inherits3 = _interopRequireDefault(_inherits2);
16
17var _extends2 = require('babel-runtime/helpers/extends');
18
19var _extends3 = _interopRequireDefault(_extends2);
20
21var _typeof2 = require('babel-runtime/helpers/typeof');
22
23var _typeof3 = _interopRequireDefault(_typeof2);
24
25var _class, _temp;
26
27var _react = require('react');
28
29var _react2 = _interopRequireDefault(_react);
30
31var _propTypes = require('prop-types');
32
33var _propTypes2 = _interopRequireDefault(_propTypes);
34
35var _classnames = require('classnames');
36
37var _classnames2 = _interopRequireDefault(_classnames);
38
39var _configProvider = require('../config-provider');
40
41var _configProvider2 = _interopRequireDefault(_configProvider);
42
43var _util = require('../util');
44
45var _createStyle = require('../responsive-grid/create-style');
46
47var _createStyle2 = _interopRequireDefault(_createStyle);
48
49function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
50
51var pickOthers = _util.obj.pickOthers;
52
53
54var createChildren = function createChildren(children, _ref) {
55 var spacing = _ref.spacing,
56 direction = _ref.direction,
57 wrap = _ref.wrap,
58 device = _ref.device;
59
60 var array = _react2.default.Children.toArray(children);
61 if (!children) {
62 return null;
63 }
64
65 return array.map(function (child, index) {
66 var spacingMargin = {};
67
68 spacingMargin = (0, _createStyle.getChildMargin)(spacing);
69
70 if (!wrap) {
71 // 不折行
72 var isNone = [index === 0, index === array.length - 1];
73 var props = direction === 'row' ? ['marginLeft', 'marginRight'] : ['marginTop', 'marginBottom'];
74
75 ['marginTop', 'marginRight', 'marginBottom', 'marginLeft'].forEach(function (prop) {
76 if (prop in spacingMargin && props.indexOf(prop) === -1) {
77 spacingMargin[prop] = 0;
78 }
79
80 props.forEach(function (key, i) {
81 if (key in spacingMargin && isNone[i]) {
82 spacingMargin[key] = 0;
83 }
84 });
85 });
86 }
87
88 if (_react2.default.isValidElement(child)) {
89 var propsMargin = child.props.margin;
90
91 var childPropsMargin = (0, _createStyle.getMargin)(propsMargin);
92 var gridProps = {};
93
94 if (['function', 'object'].indexOf((0, _typeof3.default)(child.type)) > -1 && child.type._typeMark === 'responsive_grid') {
95 gridProps = (0, _createStyle2.default)((0, _extends3.default)({ display: 'grid' }, child.props));
96 }
97
98 return _react2.default.cloneElement(child, {
99 style: (0, _extends3.default)({}, spacingMargin, childPropsMargin, gridProps, child.props.style || {})
100 });
101 }
102
103 return child;
104 });
105};
106
107var getStyle = function getStyle() {
108 var style = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
109 var props = arguments[1];
110
111 return (0, _extends3.default)({}, (0, _createStyle2.default)((0, _extends3.default)({ display: 'flex' }, props)), style);
112};
113
114var getOuterStyle = function getOuterStyle(style, styleProps) {
115 var sheet = getStyle(style, styleProps);
116
117 return (0, _createStyle.filterOuterStyle)(sheet);
118};
119
120var getHelperStyle = function getHelperStyle(style, styleProps) {
121 var sheet = getStyle(style, styleProps);
122
123 return (0, _createStyle.filterHelperStyle)((0, _extends3.default)({}, sheet, (0, _createStyle.getSpacingHelperMargin)(styleProps.spacing)));
124};
125
126var getInnerStyle = function getInnerStyle(style, styleProps) {
127 var sheet = getStyle(style, styleProps);
128
129 return (0, _createStyle.filterInnerStyle)(sheet);
130};
131
132/**
133 * Box
134 */
135var Box = (_temp = _class = function (_Component) {
136 (0, _inherits3.default)(Box, _Component);
137
138 function Box() {
139 (0, _classCallCheck3.default)(this, Box);
140 return (0, _possibleConstructorReturn3.default)(this, _Component.apply(this, arguments));
141 }
142
143 Box.prototype.render = function render() {
144 var _cx;
145
146 var _props = this.props,
147 prefix = _props.prefix,
148 direction = _props.direction,
149 justify = _props.justify,
150 align = _props.align,
151 wrap = _props.wrap,
152 flex = _props.flex,
153 spacing = _props.spacing,
154 padding = _props.padding,
155 margin = _props.margin,
156 style = _props.style,
157 className = _props.className,
158 children = _props.children,
159 device = _props.device,
160 component = _props.component;
161
162
163 var styleProps = {
164 direction: direction,
165 justify: justify,
166 align: align,
167 wrap: wrap,
168 flex: flex,
169 spacing: spacing,
170 padding: padding,
171 margin: margin
172 };
173 var View = component;
174 var others = pickOthers(Object.keys(Box.propTypes), this.props);
175 var styleSheet = getStyle(style, styleProps);
176
177 var boxs = createChildren(children, {
178 spacing: spacing,
179 direction: direction,
180 wrap: wrap,
181 device: device
182 });
183
184 var cls = (0, _classnames2.default)((_cx = {}, _cx[prefix + 'box'] = true, _cx), className);
185 if (wrap && spacing) {
186 var outerStyle = getOuterStyle(style, styleProps);
187 var helperStyle = getHelperStyle(style, styleProps);
188 var innerStyle = getInnerStyle(style, styleProps);
189
190 return _react2.default.createElement(
191 View,
192 (0, _extends3.default)({ style: outerStyle, className: cls }, others),
193 _react2.default.createElement(
194 'div',
195 { style: helperStyle },
196 _react2.default.createElement(
197 'div',
198 { style: innerStyle, className: prefix + 'box' },
199 boxs
200 )
201 )
202 );
203 }
204
205 return _react2.default.createElement(
206 View,
207 (0, _extends3.default)({ style: styleSheet, className: cls }, others),
208 boxs
209 );
210 };
211
212 return Box;
213}(_react.Component), _class.propTypes = {
214 prefix: _propTypes2.default.string,
215 style: _propTypes2.default.object,
216 className: _propTypes2.default.any,
217 /**
218 * 布局属性
219 */
220 flex: _propTypes2.default.oneOfType([_propTypes2.default.arrayOf(_propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string])), _propTypes2.default.number]),
221 /**
222 * 布局方向,默认为 column ,一个元素占据一整行
223 * @default column
224 */
225 direction: _propTypes2.default.oneOf(['row', 'column', 'row-reverse']),
226 /**
227 * 是否折行 支持IE11+
228 */
229 wrap: _propTypes2.default.bool,
230 /**
231 * 元素之间的间距 [bottom&top, right&left]
232 */
233 spacing: _propTypes2.default.oneOfType([_propTypes2.default.arrayOf(_propTypes2.default.number), _propTypes2.default.number]),
234 /**
235 * 设置 margin [bottom&top, right&left]
236 */
237 margin: _propTypes2.default.oneOfType([_propTypes2.default.arrayOf(_propTypes2.default.number), _propTypes2.default.number]),
238 /**
239 * 设置 padding [bottom&top, right&left]
240 */
241 padding: _propTypes2.default.oneOfType([_propTypes2.default.arrayOf(_propTypes2.default.number), _propTypes2.default.number]),
242 /**
243 * 沿着主轴方向,子元素们的排布关系 (兼容性同 justify-content )
244 */
245 justify: _propTypes2.default.oneOf(['flex-start', 'center', 'flex-end', 'space-between', 'space-around']),
246 /**
247 * 垂直主轴方向,子元素们的排布关系 (兼容性同 align-items )
248 */
249 align: _propTypes2.default.oneOf(['flex-start', 'center', 'flex-end', 'baseline', 'stretch']),
250 device: _propTypes2.default.oneOf(['phone', 'tablet', 'desktop']),
251 /**
252 * 定制标签名, 例如section等
253 */
254 component: _propTypes2.default.string
255}, _class.defaultProps = {
256 prefix: 'next-',
257 direction: 'column',
258 wrap: false,
259 component: 'div'
260}, _temp);
261Box.displayName = 'Box';
262exports.default = _configProvider2.default.config(Box);
263module.exports = exports['default'];
\No newline at end of file