UNPKG

@helpscout/hsds-react

Version:

React component library for Help Scout's Design System

215 lines (185 loc) 8.33 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.useButton = exports.useButtonAs = exports.useButtonClassnames = exports.THEMES = exports.SIZES = exports.STYLE_OUTLINED = exports.STYLE_LINK = exports.STYLE_FILLED = exports.THEME_BRAND = exports.THEME_GREY = exports.THEME_GREEN = exports.THEME_RED = exports.THEME_BLUE = exports.SIZE_XXS = exports.SIZE_XS = exports.SIZE_SM = exports.SIZE_MD = exports.SIZE_LG = exports.SIZE_XL = exports.SIZE_XXL = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _react = _interopRequireWildcard(require("react")); var _styledComponents = require("styled-components"); var _getValidProps = _interopRequireDefault(require("@helpscout/react-utils/dist/getValidProps")); var _classnames = _interopRequireDefault(require("classnames")); var _Icon = _interopRequireDefault(require("../Icon")); var _reactRouterDom = require("react-router-dom"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var SIZE_XXL = 'xxl'; exports.SIZE_XXL = SIZE_XXL; var SIZE_XL = 'xl'; exports.SIZE_XL = SIZE_XL; var SIZE_LG = 'lg'; exports.SIZE_LG = SIZE_LG; var SIZE_MD = 'md'; exports.SIZE_MD = SIZE_MD; var SIZE_SM = 'sm'; exports.SIZE_SM = SIZE_SM; var SIZE_XS = 'xs'; exports.SIZE_XS = SIZE_XS; var SIZE_XXS = 'xxs'; exports.SIZE_XXS = SIZE_XXS; var THEME_BLUE = 'blue'; exports.THEME_BLUE = THEME_BLUE; var THEME_RED = 'red'; exports.THEME_RED = THEME_RED; var THEME_GREEN = 'green'; exports.THEME_GREEN = THEME_GREEN; var THEME_GREY = 'grey'; exports.THEME_GREY = THEME_GREY; var THEME_BRAND = 'brand'; exports.THEME_BRAND = THEME_BRAND; var STYLE_FILLED = 'filled'; exports.STYLE_FILLED = STYLE_FILLED; var STYLE_LINK = 'link'; exports.STYLE_LINK = STYLE_LINK; var STYLE_OUTLINED = 'outlined'; exports.STYLE_OUTLINED = STYLE_OUTLINED; var SIZES = [SIZE_XXL, SIZE_XL, SIZE_LG, SIZE_MD, SIZE_SM, SIZE_XS, SIZE_XXS]; exports.SIZES = SIZES; var THEMES = [THEME_BLUE, THEME_RED, THEME_GREEN, THEME_GREY]; exports.THEMES = THEMES; var useButtonTheme = function useButtonTheme(_ref) { var theme = _ref.theme; var styledTheme = (0, _styledComponents.useTheme)(); if (styledTheme && styledTheme.brandColor) { return THEME_BRAND; } if (THEMES.includes(theme)) return theme; if (theme === 'gray') return THEME_GREY; return THEME_BLUE; }; var useButtonSize = function useButtonSize(_ref2) { var size = _ref2.size; if (SIZES.includes(size)) return size; if (size === 'lgxl') return SIZE_XL; // old overwrite return SIZE_LG; }; var useButtonStyle = function useButtonStyle(_ref3) { var filled = _ref3.filled, outlined = _ref3.outlined, linked = _ref3.linked; if (filled) return STYLE_FILLED; if (outlined) return STYLE_OUTLINED; if (linked) return STYLE_LINK; return STYLE_FILLED; }; var useButtonChildren = function useButtonChildren(_ref4) { var children = _ref4.children; return (0, _react.useMemo)(function () { return _react.default.Children.map(children, function (child, index) { if (!child) return; if (!child.hasOwnProperty('type')) return child; if (child.type !== _Icon.default) return child; var len = _react.default.Children.count(children); var isFirst = index === 0; var isLast = index === len - 1; var isOnly = isFirst && isLast; return /*#__PURE__*/_react.default.cloneElement(child, { offsetLeft: isFirst && !isOnly, offsetRight: isLast && !isOnly }); }); }, [children]); }; var useButtonClassnames = function useButtonClassnames(defaultClassname, props) { var className = props.className, disabled = props.disabled, inlined = props.inlined, isFirst = props.isFirst, isLast = props.isLast, isNotOnly = props.isNotOnly, loading = props.loading, prefixIcon = props.prefixIcon, rounded = props.rounded, seamless = props.seamless, suffixIcon = props.suffixIcon; var theme = useButtonTheme(props); var size = useButtonSize(props); var style = useButtonStyle(props); var isDisabled = disabled || loading; return (0, _classnames.default)(defaultClassname, seamless && "is-seamless", isDisabled && 'is-disabled', isFirst && 'is-first', isLast && 'is-last', isNotOnly && 'is-notOnly', loading && 'is-loading', rounded && 'is-rounded', size && "is-size-" + size, style && "is-style-" + style, theme && "is-theme-" + theme, inlined && 'is-inlined', prefixIcon && 'has-prefix-icon', suffixIcon && 'has-suffix-icon', className); }; exports.useButtonClassnames = useButtonClassnames; var useButtonAs = function useButtonAs(_ref5) { var as = _ref5.as, disabled = _ref5.disabled, href = _ref5.href, loading = _ref5.loading, rel = _ref5.rel, tabIndex = _ref5.tabIndex, submit = _ref5.submit, target = _ref5.target, to = _ref5.to; var isDisabled = disabled || loading; var type = submit ? 'submit' : 'button'; var hrefValue = href || to; var selector = as || Boolean(hrefValue) ? 'a' : 'button'; if (selector === 'button') { return { as: to ? _reactRouterDom.Link : selector, to: to ? to : undefined, type: type, disabled: isDisabled }; } return { as: to ? _reactRouterDom.Link : selector, role: 'button', tabIndex: isDisabled ? undefined : tabIndex || 0, href: selector === 'a' && isDisabled ? undefined : hrefValue, to: to ? to : undefined, target: selector === 'a' ? target : undefined, 'aria-disabled': !isDisabled ? undefined : isDisabled, rel: selector === 'a' ? rel : undefined }; }; exports.useButtonAs = useButtonAs; var useButton = function useButton(props) { var as = props.as, className = props.className, disabled = props.disabled, href = props.href, isFirst = props.isFirst, isLast = props.isLast, isNotOnly = props.isNotOnly, loading = props.loading, rel = props.rel, rounded = props.rounded, submit = props.submit, target = props.target, to = props.to, otherProps = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "className", "disabled", "href", "isFirst", "isLast", "isNotOnly", "loading", "rel", "rounded", "submit", "target", "to"]); var children = useButtonChildren(props); var componentClassName = useButtonClassnames('c-Button', props); var additionalProps = useButtonAs({ as: as, disabled: disabled, href: href, loading: loading, rel: rel, submit: submit, target: target, to: to }); var prefixIcon = otherProps.prefixIcon, suffixIcon = otherProps.suffixIcon, rest = (0, _objectWithoutPropertiesLoose2.default)(otherProps, ["prefixIcon", "suffixIcon"]); return (0, _extends2.default)({ 'data-testid': 'Button' }, (0, _getValidProps.default)(rest), additionalProps, { className: componentClassName, children: children, loading: loading, prefixIcon: prefixIcon, suffixIcon: suffixIcon }); }; exports.useButton = useButton;