UNPKG

@vtex/styleguide

Version:

> VTEX Styleguide React components ([Docs](https://vtex.github.io/styleguide))

239 lines (190 loc) 7.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _loaderSize; var _react = require("react"); var _react2 = _interopRequireDefault(_react); var _propTypes = require("prop-types"); var _propTypes2 = _interopRequireDefault(_propTypes); var _classnames = require("classnames"); var _classnames2 = _interopRequireDefault(_classnames); var _Spinner = require("../Spinner"); var _Spinner2 = _interopRequireDefault(_Spinner); var _withForwardedRef = require("../../modules/withForwardedRef"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _extends() { _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; }; return _extends.apply(this, arguments); } var SIZE = { SMALL: 'small', REGULAR: 'regular', LARGE: 'large' }; var VARIATION = { PLAIN: 'plain', INVERTED: 'inverted', DANGER: 'danger' }; var loaderSize = (_loaderSize = {}, _loaderSize[SIZE.SMALL] = 15, _loaderSize[SIZE.REGULAR] = 20, _loaderSize[SIZE.LARGE] = 25, _loaderSize); var propTypes = { /** Button size */ size: _propTypes2.default.oneOf(Object.values(SIZE)), /** Button prominence variation */ variation: _propTypes2.default.oneOf(Object.values(VARIATION)), /** [DEPRECATED] If you are using just an Icon component inside, use this as true */ icon: _propTypes2.default.bool, /** Loading state */ isLoading: _propTypes2.default.bool, /** @ignore For internal use * Sets reduced paddings in order to keep the button squareish if it * only has an icon */ iconOnly: _propTypes2.default.bool, /** (Button spec attribute) */ id: _propTypes2.default.string, /** Data attribute */ testId: _propTypes2.default.string, /** (Button spec attribute) */ autoFocus: _propTypes2.default.bool, /** (Button spec attribute) */ autoComplete: _propTypes2.default.string, /** (Button spec attribute) */ disabled: _propTypes2.default.bool, /** @ignore Forwarded Ref */ forwardedRef: _withForwardedRef.refShape, /** (Button spec attribute) */ name: _propTypes2.default.string, /** (Button spec attribute) */ type: _propTypes2.default.string, /** (Button spec attribute) */ value: _propTypes2.default.string, /** Label of the Button */ children: _propTypes2.default.node.isRequired, /** onClick event. */ onClick: _propTypes2.default.func, /** URL for link mode. Converts the button internally to a link. */ href: _propTypes2.default.string, /** onMouseEnter event */ onMouseEnter: _propTypes2.default.func, /** onMouseLeave event */ onMouseLeave: _propTypes2.default.func, /** onMouseOver event */ onMouseOver: _propTypes2.default.func, /** onMouseOut event */ onMouseOut: _propTypes2.default.func, /** onMouseUp event */ onMouseUp: _propTypes2.default.func, /** onMouseDown event */ onMouseDown: _propTypes2.default.func, /** onFocus event */ onFocus: _propTypes2.default.func, /** onBlur event */ onBlur: _propTypes2.default.func, /** Link spec */ target: _propTypes2.default.string, /** Link spec */ rel: _propTypes2.default.string, /** Link spec */ referrerPolicy: _propTypes2.default.string, /** Link spec */ download: _propTypes2.default.string, /** Disables label wrapping */ noWrap: _propTypes2.default.bool }; var ButtonPlain = function ButtonPlain(props) { var handleClick = function handleClick(event) { !props.disabled && !props.isLoading && props.onClick && props.onClick(event); }; (0, _react.useEffect)(function () { if (props.icon) { console.warn('Button: The prop "icon" of the "Button" component has been deprecated, and will be removed in a future version. Please use the component "ButtonWithIcon" instead'); } }, [props.icon]); var size = props.size, variation = props.variation, children = props.children, icon = props.icon, isLoading = props.isLoading, href = props.href, target = props.target, rel = props.rel, referrerPolicy = props.referrerPolicy, download = props.download, noWrap = props.noWrap; var disabled = props.disabled || isLoading; var iconOnly = icon || props.iconOnly; var horizontalPadding = iconOnly ? 1 : 2; var horizontalCompensation = "nr" + horizontalPadding + " nl" + horizontalPadding + " "; var classes = (0, _classnames2.default)('vtex-button bw1 ba fw5 v-mid relative pa0 br2 bn', horizontalCompensation, { 't-action--small': size === SIZE.SMALL, 't-action': size === SIZE.REGULAR, 't-action--large': size === SIZE.LARGE }, { 'icon-button dib': iconOnly }, { 'bg-transparent b--transparent c-disabled': disabled, 'bg-transparent b--transparent c-action-primary hover-b--transparent hover-bg-action-secondary hover-b--action-secondary': !disabled && variation === VARIATION.PLAIN, 'bg-transparent b--transparent c-on-base--inverted': !disabled && variation === VARIATION.INVERTED, 'bg-transparent b--transparent c-danger hover-bg-danger--faded hover-b--danger--faded': !disabled && variation === VARIATION.DANGER }, { pointer: !disabled }, { 'inline-flex items-center no-underline': href }); var labelClasses = (0, _classnames2.default)('flex items-center justify-center h-100 pv1 ttn ', "ph" + horizontalPadding, { nowrap: noWrap }); var style = {}; if (iconOnly) { style.fontSize = 0; } var linkModeProps = { target: target, rel: rel, referrerPolicy: referrerPolicy, download: download }; var Element = href ? 'a' : 'button'; return _react2.default.createElement(Element, _extends({ id: props.id, "data-testid": props.testId, autoFocus: iconOnly ? undefined : props.autoFocus, disabled: iconOnly ? undefined : props.disabled, name: iconOnly ? undefined : props.name, value: iconOnly ? undefined : props.value, tabIndex: 0, className: classes, href: href, onClick: handleClick, onMouseEnter: props.onMouseEnter, onMouseLeave: props.onMouseLeave, onMouseOver: props.onMouseOver, onMouseOut: props.onMouseOut, onMouseUp: props.onMouseUp, onMouseDown: props.onMouseDown, onFocus: props.onFocus, onBlur: props.onBlur, ref: props.forwardedRef, style: style // Button-mode exclusive props , type: href ? undefined : props.type // Link-mode exclusive props }, href && linkModeProps), isLoading ? _react2.default.createElement(_react.Fragment, null, _react2.default.createElement("span", { className: "top-0 left-0 w-100 h-100 absolute flex justify-center items-center" }, _react2.default.createElement(_Spinner2.default, { secondary: variation === VARIATION.DANGER, size: loaderSize[size] })), _react2.default.createElement("span", { className: labelClasses + " o-0" }, children)) : _react2.default.createElement("div", { className: labelClasses }, children)); }; ButtonPlain.defaultProps = { size: SIZE.REGULAR, variation: VARIATION.PLAIN, disabled: false, autoFocus: false, icon: false, type: 'button', isLoading: false }; ButtonPlain.propTypes = propTypes; exports.default = (0, _withForwardedRef.withForwardedRef)(ButtonPlain);