UNPKG

9.71 kBSource Map (JSON)View Raw
1{"version":3,"file":"ButtonBase.js","sources":["../src/components/ButtonBase/ButtonBase.js"],"sourcesContent":["import React, { useCallback } from 'react'\nimport PropTypes from 'prop-types'\nimport FocusVisible from '../FocusVisible/FocusVisible'\nimport { useTheme } from '../../theme'\nimport { RADIUS, textStyle } from '../../style'\nimport { warnOnce, KEY_ENTER, unselectable } from '../../utils'\n\nfunction getElementProps({ element, href, disabled, external }) {\n // <button> (handles key events)\n if (element === 'button') {\n return [\n 'button',\n {\n type: 'button',\n disabled,\n },\n ]\n }\n\n // <a href=\"\"> (handles key events)\n if (element === 'a' && href) {\n return [\n 'anchor',\n disabled\n ? {}\n : {\n href: href,\n rel: 'noopener noreferrer',\n ...(external ? { target: '_blank' } : {}),\n },\n ]\n }\n\n // <a> or <div> (doesn’t handle key events)\n return [\n 'basic',\n {\n role: 'button',\n tabIndex: disabled ? '-1' : '0',\n },\n ]\n}\n\nfunction ButtonBase({\n disabled,\n element,\n external,\n focusRingRadius,\n focusRingSpacing,\n focusVisible,\n href,\n innerRef,\n onClick,\n onKeyDown,\n showFocusRing,\n ...props\n}) {\n const theme = useTheme()\n\n // `external` defaults to `true` if `href` is present, `false` otherwise.\n if (external === undefined) {\n external = Boolean(href)\n }\n\n if (typeof focusRingSpacing === 'number') {\n focusRingSpacing = [focusRingSpacing, focusRingSpacing]\n }\n\n if (!element) {\n element = href ? 'a' : 'button'\n }\n\n const [elementType, elementProps] = getElementProps({\n element,\n href,\n disabled,\n external,\n })\n\n const handleKeyDown = useCallback(\n event => {\n // Only applies to cases where the enter key is not handled already\n if (elementType === 'basic' && event.keyCode === KEY_ENTER && onClick) {\n onClick()\n }\n\n // Pass the event up\n if (onKeyDown) {\n onKeyDown(event)\n }\n },\n [elementType, onClick, onKeyDown]\n )\n\n return (\n <button\n as={element}\n ref={innerRef}\n onClick={disabled ? undefined : onClick}\n onKeyDown={disabled ? undefined : handleKeyDown}\n {...elementProps}\n {...props}\n css={`\n position: relative;\n display: inline-block;\n padding: 0;\n white-space: nowrap;\n ${textStyle('body3')};\n text-decoration: none;\n text-align: center;\n background: none;\n border-radius: ${RADIUS}px;\n border: 0;\n outline: 0;\n cursor: ${disabled ? 'default' : 'pointer'};\n ${elementType === 'basic' ? unselectable : ''};\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &:focus:after {\n content: '';\n display: ${focusVisible && showFocusRing ? 'block' : 'none'};\n position: absolute;\n top: ${-focusRingSpacing[1]}px;\n left: ${-focusRingSpacing[0]}px;\n right: ${-focusRingSpacing[0]}px;\n bottom: ${-focusRingSpacing[1]}px;\n border-radius: ${focusRingRadius}px;\n border: 2px solid ${theme.focus};\n }\n `}\n />\n )\n}\n\nButtonBase.propTypes = {\n disabled: PropTypes.bool,\n external: PropTypes.bool,\n focusRingRadius: PropTypes.number,\n focusRingSpacing: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.arrayOf(PropTypes.number),\n ]),\n focusVisible: PropTypes.bool,\n href: PropTypes.string,\n innerRef: PropTypes.any,\n onClick: PropTypes.func,\n onKeyDown: PropTypes.func,\n showFocusRing: PropTypes.bool,\n element: PropTypes.oneOf(['button', 'div', 'a']),\n}\n\nButtonBase.defaultProps = {\n disabled: false,\n focusRingRadius: 0,\n focusRingSpacing: 0,\n showFocusRing: true,\n}\n\nconst ButtonBaseWithFocus = React.forwardRef(\n ({ onFocus: onFocusProp, ...props }, ref) => {\n return (\n <FocusVisible>\n {({ focusVisible, onFocus }) => {\n // support external onFocus handlers\n const handleFocus = event => {\n if (onFocusProp) {\n onFocusProp(event)\n }\n onFocus(event)\n }\n\n return (\n <ButtonBase\n innerRef={ref}\n onFocus={handleFocus}\n focusVisible={focusVisible}\n {...props}\n />\n )\n }}\n </FocusVisible>\n )\n }\n)\n\nButtonBaseWithFocus.propTypes = {\n ...ButtonBase.propTypes,\n onFocus: PropTypes.func,\n}\n\nconst LinkBase = React.forwardRef((props, ref) => {\n warnOnce(\n 'LinkBase',\n 'LinkBase is deprecated: please use ButtonBase with a href prop instead.'\n )\n return <ButtonBase ref={ref} {...props} />\n})\n\nexport { LinkBase }\nexport default ButtonBaseWithFocus\n"],"names":["getElementProps","element","href","disabled","external","type","rel","target","role","tabIndex","RADIUS","ButtonBase","focusRingRadius","focusRingSpacing","focusVisible","innerRef","onClick","onKeyDown","showFocusRing","props","theme","useTheme","undefined","Boolean","elementType","elementProps","handleKeyDown","useCallback","event","keyCode","KEY_ENTER","React","textStyle","unselectable","focus","propTypes","PropTypes","bool","number","oneOfType","arrayOf","string","any","func","oneOf","defaultProps","ButtonBaseWithFocus","forwardRef","ref","onFocusProp","onFocus","FocusVisible","handleFocus","LinkBase","warnOnce"],"mappings":"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"}
\No newline at end of file