import React from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import Box from '../../ui/box'; import { Icon, ICON_NAMES } from '../icon'; import { Text } from '../text'; import { ALIGN_ITEMS, DISPLAY, JUSTIFY_CONTENT, TEXT_COLORS, TEXT, SIZES, FLEX_DIRECTION, } from '../../../helpers/constants/design-system'; import { BUTTON_SIZES } from './button.constants'; export const ButtonBase = ({ as = 'button', block, children, className, size = BUTTON_SIZES.MD, icon, iconPositionRight, loading, disabled, iconProps, ...props }) => { return ( {icon && ( )} {children} {loading && ( )} ); }; ButtonBase.propTypes = { /** * The polymorphic `as` prop allows you to change the root HTML element of the Button component between `button` and `a` tag */ as: PropTypes.string, /** * Boolean prop to quickly activate box prop display block */ block: PropTypes.bool, /** * The children to be rendered inside the ButtonBase */ children: PropTypes.node, /** * An additional className to apply to the ButtonBase. */ className: PropTypes.string, /** * Boolean to disable button */ disabled: PropTypes.bool, /** * Add icon to left side of button text passing icon name * The name of the icon to display. Should be one of ICON_NAMES */ icon: PropTypes.string, // Can't set PropTypes.oneOf(ICON_NAMES) because ICON_NAMES is an environment variable /** * Boolean that when true will position the icon on right of children * Icon default position left */ iconPositionRight: PropTypes.bool, /** * iconProps accepts all the props from Icon */ iconProps: Icon.propTypes, /** * Boolean to show loading spinner in button */ loading: PropTypes.bool, /** * The size of the ButtonBase. * Possible values could be 'SIZES.AUTO', 'SIZES.SM', 'SIZES.MD', 'SIZES.LG', */ size: PropTypes.oneOf(Object.values(BUTTON_SIZES)), /** * Addition style properties to apply to the button. */ style: PropTypes.object, /** * ButtonBase accepts all the props from Box */ ...Box.propTypes, };