UNPKG

5.55 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
8
9var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
10
11var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
12
13var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
14
15var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
16
17var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
18
19var _createClass2 = require('babel-runtime/helpers/createClass');
20
21var _createClass3 = _interopRequireDefault(_createClass2);
22
23var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
24
25var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
26
27var _inherits2 = require('babel-runtime/helpers/inherits');
28
29var _inherits3 = _interopRequireDefault(_inherits2);
30
31var _simpleAssign = require('simple-assign');
32
33var _simpleAssign2 = _interopRequireDefault(_simpleAssign);
34
35var _react = require('react');
36
37var _react2 = _interopRequireDefault(_react);
38
39var _propTypes = require('prop-types');
40
41var _propTypes2 = _interopRequireDefault(_propTypes);
42
43function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
44
45/**
46 * BeforeAfterWrapper
47 * An alternative for the ::before and ::after css pseudo-elements for
48 * components whose styles are defined in javascript instead of css.
49 *
50 * Usage: For the element that we want to apply before and after elements to,
51 * wrap its children with BeforeAfterWrapper. For example:
52 *
53 * <Paper>
54 * <Paper> <div> // See notice
55 * <BeforeAfterWrapper> renders <div/> // before element
56 * [children of paper] ------> [children of paper]
57 * </BeforeAfterWrapper> <div/> // after element
58 * </Paper> </div>
59 * </Paper>
60 *
61 * Notice: Notice that this div bundles together our elements. If the element
62 * that we want to apply before and after elements is a HTML tag (i.e. a
63 * div, p, or button tag), we can avoid this extra nesting by passing using
64 * the BeforeAfterWrapper in place of said tag like so:
65 *
66 * <p>
67 * <BeforeAfterWrapper> do this instead <BeforeAfterWrapper elementType='p'>
68 * [children of p] ------> [children of p]
69 * </BeforeAfterWrapper> </BeforeAfterWrapper>
70 * </p>
71 *
72 * BeforeAfterWrapper features spread functionality. This means that we can
73 * pass HTML tag properties directly into the BeforeAfterWrapper tag.
74 *
75 * When using BeforeAfterWrapper, ensure that the parent of the beforeElement
76 * and afterElement have a defined style position.
77 */
78
79var styles = {
80 box: {
81 boxSizing: 'border-box'
82 }
83};
84
85var BeforeAfterWrapper = function (_Component) {
86 (0, _inherits3.default)(BeforeAfterWrapper, _Component);
87
88 function BeforeAfterWrapper() {
89 (0, _classCallCheck3.default)(this, BeforeAfterWrapper);
90 return (0, _possibleConstructorReturn3.default)(this, (BeforeAfterWrapper.__proto__ || (0, _getPrototypeOf2.default)(BeforeAfterWrapper)).apply(this, arguments));
91 }
92
93 (0, _createClass3.default)(BeforeAfterWrapper, [{
94 key: 'render',
95 value: function render() {
96 var _props = this.props,
97 beforeStyle = _props.beforeStyle,
98 afterStyle = _props.afterStyle,
99 beforeElementType = _props.beforeElementType,
100 afterElementType = _props.afterElementType,
101 elementType = _props.elementType,
102 other = (0, _objectWithoutProperties3.default)(_props, ['beforeStyle', 'afterStyle', 'beforeElementType', 'afterElementType', 'elementType']);
103 var prepareStyles = this.context.muiTheme.prepareStyles;
104
105
106 var beforeElement = void 0;
107 var afterElement = void 0;
108
109 if (beforeStyle) {
110 beforeElement = _react2.default.createElement(this.props.beforeElementType, {
111 style: prepareStyles((0, _simpleAssign2.default)({}, styles.box, beforeStyle)),
112 key: '::before'
113 });
114 }
115
116 if (afterStyle) {
117 afterElement = _react2.default.createElement(this.props.afterElementType, {
118 style: prepareStyles((0, _simpleAssign2.default)({}, styles.box, afterStyle)),
119 key: '::after'
120 });
121 }
122
123 var children = [beforeElement, this.props.children, afterElement];
124
125 var props = other;
126 props.style = prepareStyles((0, _simpleAssign2.default)({}, this.props.style));
127
128 return _react2.default.createElement(this.props.elementType, props, children);
129 }
130 }]);
131 return BeforeAfterWrapper;
132}(_react.Component);
133
134BeforeAfterWrapper.defaultProps = {
135 beforeElementType: 'div',
136 afterElementType: 'div',
137 elementType: 'div'
138};
139BeforeAfterWrapper.contextTypes = {
140 muiTheme: _propTypes2.default.object.isRequired
141};
142BeforeAfterWrapper.propTypes = process.env.NODE_ENV !== "production" ? {
143 afterElementType: _propTypes2.default.string,
144 afterStyle: _propTypes2.default.object,
145 beforeElementType: _propTypes2.default.string,
146 beforeStyle: _propTypes2.default.object,
147 children: _propTypes2.default.node,
148 elementType: _propTypes2.default.string,
149 /**
150 * Override the inline-styles of the root element.
151 */
152 style: _propTypes2.default.object
153} : {};
154exports.default = BeforeAfterWrapper;
\No newline at end of file