UNPKG

@mskcc/carbon-react

Version:

Carbon react components for the MSKCC DSM

155 lines (146 loc) 5.16 kB
/** * MSKCC 2021, 2024 */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.js'); var React = require('react'); var PropTypes = require('prop-types'); var cx = require('classnames'); var usePrefix = require('../../internal/usePrefix.js'); var Menu = require('../Menu/Menu.js'); var useAttachedMenu = require('../../internal/useAttachedMenu.js'); var useId = require('../../internal/useId.js'); var useMergedRefs = require('../../internal/useMergedRefs.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes); var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx); var _aside; const spacing = 4; // top and bottom spacing between the button and the menu. in px // const validButtonKinds = ['primary', 'tertiary', 'ghost']; // const defaultButtonKind = 'primary'; const MenuButton = /*#__PURE__*/React__default["default"].forwardRef(function MenuButton(_ref, forwardRef) { let { children, className, disabled, icon = '', label = '', size = 'lg', target, disableFocus = false, ...rest } = _ref; const id = useId.useId('MenuButton'); const prefix = usePrefix.usePrefix(); const triggerRef = React.useRef(null); const menuRef = React.useRef(null); const ref = useMergedRefs.useMergedRefs([forwardRef, triggerRef]); const [width, setWidth] = React.useState(0); const { open, x, y, handleClick: hookOnClick, handleMousedown, handleClose } = useAttachedMenu.useAttachedMenu(triggerRef); function handleClick() { if (triggerRef.current) { const { width: w } = triggerRef.current.getBoundingClientRect(); setWidth(w); hookOnClick(); } } function handleOpen() { menuRef.current.style.width = `${width}px`; } const triggerClasses = cx__default["default"](`${prefix}--btn ${prefix}--btn--ghost msk-menu-button`, { [`active`]: open }); const iconSizeClass = `msk-icon msk-menu-button-top-icon ${size}`.trim(); const parentClass = `msk-menu-button-container ${className ?? ''}`.trim(); const mobileIconClass = `msk-menu-button-mobile-icon ${open ? 'open' : ''}`.trim(); return /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({}, rest, { ref: ref, "aria-owns": open ? id : null, className: parentClass }), /*#__PURE__*/React__default["default"].createElement("button", { disabled: disabled, type: "button", className: triggerClasses, "aria-haspopup": true, "aria-expanded": open, onClick: handleClick, onMouseDown: handleMousedown, "aria-controls": open ? id : null }, /*#__PURE__*/React__default["default"].createElement("div", { className: 'msk-menu-button-content' }, /*#__PURE__*/React__default["default"].createElement("div", { className: "msk-menu-button-label-container" }, /*#__PURE__*/React__default["default"].createElement("span", { className: mobileIconClass }), /*#__PURE__*/React__default["default"].createElement("span", { className: iconSizeClass }, icon), label ? /*#__PURE__*/React__default["default"].createElement("span", { className: "msk-menu-button-label" }, label) : null), _aside || (_aside = /*#__PURE__*/React__default["default"].createElement("aside", { className: "msk-menu-button-expand" }, /*#__PURE__*/React__default["default"].createElement("span", { className: "msk-icon msk-menu-button-expand-icon" }, "arrow_drop_down"))))), /*#__PURE__*/React__default["default"].createElement(Menu.Menu, { target: target, ref: menuRef, id: id, label: label, size: size, open: open, onClose: handleClose, onOpen: handleOpen, x: x, y: [y[0] - spacing, y[1] + spacing], disableFocus: disableFocus }, children)); }); MenuButton.propTypes = { /** * A collection of MenuItems to be rendered as actions for this MenuButton. */ children: PropTypes__default["default"].node.isRequired, /** * Additional CSS class names. */ className: PropTypes__default["default"].string, /** * disable focus */ disableFocus: PropTypes__default["default"].bool, /** * Specify whether the MenuButton should be disabled, or not. */ disabled: PropTypes__default["default"].bool, /** * Specify the icon to render on top of the label. */ icon: PropTypes__default["default"].string, /** * Provide the label to be renderd on the trigger button. */ label: PropTypes__default["default"].node, /** * Provide a prefix, default is 'cds'. */ // prefix: PropTypes.string, /** * Specify the size of the button and menu. */ size: PropTypes__default["default"].oneOf(['md', 'lg']), /** * Specify a DOM node where the Menu should be rendered in. Defaults to document.body. */ target: PropTypes__default["default"].object }; exports.MenuButton = MenuButton;