kitten-components
Version:
Front-end components library
227 lines (165 loc) • 10.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Marger = undefined;
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; };
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _radium = require('radium');
var _radium2 = _interopRequireDefault(_radium);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _screenConfig = require('kitten/constants/screen-config');
var _typographyConfig = require('kitten/constants/typography-config');
var _typographyConfig2 = _interopRequireDefault(_typographyConfig);
var _isStringANumber = require('is-string-a-number');
var _isStringANumber2 = _interopRequireDefault(_isStringANumber);
var _string = require('kitten/helpers/utils/string');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var margerWrapper = function margerWrapper(WrappedComponent) {
return function (_Component) {
_inherits(_class2, _Component);
function _class2() {
var _ref;
var _temp, _this, _ret;
_classCallCheck(this, _class2);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = _class2.__proto__ || Object.getPrototypeOf(_class2)).call.apply(_ref, [this].concat(args))), _this), _this.needsStyleRoot = function () {
var _this$props = _this.props,
top = _this$props.top,
bottom = _this$props.bottom;
var isTopAnObject = top && (typeof top === 'undefined' ? 'undefined' : _typeof(top)) === 'object';
var isBottomAnObject = bottom && (typeof bottom === 'undefined' ? 'undefined' : _typeof(bottom)) === 'object';
return isTopAnObject || isBottomAnObject;
}, _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(_class2, [{
key: 'render',
value: function render() {
if (!this.needsStyleRoot()) return _react2.default.createElement(WrappedComponent, this.props);
return _react2.default.createElement(
_radium.StyleRoot,
null,
_react2.default.createElement(WrappedComponent, this.props)
);
}
}]);
return _class2;
}(_react.Component);
};
var MargerBaseWithoutStyleRoot = function (_Component2) {
_inherits(MargerBaseWithoutStyleRoot, _Component2);
function MargerBaseWithoutStyleRoot(props) {
_classCallCheck(this, MargerBaseWithoutStyleRoot);
// Use 10px as gutter base and transform it to have a rem unit.
var _this2 = _possibleConstructorReturn(this, (MargerBaseWithoutStyleRoot.__proto__ || Object.getPrototypeOf(MargerBaseWithoutStyleRoot)).call(this, props));
_this2.marginSize = function (value) {
return value * _this2.gutter + 'rem';
};
_this2.valueIsNumber = function (value) {
// Retro-compatibility: this handles the case when the user enters `.5` as a
// value for a margin.
if (typeof value === 'string' && value.match(/^-?\.\d+$/)) {
return true;
}
return (0, _isStringANumber2.default)(String(value));
};
_this2.propIsNumber = function (propName) {
return _this2.valueIsNumber(_this2.props[propName]);
};
_this2.isPropWithViewportRange = function (propName, viewportRange) {
return _this2.props[propName] && _this2.props[propName]['from' + (0, _string.upcaseFirst)(viewportRange)];
};
_this2.viewportRangeCssRule = function (viewportRange) {
return '@media (min-width: ' + _screenConfig.ScreenConfig[viewportRange.toUpperCase()].min + 'px)';
};
_this2.propCssDeclarationForViewportRange = function (propName, viewportRange) {
var size = _this2.props[propName]['from' + (0, _string.upcaseFirst)(viewportRange)];
var cssRule = 'margin' + (0, _string.upcaseFirst)(propName);
return _defineProperty({}, cssRule, _this2.marginSize(size));
};
_this2.viewportRangeStyleCondition = function (propName, viewportRange) {
var hasValue = _this2.isPropWithViewportRange(propName, viewportRange);
if (!hasValue) return null;
var viewportRangeCssRule = _this2.viewportRangeCssRule(viewportRange);
var viewportRangeCssValue = _this2.propCssDeclarationForViewportRange(propName, viewportRange);
return _defineProperty({}, viewportRangeCssRule, viewportRangeCssValue);
};
_this2.hasDefaultProp = function (propName) {
return _this2.props[propName] && _this2.props[propName].default;
};
_this2.hasXxsProp = function (propName) {
return _this2.props[propName] && _this2.props[propName].fromXxs;
};
_this2.defaultProp = function (propName) {
var mediaQueryRule = '@media (min-width: 0)';
var cssRule = 'margin' + (0, _string.upcaseFirst)(propName);
if (_this2.hasDefaultProp(propName)) {
return _defineProperty({}, mediaQueryRule, _defineProperty({}, cssRule, _this2.marginSize(_this2.props[propName].default)));
}
if (_this2.hasXxsProp(propName)) {
return _defineProperty({}, mediaQueryRule, _defineProperty({}, cssRule, _this2.marginSize(_this2.props[propName].fromXxs)));
}
};
_this2.gutter = 10 / _typographyConfig2.default.root;
return _this2;
}
_createClass(MargerBaseWithoutStyleRoot, [{
key: 'render',
value: function render() {
var _this3 = this;
var _props = this.props,
top = _props.top,
bottom = _props.bottom,
style = _props.style,
others = _objectWithoutProperties(_props, ['top', 'bottom', 'style']);
var viewportRanges = Object.keys(_screenConfig.ScreenConfig).map(function (size) {
return size.toLowerCase();
}).filter(function (size) {
return size !== 'xxs';
});
var viewportRangesStyles = viewportRanges.reduce(function (acc, viewportRange) {
return [].concat(_toConsumableArray(acc), [_this3.viewportRangeStyleCondition('top', viewportRange), _this3.viewportRangeStyleCondition('bottom', viewportRange)]);
}, []);
var styles = [style, this.propIsNumber('top') && { marginTop: this.marginSize(top) }, this.propIsNumber('bottom') && { marginBottom: this.marginSize(bottom) }, this.defaultProp('top'), this.defaultProp('bottom')].concat(_toConsumableArray(viewportRangesStyles));
return _react2.default.createElement('div', _extends({ style: styles }, others));
}
}]);
return MargerBaseWithoutStyleRoot;
}(_react.Component);
MargerBaseWithoutStyleRoot.propTypes = {
top: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number, _propTypes2.default.shape({
default: _propTypes2.default.number,
fromXxs: _propTypes2.default.number,
frommXs: _propTypes2.default.number,
fromS: _propTypes2.default.number,
fromM: _propTypes2.default.number,
fromL: _propTypes2.default.number,
fromXl: _propTypes2.default.number
})]),
bottom: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number, _propTypes2.default.shape({
default: _propTypes2.default.number,
fromXxs: _propTypes2.default.number,
frommXs: _propTypes2.default.number,
fromS: _propTypes2.default.number,
fromM: _propTypes2.default.number,
fromL: _propTypes2.default.number,
fromXl: _propTypes2.default.number
})])
};
MargerBaseWithoutStyleRoot.defaultProps = {
top: null,
bottom: null
};
var Marger = exports.Marger = margerWrapper((0, _radium2.default)(MargerBaseWithoutStyleRoot));