import type { ReactNode } from 'react'; import React from 'react'; import type { AriaPopoverProps } from 'react-aria'; import type { MenuProps as CoreMenuProps, MenuTriggerProps as CoreMenuTriggerProps } from '@shoptet/ui-core-web'; import { Menu as CoreMenu } from '@shoptet/ui-core-web'; import type { Complete, Exact, SafePick } from '@shoptet/utils'; import { destruct } from '@shoptet/utils'; import { MenuContext } from './MenuContext'; import { MenuDivider } from './MenuDivider'; import { MenuItem } from './MenuItem'; import type { MenuListProps } from './MenuList'; import { MenuList } from './MenuList'; import { MenuSubmenu } from './MenuSubmenu'; export type { MenuItemProps } from './MenuItem'; export interface MenuInheritedCoreMenuProps extends SafePick< CoreMenuProps, 'open' | 'defaultOpen' | 'onOpenChange' | 'disabled' > {} export interface MenuProps extends MenuInheritedCoreMenuProps, MenuListProps { trigger: (args: Parameters[0]) => ReactNode; placement?: AriaPopoverProps['placement']; compact?: boolean; } export const Menu = Object.assign( function Menu({ trigger, placement, compact, ...rest }: MenuProps) { const [menuOpenProps, menuProps] = destruct(rest, ['open', 'defaultOpen', 'onOpenChange', 'disabled']); menuOpenProps satisfies Exact, typeof menuOpenProps>; menuProps satisfies Exact, typeof menuProps>; return ( {triggerArgs => trigger(triggerArgs)} ); }, { Item: MenuItem, Divider: MenuDivider, Submenu: MenuSubmenu, } );