UNPKG

@wordpress/components

Version:
152 lines (128 loc) 4.42 kB
"use strict"; 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