@primer/react
Version:
An implementation of GitHub's Primer Design System using React
102 lines (96 loc) • 4.3 kB
JavaScript
;
var React = require('react');
require('../sx.js');
var ThemeProvider = require('../ThemeProvider.js');
var types = require('./types.js');
var styles = require('./styles.js');
var useRefObjectAsForwardedRef = require('../hooks/useRefObjectAsForwardedRef.js');
var defaultSxProp = require('../utils/defaultSxProp.js');
var Box = require('../Box/Box.js');
var merge = require('deepmerge');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var React__default = /*#__PURE__*/_interopDefault(React);
var merge__default = /*#__PURE__*/_interopDefault(merge);
function _extends() { _extends = Object.assign ? Object.assign.bind() : 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); }
const ButtonBase = /*#__PURE__*/React.forwardRef(({
children,
as: Component = 'button',
sx: sxProp = defaultSxProp.defaultSxProp,
...props
}, forwardedRef) => {
const {
leadingIcon: LeadingIcon,
trailingIcon: TrailingIcon,
trailingAction: TrailingAction,
icon: Icon,
variant = 'default',
size = 'medium',
alignContent = 'center',
block = false,
...rest
} = props;
const innerRef = React__default.default.useRef(null);
useRefObjectAsForwardedRef.useRefObjectAsForwardedRef(forwardedRef, innerRef);
const {
theme
} = ThemeProvider.useTheme();
const baseStyles = React.useMemo(() => {
return merge__default.default.all([styles.getButtonStyles(theme), styles.getVariantStyles(variant, theme)]);
}, [theme, variant]);
const sxStyles = React.useMemo(() => {
return merge__default.default(baseStyles, sxProp);
}, [baseStyles, sxProp]);
const iconWrapStyles = {
display: 'flex',
pointerEvents: 'none'
};
if (process.env.NODE_ENV !== "production") {
/**
* The Linter yells because it thinks this conditionally calls an effect,
* but since this is a compile-time flag and not a runtime conditional
* this is safe, and ensures the entire effect is kept out of prod builds
* shaving precious bytes from the output, and avoiding mounting a noop effect
*/
// eslint-disable-next-line react-hooks/rules-of-hooks
React__default.default.useEffect(() => {
if (innerRef.current && !(innerRef.current instanceof HTMLButtonElement) && !(innerRef.current instanceof HTMLAnchorElement)) {
// eslint-disable-next-line no-console
console.warn('This component should be an instanceof a semantic button or anchor');
}
}, [innerRef]);
}
return /*#__PURE__*/React__default.default.createElement(types.StyledButton, _extends({
as: Component,
sx: sxStyles
}, rest, {
ref: innerRef,
"data-block": block ? 'block' : null,
"data-size": size === 'small' || size === 'large' ? size : undefined,
"data-no-visuals": !LeadingIcon && !TrailingIcon && !TrailingAction ? true : undefined
}), Icon ? /*#__PURE__*/React__default.default.createElement(Icon, null) : /*#__PURE__*/React__default.default.createElement(React__default.default.Fragment, null, /*#__PURE__*/React__default.default.createElement(Box, {
as: "span",
"data-component": "buttonContent",
sx: styles.getAlignContentSize(alignContent)
}, LeadingIcon && /*#__PURE__*/React__default.default.createElement(Box, {
as: "span",
"data-component": "leadingVisual",
sx: {
...iconWrapStyles
}
}, /*#__PURE__*/React__default.default.createElement(LeadingIcon, null)), children && /*#__PURE__*/React__default.default.createElement("span", {
"data-component": "text"
}, children), TrailingIcon && /*#__PURE__*/React__default.default.createElement(Box, {
as: "span",
"data-component": "trailingVisual",
sx: {
...iconWrapStyles
}
}, /*#__PURE__*/React__default.default.createElement(TrailingIcon, null))), TrailingAction && /*#__PURE__*/React__default.default.createElement(Box, {
as: "span",
"data-component": "trailingAction",
sx: {
...iconWrapStyles
}
}, /*#__PURE__*/React__default.default.createElement(TrailingAction, null))));
});
exports.ButtonBase = ButtonBase;