UNPKG

@react-md/menu

Version:

Create menus that auto-position themselves within the viewport and adhere to the accessibility guidelines

166 lines 8.25 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DropdownMenuItem = void 0; var react_1 = __importStar(require("react")); var icon_1 = require("@react-md/icon"); var utils_1 = require("@react-md/utils"); var defaultMenuItemRenderer_1 = require("./defaultMenuItemRenderer"); var defaultMenuRenderer_1 = require("./defaultMenuRenderer"); var MenuItem_1 = require("./MenuItem"); var useItemVisibility_1 = require("./useItemVisibility"); /** * The `DropdownMenuItem` component is used to be able to render nested dropdown menus. */ exports.DropdownMenuItem = react_1.forwardRef(function DropdownMenuItem(_a, ref) { var propOnClick = _a.onClick, propOnKeyDown = _a.onKeyDown, children = _a.children, propAnchor = _a.anchor, menuLabel = _a.menuLabel, menuLabelledBy = _a.menuLabelledBy, _b = _a.menuRenderer, menuRenderer = _b === void 0 ? defaultMenuRenderer_1.defaultMenuRenderer : _b, items = _a.items, _c = _a.itemRenderer, itemRenderer = _c === void 0 ? defaultMenuItemRenderer_1.defaultMenuItemRenderer : _c, horizontal = _a.horizontal, onVisibilityChange = _a.onVisibilityChange, _d = _a.portal, portal = _d === void 0 ? true : _d, portalInto = _a.portalInto, portalIntoId = _a.portalIntoId, positionOptions = _a.positionOptions, propRightAddon = _a.rightAddon, propDropdownIcon = _a.dropdownIcon, _e = _a.closeOnScroll, closeOnScroll = _e === void 0 ? false : _e, _f = _a.closeOnResize, closeOnResize = _f === void 0 ? false : _f, _g = _a.disableEscapeCascade, disableEscapeCascade = _g === void 0 ? false : _g, _h = _a.disableDropdownIcon, disableDropdownIcon = _h === void 0 ? false : _h, props = __rest(_a, ["onClick", "onKeyDown", "children", "anchor", "menuLabel", "menuLabelledBy", "menuRenderer", "items", "itemRenderer", "horizontal", "onVisibilityChange", "portal", "portalInto", "portalIntoId", "positionOptions", "rightAddon", "dropdownIcon", "closeOnScroll", "closeOnResize", "disableEscapeCascade", "disableDropdownIcon"]); var id = props.id; var dropdownIcon = icon_1.useIcon("forward", propDropdownIcon); var _j = useItemVisibility_1.useItemVisibility({ onClick: propOnClick, onKeyDown: propOnKeyDown, onVisibilityChange: onVisibilityChange, }), visible = _j.visible, hide = _j.hide, onClick = _j.onClick, onKeyDown = _j.onKeyDown, defaultFocus = _j.defaultFocus; var labelledBy = menuLabelledBy; if (!menuLabel && !menuLabelledBy) { labelledBy = id; } var rightAddon = propRightAddon; if (!disableDropdownIcon && dropdownIcon && !rightAddon) { rightAddon = react_1.default.createElement(icon_1.IconRotator, { rotated: visible }, dropdownIcon); } var anchor = propAnchor; if (!anchor) { anchor = horizontal ? utils_1.BELOW_INNER_RIGHT_ANCHOR : utils_1.TOP_RIGHT_ANCHOR; } return (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(MenuItem_1.MenuItem, __assign({}, props, { ref: ref, "aria-haspopup": "menu", "aria-expanded": visible ? "true" : undefined, role: "button", onClick: onClick, onKeyDown: onKeyDown, rightAddon: rightAddon }), children), menuRenderer({ "aria-label": menuLabel, // ok to typecast since one of these two should be a string by this // line "aria-labelledby": labelledBy, id: id + "-menu", controlId: id, anchor: anchor, positionOptions: positionOptions, closeOnScroll: closeOnScroll, closeOnResize: closeOnResize, horizontal: horizontal, visible: visible, defaultFocus: defaultFocus, onRequestClose: hide, children: items.map(function (item, i) { return itemRenderer(item, "item-" + i); }), portal: portal, portalInto: portalInto, portalIntoId: portalIntoId, onKeyDown: function (event) { if (event.key !== "Escape" || disableEscapeCascade) { // don't want parent keydown listeners to be triggered as well event.stopPropagation(); } if (!horizontal && event.key === "ArrowLeft") { hide(); } }, }, items))); }); if (process.env.NODE_ENV !== "production") { try { var PropTypes = require("prop-types"); exports.DropdownMenuItem.propTypes = { id: PropTypes.string.isRequired, className: PropTypes.string, portal: PropTypes.bool, portalInto: PropTypes.oneOfType([ PropTypes.string, PropTypes.func, PropTypes.object, ]), portalIntoId: PropTypes.string, onClick: PropTypes.func, onKeyDown: PropTypes.func, children: PropTypes.node, anchor: PropTypes.shape({ x: PropTypes.oneOf([ "left", "right", "center", "inner-left", "inner-right", ]).isRequired, y: PropTypes.oneOf(["above", "below", "center", "top", "bottom"]) .isRequired, }), items: PropTypes.arrayOf(PropTypes.oneOfType([ PropTypes.string, PropTypes.number, PropTypes.node, PropTypes.object, ])).isRequired, menuLabel: PropTypes.string, menuLabelledBy: PropTypes.string, menuRenderer: PropTypes.func, itemRenderer: PropTypes.func, dropdownIcon: PropTypes.node, horizontal: PropTypes.bool, positionOptions: PropTypes.shape({ vwMargin: PropTypes.number, vhMargin: PropTypes.number, xMargin: PropTypes.number, yMargin: PropTypes.number, initialX: PropTypes.number, initialY: PropTypes.number, disableSwapping: PropTypes.bool, }), rightAddon: PropTypes.node, onVisibilityChange: PropTypes.func, disableDropdownIcon: PropTypes.bool, disableEscapeCascade: PropTypes.bool, closeOnScroll: PropTypes.bool, closeOnResize: PropTypes.bool, }; } catch (e) { } } //# sourceMappingURL=DropdownMenuItem.js.map