UNPKG

backpack-ui

Version:

Lonely Planet's Components

282 lines (226 loc) 6.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = require("react"); var _react2 = _interopRequireDefault(_react); var _radium = require("radium"); var _radium2 = _interopRequireDefault(_radium); var _objectAssign = require("object-assign"); var _objectAssign2 = _interopRequireDefault(_objectAssign); var _settings = require("../../../settings.json"); var _settings2 = _interopRequireDefault(_settings); var _color = require("../../utils/color"); var _mixins = require("../../utils/mixins"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var hoverStyles = { base: { textDecoration: "none" }, blue: { backgroundColor: (0, _color.lighten)(_settings2.default.color.blue, 7), color: _settings2.default.color.white }, white: { backgroundColor: _settings2.default.color.white, color: (0, _color.lighten)(_settings2.default.color.blue, 14) } }; var styles = { base: { appearance: "none", backfaceVisibility: "hidden", border: 0, borderRadius: 0, cursor: "pointer", display: "inline-block", fontWeight: 600, lineHeight: 1, paddingLeft: 30 / 13 + "em", paddingRight: 30 / 13 + "em", textAlign: "center", textDecoration: "none", letterSpacing: "0.6px", textTransform: "uppercase", transition: "color " + _settings2.default.timing.default + " ease-in-out,\n background-color " + _settings2.default.timing.default + " ease-in-out,\n opacity " + _settings2.default.timing.default + " ease-in-out", verticalAlign: "middle", whiteSpace: "nowrap", ":hover": hoverStyles.base, ":active": hoverStyles.base, ":focus": (0, _objectAssign2.default)({}, hoverStyles.base, (0, _mixins.outline)()) }, color: { blue: { backgroundColor: _settings2.default.color.blue, color: _settings2.default.color.white, ":hover": hoverStyles.blue, ":focus": hoverStyles.blue, ":active": hoverStyles.blue }, white: { backgroundColor: _settings2.default.color.white, color: _settings2.default.color.blue, ":hover": hoverStyles.white, ":focus": hoverStyles.white, ":active": hoverStyles.white } }, size: { tiny: { fontSize: "9px", paddingBottom: 9 / 9 + "em", paddingLeft: 19 / 9 + "em", paddingRight: 19 / 9 + "em", paddingTop: 12 / 9 + "em" }, small: { fontSize: "11px", paddingBottom: 15 / 11 + "em", paddingTop: 18 / 11 + "em" }, medium: { fontSize: "13px", paddingBottom: 21 / 13 + "em", paddingTop: 26 / 13 + "em" }, large: { fontSize: "15px", paddingBottom: 23 / 15 + "em", paddingTop: 28 / 15 + "em" }, huge: { fontSize: "17px", paddingBottom: 25 / 17 + "em", paddingTop: 30 / 17 + "em" } }, type: { rounded: { base: { borderRadius: "100px", // a value large enough to scale paddingLeft: 19 / 9 + "em", paddingRight: 19 / 9 + "em", paddingTop: 12 / 9 + "em" }, tiny: { paddingBottom: 9 / 9 + "em" }, small: { paddingBottom: 10 / 9 + "em" }, medium: { paddingBottom: 9 / 9 + "em" }, large: { paddingBottom: 10 / 9 + "em" }, huge: { paddingBottom: 9 / 9 + "em" } }, full: { display: "block", width: "100%" } }, disabled: { cursor: "not-allowed", opacity: 0.5 } }; /** * Button component * * @usage * <Button href="/foo">Bar</Button> */ function Button(_ref) { var href = _ref.href; var children = _ref.children; var onClick = _ref.onClick; var color = _ref.color; var size = _ref.size; var rounded = _ref.rounded; var full = _ref.full; var border = _ref.border; var disabled = _ref.disabled; var customStyles = _ref.customStyles; var Element = href ? "a" : "button"; var role = Element === "a" ? "button" : ""; var style = [styles.base, color && styles.color[color], size && styles.size[size], rounded && styles.type.rounded.base, rounded && styles.type.rounded[size], full && styles.type.full, customStyles, disabled && styles.disabled, border && { boxShadow: "0 0 0 1px " + (color === "white" ? _settings2.default.color.blue : _settings2.default.color.white) + " inset" }]; return _react2.default.createElement( Element, { className: "Button", style: style, href: href, onClick: onClick, role: role, disabled: disabled }, children ); } Button.propTypes = { /** * Pass an href prop to make the button an `a` element instead of a `button` */ href: _react2.default.PropTypes.string, /** * Content for the button */ children: _react2.default.PropTypes.node.isRequired, /** * Function to run when the button is clicked */ onClick: _react2.default.PropTypes.func, /** * Color of the button */ color: _react2.default.PropTypes.oneOf(["blue", "white"]), /** * Size of the button * tiny: 30 px tall * small: 44 px tall * medium: 60 px tall * large: 66 px tall * huge: 72 px tall */ size: _react2.default.PropTypes.oneOf(["tiny", "small", "medium", "large", "huge"]), /** * Use a rounded button */ rounded: _react2.default.PropTypes.bool, /** * Allow button to span available width */ full: _react2.default.PropTypes.bool, /** * Special styles passed in props */ customStyles: _react2.default.PropTypes.objectOf(_react2.default.PropTypes.oneOfType([_react2.default.PropTypes.string, _react2.default.PropTypes.number, _react2.default.PropTypes.object])), /** * Use a border */ border: _react2.default.PropTypes.bool, /** * Disable button */ disabled: _react2.default.PropTypes.bool }; Button.defaultProps = { href: "", onClick: null, color: "blue", size: "medium", rounded: false, full: false, border: false, children: "Button", disabled: false, customStyles: null }; Button.styles = styles; exports.default = (0, _radium2.default)(Button);