@wordpress/components
Version:
UI components for WordPress.
152 lines (128 loc) • 4.42 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Button = Button;
exports.default = void 0;
var _element = require("@wordpress/element");
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _classnames = _interopRequireDefault(require("classnames"));
var _lodash = require("lodash");
var _deprecated = _interopRequireDefault(require("@wordpress/deprecated"));
var _tooltip = _interopRequireDefault(require("../tooltip"));
var _icon = _interopRequireDefault(require("../icon"));
var _visuallyHidden = _interopRequireDefault(require("../visually-hidden"));
/**
* External dependencies
*/
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
const disabledEventsOnDisabledButton = ['onMouseDown', 'onClick'];
function Button(props, ref) {
const {
href,
target,
isPrimary,
isSmall,
isTertiary,
isPressed,
isBusy,
isDefault,
isSecondary,
isLink,
isDestructive,
className,
disabled,
icon,
iconPosition = 'left',
iconSize,
showTooltip,
tooltipPosition,
shortcut,
label,
children,
text,
__experimentalIsFocusable: isFocusable,
describedBy,
...additionalProps
} = props;
if (isDefault) {
(0, _deprecated.default)('Button isDefault prop', {
since: '5.4',
alternative: 'isSecondary'
});
}
const classes = (0, _classnames.default)('components-button', className, {
'is-secondary': isDefault || isSecondary,
'is-primary': isPrimary,
'is-small': isSmall,
'is-tertiary': isTertiary,
'is-pressed': isPressed,
'is-busy': isBusy,
'is-link': isLink,
'is-destructive': isDestructive,
'has-text': !!icon && !!children,
'has-icon': !!icon
});
const trulyDisabled = disabled && !isFocusable;
const Tag = href !== undefined && !trulyDisabled ? 'a' : 'button';
const tagProps = Tag === 'a' ? {
href,
target
} : {
type: 'button',
disabled: trulyDisabled,
'aria-pressed': isPressed
};
if (disabled && isFocusable) {
// In this case, the button will be disabled, but still focusable and
// perceivable by screen reader users.
tagProps['aria-disabled'] = true;
for (const disabledEvent of disabledEventsOnDisabledButton) {
additionalProps[disabledEvent] = event => {
event.stopPropagation();
event.preventDefault();
};
}
} // Should show the tooltip if...
const shouldShowTooltip = !trulyDisabled && ( // an explicit tooltip is passed or...
showTooltip && label || // there's a shortcut or...
shortcut || // there's a label and...
!!label && ( // the children are empty and...
!children || (0, _lodash.isArray)(children) && !children.length) && // the tooltip is not explicitly disabled.
false !== showTooltip);
const descriptionId = describedBy ? (0, _lodash.uniqueId)() : null;
const describedById = additionalProps['aria-describedby'] || descriptionId;
const element = (0, _element.createElement)(Tag, (0, _extends2.default)({}, tagProps, additionalProps, {
className: classes,
"aria-label": additionalProps['aria-label'] || label,
"aria-describedby": describedById,
ref: ref
}), icon && iconPosition === 'left' && (0, _element.createElement)(_icon.default, {
icon: icon,
size: iconSize
}), text && (0, _element.createElement)(_element.Fragment, null, text), icon && iconPosition === 'right' && (0, _element.createElement)(_icon.default, {
icon: icon,
size: iconSize
}), children);
if (!shouldShowTooltip) {
return (0, _element.createElement)(_element.Fragment, null, element, describedBy && (0, _element.createElement)(_visuallyHidden.default, null, (0, _element.createElement)("span", {
id: descriptionId
}, describedBy)));
}
return (0, _element.createElement)(_element.Fragment, null, (0, _element.createElement)(_tooltip.default, {
text: describedBy ? describedBy : label,
shortcut: shortcut,
position: tooltipPosition
}, element), describedBy && (0, _element.createElement)(_visuallyHidden.default, null, (0, _element.createElement)("span", {
id: descriptionId
}, describedBy)));
}
var _default = (0, _element.forwardRef)(Button);
exports.default = _default;
//# sourceMappingURL=index.js.map