@wordpress/components
Version:
UI components for WordPress.
8 lines (7 loc) • 10.2 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../src/dropdown-menu/index.tsx"],
"sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { menu } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport { contextConnectWithoutRef, useContextSystem } from '../context';\nimport Button from '../button';\nimport Dropdown from '../dropdown';\nimport { NavigableMenu } from '../navigable-container';\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction mergeProps(defaultProps = {}, props = {}) {\n const mergedProps = {\n ...defaultProps,\n ...props\n };\n if (props.className && defaultProps.className) {\n mergedProps.className = clsx(props.className, defaultProps.className);\n }\n return mergedProps;\n}\nfunction isFunction(maybeFunc) {\n return typeof maybeFunc === 'function';\n}\nfunction UnconnectedDropdownMenu(dropdownMenuProps) {\n const {\n children,\n className,\n controls,\n icon = menu,\n label,\n popoverProps,\n toggleProps,\n menuProps,\n disableOpenOnArrowDown = false,\n text,\n noIcons,\n open,\n defaultOpen,\n onToggle: onToggleProp,\n // Context\n variant\n } = useContextSystem(dropdownMenuProps, 'DropdownMenu');\n if (!controls?.length && !isFunction(children)) {\n return null;\n }\n\n // Normalize controls to nested array of objects (sets of controls)\n let controlSets;\n if (controls?.length) {\n // @ts-expect-error The check below is needed because `DropdownMenus`\n // rendered by `ToolBarGroup` receive controls as a nested array.\n controlSets = controls;\n if (!Array.isArray(controlSets[0])) {\n // This is not ideal, but at this point we know that `controls` is\n // not a nested array, even if TypeScript doesn't.\n controlSets = [controls];\n }\n }\n const mergedPopoverProps = mergeProps({\n className: 'components-dropdown-menu__popover',\n variant\n }, popoverProps);\n return /*#__PURE__*/_jsx(Dropdown, {\n className: className,\n popoverProps: mergedPopoverProps,\n renderToggle: ({\n isOpen,\n onToggle\n }) => {\n const openOnArrowDown = event => {\n if (disableOpenOnArrowDown) {\n return;\n }\n if (!isOpen && event.code === 'ArrowDown') {\n event.preventDefault();\n onToggle();\n }\n };\n const {\n as: Toggle = Button,\n ...restToggleProps\n } = toggleProps ?? {};\n const mergedToggleProps = mergeProps({\n className: clsx('components-dropdown-menu__toggle', {\n 'is-opened': isOpen\n })\n }, restToggleProps);\n return /*#__PURE__*/_jsx(Toggle, {\n ...mergedToggleProps,\n icon: icon,\n onClick: event => {\n onToggle();\n if (mergedToggleProps.onClick) {\n mergedToggleProps.onClick(event);\n }\n },\n onKeyDown: event => {\n openOnArrowDown(event);\n if (mergedToggleProps.onKeyDown) {\n mergedToggleProps.onKeyDown(event);\n }\n },\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isOpen,\n label: label,\n text: text,\n showTooltip: toggleProps?.showTooltip ?? true,\n children: mergedToggleProps.children\n });\n },\n renderContent: props => {\n const mergedMenuProps = mergeProps({\n 'aria-label': label,\n className: clsx('components-dropdown-menu__menu', {\n 'no-icons': noIcons\n })\n }, menuProps);\n return /*#__PURE__*/_jsxs(NavigableMenu, {\n ...mergedMenuProps,\n role: \"menu\",\n children: [isFunction(children) ? children(props) : null, controlSets?.flatMap((controlSet, indexOfSet) => controlSet.map((control, indexOfControl) => /*#__PURE__*/_jsx(Button, {\n size: \"compact\",\n onClick: event => {\n event.stopPropagation();\n props.onClose();\n if (control.onClick) {\n control.onClick();\n }\n },\n className: clsx('components-dropdown-menu__menu-item', {\n 'has-separator': indexOfSet > 0 && indexOfControl === 0,\n 'is-active': control.isActive,\n 'is-icon-only': !control.title\n }),\n icon: control.icon,\n label: control.label,\n \"aria-checked\": control.role === 'menuitemcheckbox' || control.role === 'menuitemradio' ? control.isActive : undefined,\n role: control.role === 'menuitemcheckbox' || control.role === 'menuitemradio' ? control.role : 'menuitem',\n accessibleWhenDisabled: true,\n disabled: control.isDisabled,\n children: control.title\n }, [indexOfSet, indexOfControl].join())))]\n });\n },\n open: open,\n defaultOpen: defaultOpen,\n onToggle: onToggleProp\n });\n}\n\n/**\n *\n * The DropdownMenu displays a list of actions (each contained in a MenuItem,\n * MenuItemsChoice, or MenuGroup) in a compact way. It appears in a Popover\n * after the user has interacted with an element (a button or icon) or when\n * they perform a specific action.\n *\n * Render a Dropdown Menu with a set of controls:\n *\n * ```jsx\n * import { DropdownMenu } from '@wordpress/components';\n * import {\n * \tmore,\n * \tarrowLeft,\n * \tarrowRight,\n * \tarrowUp,\n * \tarrowDown,\n * } from '@wordpress/icons';\n *\n * const MyDropdownMenu = () => (\n * \t<DropdownMenu\n * \t\ticon={ more }\n * \t\tlabel=\"Select a direction\"\n * \t\tcontrols={ [\n * \t\t\t{\n * \t\t\t\ttitle: 'Up',\n * \t\t\t\ticon: arrowUp,\n * \t\t\t\tonClick: () => console.log( 'up' ),\n * \t\t\t},\n * \t\t\t{\n * \t\t\t\ttitle: 'Right',\n * \t\t\t\ticon: arrowRight,\n * \t\t\t\tonClick: () => console.log( 'right' ),\n * \t\t\t},\n * \t\t\t{\n * \t\t\t\ttitle: 'Down',\n * \t\t\t\ticon: arrowDown,\n * \t\t\t\tonClick: () => console.log( 'down' ),\n * \t\t\t},\n * \t\t\t{\n * \t\t\t\ttitle: 'Left',\n * \t\t\t\ticon: arrowLeft,\n * \t\t\t\tonClick: () => console.log( 'left' ),\n * \t\t\t},\n * \t\t] }\n * \t/>\n * );\n * ```\n *\n * Alternatively, specify a `children` function which returns elements valid for\n * use in a DropdownMenu: `MenuItem`, `MenuItemsChoice`, or `MenuGroup`.\n *\n * ```jsx\n * import { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components';\n * import { more, arrowUp, arrowDown, trash } from '@wordpress/icons';\n *\n * const MyDropdownMenu = () => (\n * \t<DropdownMenu icon={ more } label=\"Select a direction\">\n * \t\t{ ( { onClose } ) => (\n * \t\t\t<>\n * \t\t\t\t<MenuGroup>\n * \t\t\t\t\t<MenuItem icon={ arrowUp } onClick={ onClose }>\n * \t\t\t\t\t\tMove Up\n * \t\t\t\t\t</MenuItem>\n * \t\t\t\t\t<MenuItem icon={ arrowDown } onClick={ onClose }>\n * \t\t\t\t\t\tMove Down\n * \t\t\t\t\t</MenuItem>\n * \t\t\t\t</MenuGroup>\n * \t\t\t\t<MenuGroup>\n * \t\t\t\t\t<MenuItem icon={ trash } onClick={ onClose }>\n * \t\t\t\t\t\tRemove\n * \t\t\t\t\t</MenuItem>\n * \t\t\t\t</MenuGroup>\n * \t\t\t</>\n * \t\t) }\n * \t</DropdownMenu>\n * );\n * ```\n *\n */\nexport const DropdownMenu = contextConnectWithoutRef(UnconnectedDropdownMenu, 'DropdownMenu');\nexport default DropdownMenu;"],
"mappings": "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",
"names": ["clsx", "_jsx", "Dropdown", "Button", "_jsxs"]
}