UNPKG

kitten-components

Version:
227 lines (165 loc) 10.2 kB
'use strict'; 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));