UNPKG

@heroui/dropdown

Version:

A dropdown displays a list of actions or options that a user can choose.

235 lines (227 loc) 8.42 kB
"use client"; "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var index_exports = {}; __export(index_exports, { Dropdown: () => dropdown_default, DropdownItem: () => import_menu4.MenuItem, DropdownMenu: () => dropdown_menu_default, DropdownSection: () => import_menu4.MenuSection, DropdownTrigger: () => dropdown_trigger_default, useDropdown: () => useDropdown }); module.exports = __toCommonJS(index_exports); var import_menu4 = require("@heroui/menu"); // src/dropdown.tsx var import_react2 = __toESM(require("react")); var import_popover = require("@heroui/popover"); // src/dropdown-context.ts var import_react_utils = require("@heroui/react-utils"); var [DropdownProvider, useDropdownContext] = (0, import_react_utils.createContext)({ name: "DropdownContext", errorMessage: "useDropdownContext: `context` is undefined. Seems you forgot to wrap all popover components within `<Dropdown />`" }); // src/use-dropdown.ts var import_system = require("@heroui/system"); var import_menu = require("@react-stately/menu"); var import_menu2 = require("@react-aria/menu"); var import_theme = require("@heroui/theme"); var import_shared_utils = require("@heroui/shared-utils"); var import_react_utils2 = require("@heroui/react-utils"); var import_react = require("react"); var getMenuItem = (props, key) => { if (props) { const mergedChildren = Array.isArray(props.children) ? props.children : [...(props == null ? void 0 : props.items) || []]; if (mergedChildren && mergedChildren.length) { const item = mergedChildren.find((item2) => { if (item2 && item2.key === key) { return item2; } }) || {}; return item; } } return null; }; var getCloseOnSelect = (props, key, item) => { const mergedItem = item || getMenuItem(props, key); if (mergedItem && mergedItem.props && "closeOnSelect" in mergedItem.props) { return mergedItem.props.closeOnSelect; } return props == null ? void 0 : props.closeOnSelect; }; function useDropdown(props) { var _a; const globalContext = (0, import_system.useProviderContext)(); const { as, triggerRef: triggerRefProp, isOpen, defaultOpen, onOpenChange, isDisabled, type = "menu", trigger = "press", placement = "bottom", closeOnSelect = true, shouldBlockScroll = true, classNames: classNamesProp, disableAnimation = (_a = globalContext == null ? void 0 : globalContext.disableAnimation) != null ? _a : false, onClose, className, ...otherProps } = props; const Component = as || "div"; const triggerRef = (0, import_react.useRef)(null); const menuTriggerRef = triggerRefProp || triggerRef; const menuRef = (0, import_react.useRef)(null); const popoverRef = (0, import_react.useRef)(null); const state = (0, import_menu.useMenuTriggerState)({ trigger, isOpen, defaultOpen, onOpenChange: (isOpen2) => { onOpenChange == null ? void 0 : onOpenChange(isOpen2); if (!isOpen2) { onClose == null ? void 0 : onClose(); } } }); const { menuTriggerProps, menuProps } = (0, import_menu2.useMenuTrigger)( { type, trigger, isDisabled }, state, menuTriggerRef ); const styles = (0, import_react.useMemo)( () => (0, import_theme.dropdown)({ className }), [className] ); const onMenuAction = (menuCloseOnSelect) => { if (menuCloseOnSelect !== void 0 && !menuCloseOnSelect) { return; } if (closeOnSelect) { state.close(); } }; const getPopoverProps = (props2 = {}) => { const popoverProps = (0, import_shared_utils.mergeProps)(otherProps, props2); return { state, placement, ref: popoverRef, disableAnimation, shouldBlockScroll, scrollRef: menuRef, triggerRef: menuTriggerRef, ...popoverProps, classNames: { ...classNamesProp, ...props2.classNames, content: (0, import_shared_utils.clsx)(styles, classNamesProp == null ? void 0 : classNamesProp.content, props2.className) } }; }; const getMenuTriggerProps = (originalProps = {}) => { const { onPress, onPressStart, ...otherMenuTriggerProps } = menuTriggerProps; return (0, import_shared_utils.mergeProps)(otherMenuTriggerProps, { isDisabled }, originalProps); }; const getMenuProps = (props2, _ref = null) => { return { ref: (0, import_react_utils2.mergeRefs)(_ref, menuRef), menuProps, closeOnSelect, ...(0, import_shared_utils.mergeProps)(props2, { onAction: (key, item) => { const closeOnSelect2 = getCloseOnSelect(props2, key, item); onMenuAction(closeOnSelect2); }, onClose: state.close }) }; }; return { Component, menuRef, menuProps, closeOnSelect, onClose: state.close, autoFocus: state.focusStrategy || true, disableAnimation, getPopoverProps, getMenuProps, getMenuTriggerProps }; } // src/dropdown.tsx var import_jsx_runtime = require("react/jsx-runtime"); var Dropdown = (props) => { const { children, ...otherProps } = props; const context = useDropdown(otherProps); const [menuTrigger, menu] = import_react2.default.Children.toArray(children); return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DropdownProvider, { value: context, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_popover.Popover, { ...context.getPopoverProps(), children: [ menuTrigger, menu ] }) }); }; Dropdown.displayName = "HeroUI.Dropdown"; var dropdown_default = Dropdown; // src/dropdown-trigger.tsx var import_popover2 = require("@heroui/popover"); var import_jsx_runtime2 = require("react/jsx-runtime"); var DropdownTrigger = (props) => { const { getMenuTriggerProps } = useDropdownContext(); const { children, ...otherProps } = props; return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_popover2.PopoverTrigger, { ...getMenuTriggerProps(otherProps), children }); }; DropdownTrigger.displayName = "HeroUI.DropdownTrigger"; var dropdown_trigger_default = DropdownTrigger; // src/dropdown-menu.tsx var import_popover3 = require("@heroui/popover"); var import_focus = require("@react-aria/focus"); var import_system2 = require("@heroui/system"); var import_menu3 = require("@heroui/menu"); var import_jsx_runtime3 = require("react/jsx-runtime"); var DropdownMenu = (0, import_system2.forwardRef)(function DropdownMenu2(props, ref) { const { getMenuProps } = useDropdownContext(); return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_popover3.PopoverContent, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_focus.FocusScope, { contain: true, restoreFocus: true, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_menu3.Menu, { ...getMenuProps(props, ref) }) }) }); }); var dropdown_menu_default = DropdownMenu; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Dropdown, DropdownItem, DropdownMenu, DropdownSection, DropdownTrigger, useDropdown });